Giter Site home page Giter Site logo

python-websocket-server's Introduction

Websocket Server

CircleCI PyPI version

A minimal Websockets Server in Python with no external dependencies.

  • Python3.6+
  • Clean simple API
  • Multiple clients
  • No dependencies

Notice this project is focused mainly on making it easy to run a websocket server for prototyping, testing or for making a GUI for your application. Thus not all possible features of Websockets are supported.

Installation

Install with pip

pip install websocket-server

For coding details have a look at the server.py example and the API.

Usage

You can get a feel of how to use the websocket server by running

python server.py

Then just open client.html in your browser and you should be able to send and receive messages.

Testing

Run all tests

pytest

API

The API is simply methods and properties of the WebsocketServer class.

WebsocketServer

The WebsocketServer can be initialized with the below parameters.

port - The port clients will need to connect to.

host - By default the 127.0.0.1 is used which allows connections only from the current machine. If you wish to allow all network machines to connect, you need to pass 0.0.0.0 as hostname.

loglevel - logging level to print. By default WARNING is used. You can use logging.DEBUG or logging.INFO for more verbose output.

key - If using SSL, this is the path to the key.

cert - If using SSL, this is the path to the certificate.

Properties

Property Description
clients A list of client

Methods

Method Description Takes Gives
run_forever() Runs server until shutdown_gracefully or shutdown_abruptly are called. threaded: run server on its own thread if True None
set_fn_new_client() Sets a callback function that will be called for every new client connecting to us function None
set_fn_client_left() Sets a callback function that will be called for every client disconnecting from us function None
set_fn_message_received() Sets a callback function that will be called when a client sends a message function None
send_message() Sends a message to a specific client. The message is a simple string. client, message None
send_message_to_all() Sends a message to all connected clients. The message is a simple string. message None
disconnect_clients_gracefully() Disconnect all connected clients by sending a websocket CLOSE handshake. Optional: status, reason None
disconnect_clients_abruptly() Disconnect all connected clients. Clients won't be aware until they try to send some data. None None
shutdown_gracefully() Disconnect clients with a CLOSE handshake and shutdown server. Optional: status, reason None
shutdown_abruptly() Disconnect clients and shutdown server with no handshake. None None
deny_new_connections() Close connection for new clients. Optional: status, reason None
allow_new_connections() Allows back connection for new clients. None

Callback functions

Set by Description Parameters
set_fn_new_client() Called for every new client connecting to us client, server
set_fn_client_left() Called for every client disconnecting from us client, server
set_fn_message_received() Called when a client sends a message client, server, message

The client passed to the callback is the client that left, sent the message, etc. The server might not have any use to use. However it is passed in case you want to send messages to clients.

Example:

import logging
from websocket_server import WebsocketServer

def new_client(client, server):
	server.send_message_to_all("Hey all, a new client has joined us")

server = WebsocketServer(host='127.0.0.1', port=13254, loglevel=logging.INFO)
server.set_fn_new_client(new_client)
server.run_forever()

Example (SSL):

import logging
from websocket_server import WebsocketServer

def new_client(client, server):
	server.send_message_to_all("Hey all, a new client has joined us")

server = WebsocketServer(host='127.0.0.1', port=13254, loglevel=logging.INFO, key="key.pem", cert="cert.pem")
server.set_fn_new_client(new_client)
server.run_forever()

Client

Client is just a dictionary passed along methods.

{
	'id'      : client_id,
	'handler' : client_handler,
	'address' : (addr, port)
}

python-websocket-server's People

Contributors

aehernandez avatar brejoc avatar charlielito avatar eado avatar ha-d avatar lothiraldan avatar murongpig avatar nlohmann avatar ogayot avatar orangetw avatar pithikos avatar playay avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

python-websocket-server's Issues

Credentials need

Hi for me while installing the WebSocket server on mac it is asking for your github credentials of Pithikos.

