Bringing WebSockets, Http/Https High Performance servers for PyPy3 and Python3
Project description
socketify.py
💡 Features
- WebSocket with pub/sub support
- Fast and reliable Http/Https
- Support for Windows, Linux and macOS Silicon & x64
- Support for
PyPy3
andCPython
- Dynamic URL Routing with Wildcard & Parameter support
- Sync and Async Function Support
- Really Simple API
- Fast and Encrypted TLS 1.3 quicker than most alternative servers can do even unencrypted, cleartext messaging
- Per-SNI HttpRouter Support
- Proxy Protocol v2
- Shared or Dedicated Compression Support
- Max Backpressure, Max Timeout, Max Payload and Idle Timeout Support
- Automatic Ping / Pong Support
- Per Socket Data
Middlewares
Templates
Support (examples withMako
andJinja2
)ASGI Server
WSGI Server
Plugins/Extensions
:mag_right: Upcoming Features
- In-Memory Cache Tools
- Fetch like API powered by libuv
- Async file IO powered by libuv
- Full asyncio integration with libuv
- SSGI Server spec and support
- RSGI Server support
- Full Http3 support
HPy
integration to better supportCPython
,PyPy
andGraalPython
- Hot Reloading
We created and adapted the full C API from uNetworking/uWebSockets and will integrate libuv powered fetch and file IO, this same C API is used by Bun
Join Github Discussions
or Discord
for help and have a look at the development progress.
:zap: Benchmarks
Socketify WebFramework HTTP requests per second (Linux x64)
WSGI Server requests per second (Linux x64)
ASGI Server requests per second (Linux x64)
WebSocket messages per second (Linux x64)
Http tested with TFB tool plaintext benchmark
WebSocket tested with Bun.sh bench chat-client
Source code in TechEmPower and for websockets in bench
Machine OS: Debian GNU/Linux bookworm/sid x86_64 Kernel: 6.0.0-2-amd64 CPU: Intel i7-7700HQ (8) @ 3.800GHz Memory: 32066MiB
📦 Installation
For macOS x64 & Silicon, Linux x64, Windows
pip install socketify
#or specify PyPy3
pypy3 -m pip install socketify
#or in editable mode
pypy3 -m pip install -e socketify
Using install via requirements.txt
socketify
pip install -r ./requirements.txt
#or specify PyPy3
pypy3 -m pip install -r ./requirements.txt
If you are using linux or macOS, you may need to install libuv and zlib in your system
macOS
brew install libuv
brew install zlib
Linux (Ubuntu/Debian)
apt install libuv1 zlib1g
Linux (RHEL/OEL)
yum install cmake zlib-devel libuv-devel
🤔 Usage
Hello world app
from socketify import App
app = App()
app.get("/", lambda res, req: res.end("Hello World socketify from Python!"))
app.listen(3000, lambda config: print("Listening on port http://localhost:%d now\n" % config.port))
app.run()
SSL version sample
from socketify import App, AppOptions
app = App(AppOptions(key_file_name="./misc/key.pem", cert_file_name="./misc/cert.pem", passphrase="1234"))
app.get("/", lambda res, req: res.end("Hello World socketify from Python!"))
app.listen(3000, lambda config: print("Listening on port http://localhost:%d now\n" % config.port))
app.run()
WebSockets
from socketify import App, OpCode, CompressOptions
def ws_open(ws):
print('A WebSocket got connected!')
ws.send("Hello World!", OpCode.TEXT)
def ws_message(ws, message, opcode):
#Ok is false if backpressure was built up, wait for drain
ok = ws.send(message, opcode)
app = App()
app.ws("/*", {
'compression': CompressOptions.SHARED_COMPRESSOR,
'max_payload_length': 16 * 1024 * 1024,
'idle_timeout': 12,
'open': ws_open,
'message': ws_message,
'drain': lambda ws: print(f'WebSocket backpressure: {ws.get_buffered_amount()}'),
'close': lambda ws, code, message: print('WebSocket closed'),
'subscription': lambda ws, topic, subscriptions, subscriptions_before: print(f'subscribe/unsubscribe on topic {topic} {subscriptions} {subscriptions_before}'),
})
app.any("/", lambda res,req: res.end("Nothing to see here!'"))
app.listen(3000, lambda config: print("Listening on port http://localhost:%d now\n" % (config.port)))
app.run()
We have more than 20 examples click here for more
:hammer: Building from source
#clone and update submodules
git clone https://github.com/cirospaciari/socketify.py.git
cd ./socketify.py
git submodule update --init --recursive --remote
#you can use make linux, make macos or call Make.bat from Visual Studio Development Prompt to build
cd ./src/socketify/native/ && make linux && cd ../../../
#install local pip
pypy3 -m pip install .
#install in editable mode
pypy3 -m pip install -e .
#if you want to remove
pypy3 -m pip uninstall socketify
:briefcase: Commercially supported
I'm a Brazilian consulting & contracting company dealing with anything related with socketify.py and socketify.rb
Don't hesitate sending a mail if you are in need of advice, support, or having other business inquiries in mind. We'll figure out what's best for both parties.
Special thank's to uNetworking AB to develop uWebSockets, uSockets and allow us to bring this features and performance to Python and PyPy
:heart: Sponsors
If you like to see this project thrive, you can sponsor us on GitHub too. We need all the help we can get.
Thank you Otavio Augusto
to be the first sponsor of this project!
:star: Stargazers
:wrench: Forkers
:grey_question: uvloop
We don't use uvloop, because uvloop don't support Windows and PyPy3 at this moment, this can change in the future, but right now we want to implement our own libuv + asyncio solution, and a lot more.
:dizzy: CFFI vs Cython vs HPy
Cython performs really well on Python3 but really bad on PyPy3, CFFI are chosen for better support PyPy3 until we got our hands on a stable HPy
integration.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
File details
Details for the file socketify-0.0.31.tar.gz
.
File metadata
- Download URL: socketify-0.0.31.tar.gz
- Upload date:
- Size: 4.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.13.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7502bed5b382e75f04ea3c6d6b53b76f27bb8653740db92e3f2b55fab388df20 |
|
MD5 | f4443ccfd1eb372a1a3ec706dba49b7f |
|
BLAKE2b-256 | ef74c7ba0eadc4946de73c7146d6750542fda9b47883e6aaedadef88c1aba94e |
File details
Details for the file socketify-0.0.31-pp310-pypy310_pp73-any.whl
.
File metadata
- Download URL: socketify-0.0.31-pp310-pypy310_pp73-any.whl
- Upload date:
- Size: 4.9 MB
- Tags: PyPy
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.13.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 379f109a87edf396ed513869ee921a70cf8f4694ce7ef347d414c72e2543c954 |
|
MD5 | d14cd71e89d884ff090ed5cd7ed3fe09 |
|
BLAKE2b-256 | 970c302372aee5ab9d33c9edf9f881add00b5995677bde32d37f5b6edd79be89 |
File details
Details for the file socketify-0.0.31-cp313-cp313-any.whl
.
File metadata
- Download URL: socketify-0.0.31-cp313-cp313-any.whl
- Upload date:
- Size: 4.9 MB
- Tags: CPython 3.13
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.13.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 328e6e46f8a896e09400fd415c8d402b9da40a0a154c4bb4ac0d851d54d380c0 |
|
MD5 | 712f09fd2198270aae71f02556dcb171 |
|
BLAKE2b-256 | e388a9cac856802aace439aa7cce52924c3cf2da1d684509d9c4135f401b244b |