Threaded serve_forever

Is there a way to run serve_forever asynchronously on its own thread. I am working on a Pi project that is utilizing websockets to easily stream sensor data to a web page. I am running into an issue with the serve_forever() function because it blocks everything else. Is there an easy way to thread it off to allow everything else to continue running?

Originally I had something along the lines of

def run():
    server.run_forever()
    # This code is never executed b/c server.run_forever
    while True:
        # Read photocell data
        light_level = readChannel(photocell)
        light_volts = convertVolts(light_level, 2)

I then tried something like this

def run():
    threading.Thread(target=server.run_forever()).start()
    # This still seems to block the thread...until  I hit 'Ctrl + C' which then appears
    # to allow code to continue executing and the socket server stays connected...
    while True:
        # Read photocell data
        light_level = readChannel(photocell)
        light_volts = convertVolts(light_level, 2)

Its weird that the threaded version allows me to hit Ctrl+C and the socket server appears to continue running and communicating with my webpage while letting my while statement run.

Is there a 'proper' way to thread this socket server that doesnt require me to hit Ctrl+C to allow code to continue?

need more than 0 values to unpack

valueError: need more than 0 values to unpack happens When client disconnected.
I found that the reason is:

	def read_bytes(self, num):
		bytes = self.rfile.read(num)  #in python2.7 bytes get '' (empty string)
		if (sys.version_info[0] < 3):
			return map(ord, bytes) #ValueError when bytes is empty 

No licence information

@Pithikos I can't find any licence information about this project. Until provide a licence I would have to assume "all rights reserved" applies here. ;)

But you mentioned, that your server should be embeddable in other projects, so I would suggest an Apache, MIT or BSD style licence.

Btw, very nice, minimal and clean implementation!

ValueError on Python 3.5.0 on every received message.

Got:

  File "...\lib\site-packages\websocket_server\websocket_server.py", line 161, in read_next_message
    b1, b2 = self.read_bytes(2)
ValueError: not enough values to unpack (expected 2, got 0)

every time when message was received.

Missing main information in documentation : defaut host address is 127.0.0.1

Hello,
Main page documentation forgets a main information : default host address filter is 127.0.0.1.
Then, trying to use your powerfull webSocketServer between my PC and a RaspBerry Pi, i need to look in code to understand that defaut host filter was 127.0.0.1, so from local development.
I think it will be very helpfull to complete your main page with this information, and to give a small information about this parameter for other configuration :
self._server = WebsocketServer(self._iPort, "127.0.0.1")
or
self._server = WebsocketServer(self._iPort, "")

Best regards.

Client closed connection why !!!

hi ,
use this code at client side

timer = setInterval(
    function() {

        ctx.drawImage(video, 0, 0, video.videoWidth  , video.videoHeight );
        var data = canvas.get()[0].toDataURL('image/png', 1.0);
        // newblob = dataURItoBlob(data);
        // console.log(data);
        ws.send(data);
    }, 3850);

the thing is after the first msg it says :

Client closed connection.
Client (1) left

why ? and when i change the time 3850 to something lower like 250 . it last longer ! I SEND IMAGES

hope there is away i can make server sync with client or write method at client side js to let the server know that client alive ?? don''t know .. im still beginner in websocket this is my first time using it

Server crashed when connection lost

I write simple client for android on java. Inside applet web-client based on client.html from your source.
When i clossed applet, server crashed with error:

Listening on port 9000 for clients..
New client connected and was given id 1 Client(1) disconnected ---------------------------------------- Exception happened during processing of request from ('127.0.0.1', 58142) Traceback (most recent call last): File "/data/user/0/ru.iiec.pydroid/files/arm-linux-androideabi/lib/python2.7/SocketServer.py", line 596, in process_request_thread self.finish_request(request, client_address) File "/data/user/0/ru.iiec.pydroid/files/arm-linux-androideabi/lib/python2.7/SocketServer.py", line 331, in finish_request self.RequestHandlerClass(request, client_address, self) File "/data/user/0/ru.iiec.pydroid/files/arm-linux-androideabi/lib/python2.7/site-packages/websocket_server/websocket_server.py", line 136, in init StreamRequestHandler.init(self, socket, addr, server) File "/data/user/0/ru.iiec.pydroid/files/arm-linux-androideabi/lib/python2.7/SocketServer.py", line 652, in init
self.handle()
File "/data/user/0/ru.iiec.pydroid/files/arm-linux-androideabi/lib/python2.7/site-packages/websocket_server/websocket_server.py", line 149, in handle
self.read_next_message()
File "/data/user/0/ru.iiec.pydroid/files/arm-linux-androideabi/lib/python2.7/site-packages/websocket_server/websocket_server.py", line 161, in read_next_message
b1, b2 = self.read_bytes(2)
ValueError: need more than 0 values to unpack

Chinese support

Hello, I found that the library does not support Chinese in use. I can't receive it correctly when receiving Chinese. In the read_next_message(self) function, str() should be used instead of chr() when decoding.

decoded = bytearray() for char in self.read_bytes(payload_length): char ^= masks[len(decoded) % 4] decoded.append(char) decoded = str(decoded, encoding="utf-8") self.server._message_received_(self, decoded)

Connection Timeout

Hey, is it possible to add a timeout for connections who doesn't send a message in a specified range of time.
For example, if a client doesn't send a message in maybe 30 minutes, kick the client.

Installation instructions in README incorrect

Installation instructions state to use:

pip install git://github.com/Pithikos/python-websocket-server

pip requires a slightly different format:

pip install git+https://github.com/Pithikos/python-websocket-server

Non utf8 issues

Traceback (most recent call last): File "c:\python27\lib\SocketServer.py", line 596, in process_request_thread self.finish_request(request, client_address) File "c:\python27\lib\SocketServer.py", line 331, in finish_request self.RequestHandlerClass(request, client_address, self) File "c:\python27\lib\site-packages\websocket_server\websocket_server.py", line 136, in __init__ StreamRequestHandler.__init__(self, socket, addr, server) File "c:\python27\lib\SocketServer.py", line 652, in __init__ self.handle() File "c:\python27\lib\site-packages\websocket_server\websocket_server.py", line 147, in handle self.handshake() File "c:\python27\lib\site-packages\websocket_server\websocket_server.py", line 243, in handshake message = self.request.recv(1024).decode().strip() UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 4: ordinal not in range(128)
How resolve this?

Sending to a specific client

I noticed that you have instructions to send to a specific client, but when I print our the value of "client", I just get back the current user's information. If I have to use "client" when I use send_message(), how do I actually specify the client ID?

I have to use: send_message(client, "message here.)

If I change "client" to "client['id']" or something, it won't work. How do you actually specify which use it should go to?

How do I set url ?

Hi is it possible to run ws with url like : ws://localhost:8085/some-url ?

Several Websocket servers (in the same process)

In WebsocketServer class, the clients attribute is defined at the class level, not as an instance attribute. Is there any good reason for this design?

This means that when you use several WebsocketServer (on different ports) and use the send_message_to_all method on a server instance, the message is sent to all clients, including the clients that connected to another server !

The fix is trivial and I can make a Pull Request if this could be changed.

Thanks for this very useful lib BTW ! 😄

Opcode checking needed

After the report from duskCoder it became apparent that no opcode checking is implemented atm. This can be problematic since the user doesn't get any information on PING/PONG for example.

OPCODE checking needs to be implemented in message_received() and an appropriate warning needs to be outputted to the user in case of an unknown or unsupported OPCODE.

Gettings tons of error messages

Hi, I am using it on a Pi Zero W with the latest Stretch/Kernel versions. Everything was fine a year ago and now I am getting these error messages. Any idea where they come from and how to fix them?

Exception happened during processing of request from ('10.0.1.27', 58305)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 596, in process_request_thread
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 331, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/home/pi/python-websocket-server-master/websocket_server/websocket_server.py", line 167, in init
StreamRequestHandler.init(self, socket, addr, server)
File "/usr/lib/python2.7/SocketServer.py", line 654, in init
self.finish()
File "/home/pi/python-websocket-server-master/websocket_server/websocket_server.py", line 328, in finish
self.server.client_left(self)
File "/home/pi/python-websocket-server-master/websocket_server/websocket_server.py", line 146, in client_left
self.client_left(client, self)
File "server.py", line 11, in client_left
print("Client(%d) disconnected" % client['id'])
TypeError: 'NoneType' object has no attribute 'getitem'


Exception happened during processing of request from ('10.0.1.27', 58308)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 596, in process_request_thread
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 331, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/home/pi/python-websocket-server-master/websocket_server/websocket_server.py", line 167, in init
StreamRequestHandler.init(self, socket, addr, server)
File "/usr/lib/python2.7/SocketServer.py", line 654, in init
self.finish()
File "/home/pi/python-websocket-server-master/websocket_server/websocket_server.py", line 328, in finish
self.server.client_left(self)
File "/home/pi/python-websocket-server-master/websocket_server/websocket_server.py", line 146, in client_left
self.client_left(client, self)
File "server.py", line 11, in client_left
print("Client(%d) disconnected" % client['id'])
TypeError: 'NoneType' object has no attribute 'getitem'


Exception happened during processing of request from ('10.0.1.27', 58313)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 596, in process_request_thread
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 331, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/home/pi/python-websocket-server-master/websocket_server/websocket_server.py", line 167, in init
StreamRequestHandler.init(self, socket, addr, server)
File "/usr/lib/python2.7/SocketServer.py", line 654, in init
self.finish()
File "/home/pi/python-websocket-server-master/websocket_server/websocket_server.py", line 328, in finish
self.server.client_left(self)
File "/home/pi/python-websocket-server-master/websocket_server/websocket_server.py", line 146, in client_left
self.client_left(client, self)
File "server.py", line 11, in client_left
print("Client(%d) disconnected" % client['id'])
TypeError: 'NoneType' object has no attribute 'getitem'

UnicodeDecodeError

message = self.request.recv(1024).decode().strip()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa7 in position 4: invalid start byte

Support channels?

Hello,

I testing this proyect, I was wondering if:

can I define canals to transmite a message?

Is this possble?

e.g.:
"ws://localhost:port/Channel1"
"ws://localhost:port/Channel2"

So, with this configuration I could connect as a Client with this topic, for example to the "Channel1", and transmit news, and then I could to connect to the topic "Channel2", and transmit errors.

Thanks for all!

Error handling

There's a problem when it comes to errors (any errors / exceptions).

If there's an error/exception like: "Exception happened during processing of request from .."

and i reconnect the clients they do open the connection but it closes immediately saying this:
error: [Errno 9] Bad file descriptor

So, what's exactly the solution for this since the Exceptions are being handled in the library and not the user's custom code?

Thanks in advance

PS: I know what causes the error, i got it fixed, but if anything goes wrong i'd like a service like supervisor to restart the server

Received UTF-8 text is messed up

from websocket_server import WebsocketServer

server = WebsocketServer(13254, host='127.0.0.1')
def received(self, client, msg):
	print("how they look like:",msg)
server.message_received = received

print('how they should look like: äüö')

server.run_forever()
<meta charset="utf8">
<script>
var ws = new WebSocket("ws://localhost:13254/socketserver");
ws.onopen = function(){
	console.log('connected to server')
	ws.send('äüö')
}
</script>

To reproduce the issue run the python code and open the HTML file in a browser. You will get this output:

how they should look like: äüö
how they look like: äüö

I am using Python 3.5.2.

Service Actions

Novice programmer here, sorry if it's a dumb question! I noticed that Websocket_server.service_actions() is looped over, so figure that I can use this as my loop to run a schedule or whatever else is needed.

The game I am creating requires a way to be checking things on a regular basis and then call whatever function is necessary to make things happen in the game.

Is there a way to use service_actions this way? I noticed that this loops over and over but the problem arises in that this method is inside the websocket code. The game code, in one way or another, imports the websocket into itself when the game starts so that I can access the Server.send_message or other functions. If I try to import any game files into the websocket, it obviously hits an infinite loop.

Is there something built-in to mediate this? I guess in other words... how do you get a game loop working between this websocket library and the game code?

additional piece of function in server side

Hi, first of all sorry for my English.

I've started use this library and it's great, works easy as text 2 way communication between frontend and backend. But unfortunately when I'm trying to add some other function in the server side I have no any luck to get both part of working. Only one part is working or my looping code or websocket event listeners.

My goal is create the GUI for Raspbery PI I2C and I decide to write the GUI on HTML5 + JavaScript + Python with WebSockets. I'm new in Python and WebSockets, before I've used AJAX requests, but working hard to reach my target.
I'm experienced PHP OOP programmer but don't want to mix a lot of languages in one project.

Ok here is my code wich I wont to implement.

`#!/usr/bin/env python

from websocket_server import WebsocketServer

import sys
import psutil
import time
import requests

url = 'https://getdatafromremote'
post_fields = {'foo':'bar'}
postProc = False
postDelay = 10

if not (psutil.LINUX or psutil.OSX or psutil.WINDOWS):
sys.exit("platform not supported")

def main():
while True:
print postProc
if postProc:
r = requests.post(url,data=post_fields)
print(r.text)
.......................
time.sleep(postDelay)

def new_client(client, server):
print("New client connected and was given id %d" % client['id'])
postProc = True

def client_left(client, server):
postProc = False
print("Client(%d) disconnected" % client['id'])

def message_received(client, server, message):
if len(message) > 200:
message = message[:200]+'..'
print("Client(%d) said: %s" % (client['id'], message))
server.send_message(client, message)

def message_send(client, message):
print("Sercer said: %s" % (client['id'],client, message))

if name == 'main':

##sys.exit(main())

server = WebsocketServer(9010)
server.set_fn_new_client(new_client)
server.set_fn_client_left(client_left)
server.set_fn_message_received(message_received)
server.run_forever()`

Please, could you help me to get the right way to get my target.

Support for endpoint in the GET request

Hello,
I wanted to add the functionality of supporting an endpoint and assign that as an id to the socket connection, so I made the following changes to your code:

Change in WebSocketHandler class:

def read_http_headers(self):
        headers = {}
        # first line should be HTTP GET
        http_get = self.rfile.readline().decode().strip()
        # Next three lines will get your end_point
        global with_end_point
        if re.search('\/([A-Za-z0-9]+)', http_get).group(1):
            with_end_point = re.search('\/([A-Za-z0-9]+)', http_get).group(1)
        assert http_get.upper().startswith('GET')
        # remaining should be headers
        while True:
            header = self.rfile.readline().decode().strip()
            if not header:
                break
            head, value = header.split(':', 1)
            headers[head.lower().strip()] = value.strip()
        return headers

Change in WebsocketServer class:

def _new_client_(self, handler):
        self.id_counter += 1
        # This if-else block will check if you have provided an end_point and if you have, it assigns that    
        # endpoint as the 'Id' of the socket connection, otherwise it will assign a number as 'Id'
        if with_end_point:
            client = {
                'id': with_end_point,
                'handler': handler,
                'address': handler.client_address
            }
        else:
            client = {
                'id': self.id_counter,
                'handler': handler,
                'address': handler.client_address
            }
        self.clients.append(client)
        self.new_client(client, self)

I would like to ask, is this the correct way of doing it, and if it is, can I send a pull request?

Server address

I can see that server is initiated listening on port 127.0.0.1.. that would be inconvenient if we want to connect using a client on another IP of the network. Better to use address ANY (0.0.0.0) to listen on all network interfaces

KeyError: 'upgrade'

Sometimes getting a weird error. Not sure on what action exactly...

2018-08-24 10:13:03,075 DEBUG webserver client left: None

Exception happened during processing of request from ('122.228.10.51', 26823)
Traceback (most recent call last):
File "/usr/lib64/python3.6/socketserver.py", line 639, in process_request_thread
self.finish_request(request, client_address)
File "/usr/lib64/python3.6/socketserver.py", line 361, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/home/ec2-user/libraries/websocket_server.py", line 166, in init
StreamRequestHandler.init(self, socket, addr, server)
File "/usr/lib64/python3.6/socketserver.py", line 696, in init
self.handle()
File "/home/ec2-user/libraries/websocket_server.py", line 177, in handle
self.handshake()
File "/home/ec2-user/libraries/websocket_server.py", line 319, in handshake
assert headers['upgrade'].lower() == 'websocket'
KeyError: 'upgrade'

Support wss

Hey
I understand this lib at the moment doesn't support SSL but if we have to add the secure websocket, what can we do?

clients often lose connections

client is JavaScript, when the client sends "open camera", the server uses CV2(opencv-python) to open the camera and push each frame to the client.(I've converted the image to a Base64 string and assigned the src attribute of html Img'.)

But in the process of communication, the client often disconnects actively. According to my observation, there is no regularity in this anomaly , but the browser's console printed out an error

Google Chrome (version 71) -> failed: invalid frame header
Google Chrome (version 68) -> failed: could not decode a text frame as utf8

@Pithikos Please help me , how can I sort out this problem? It's really a disgusting question.

binary frame not supported?

Hi, all,

I'm trying to use this library in my project. In fact, I'm trying to replace websockets module which uses asyncio.

However, one immediate issue I'm facing is that it complains about "binary frame not supported". Is it easy to add binary frame support?

Thanks.

Handle ping/pong frames.

I am having some issues with certain browsers (mainly on embedded devices) that send ping (opcode 0x09) and/or pong (opcode 0x0A) frames without being solicited.

With the current implementation, those frames are handled like any text message (opcode 0x01) and there is no way to differenciate them from actual messages. The only workaround I found is to check if the payload of the frame matches a specific text (e.g. "PING"). IMHO the solution is rather unclean.

I am thinking of two ways to deal with the issue:

  • either make the server automatically send a pong frame whenever it receives a ping frame and not call the callback message_received()
  • add another callback which is called when a ping frame is received and let the user deal with it.

I can probably help with the code if needed.

Thank you by advance for reading :)

Binary support

I'm trying to combine this websocket server with matplotlib's webagg
so that I can make a web GUI for plots.
It seems that webagg sends bytes instead of string.
However, as far as I saw in the code, the handler tries to decode the bytes and only sends strings.
How can I send bytes using this websocket server?

Getting URL query parameters on connection opened?

How can I retrieve URL query parameters in the on_connect method?

For example:

I have a client which connects using the following url: ws://localhost:5000?identification=web-client

How can I retrieve the identification parameter in the on_connect?

Multiple function handlers

Current implementation stores singular function handles to event listeners. What about a list instead? Methods might need to be renamed ("add_fn_"; "sub_fn_"...?), but existing "set_fn_" behavior could replace with single-entry list to maintain backwards-compatibility.

unicode undefined

I love your websocket server, and I'm using it as my GUI server.
Maybe it's not a big problem, but as I learn the code in spyder this morning,
in send_text(),
elif isinstance(message, str) or isinstance(message, unicode):
spyder said that "unicode" is undefined.
By the way, I'm using python 3.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.