Minimal asyncio web server for HTTP and Websocket.
Project description
micropython-uaioweb
A very minimal asyncio web framework for MicroPython. Doesn't come with all the bells and whistles you might want out of a serious web framework but the goal is just to make asyncio HTTP applications in MicroPython as simple and efficient as possible.
Current features
- minimal overhead in terms of code size or memory use
- easy integration into existing asyncio projects by running as a normal task alongside others
- basic endpoint/method based routing similar to flask (currently doesn't do any pattern matching)
- parses http request line, headers, and query strings
- supports WebSockets!
- supports Server-Sent Events!
Rationale
micropython-uaioweb
is a packaged version of micropython-aioweb
, an amazing minimal and functional HTTP toolkit for micropython by Davy Wybiral.
This project aims at releasing the library on PyPI by forking and reworking branch main
with 1 commit per version.
Examples
Basic "Hello world!"
import uaioweb
from uaioweb import asyncio # Note: compatibility between micropython and python.
app = uaioweb.App(host='0.0.0.0', port=80)
# root route handler
@app.route('/')
async def handler(r, w):
# write http headers
w.write(b'HTTP/1.0 200 OK\r\n')
w.write(b'Content-Type: text/html; charset=utf-8\r\n')
w.write(b'\r\n')
# write page body
w.write(b'Hello world!')
# drain stream buffer
await w.drain()
# Start event loop and create server task
loop = asyncio.get_event_loop()
loop.create_task(app.serve())
loop.run_forever()
POST request handler
@app.route('/', methods=['POST'])
async def handler(r, w):
body = await r.read(1024)
form = uaioweb.parse_qs(body.decode())
name = form.get('name', 'world')
# write http headers
w.write(b'HTTP/1.0 200 OK\r\n')
w.write(b'Content-Type: text/html; charset=utf-8\r\n')
w.write(b'\r\n')
# write page body
w.write(b'Hello {}!'.format(name))
# drain stream buffer
await w.drain()
WebSocket handler
# /ws WebSocket route handler
@app.route('/ws')
async def ws_handler(r, w):
# upgrade connection to WebSocket
ws = await WebSocket.upgrade(r, w)
while True:
evt = await ws.recv()
if evt is None or evt['type'] == 'close':
# handle closed stream/close event
break
elif evt['type'] == 'text':
# print received messages and echo them
print('Received:', evt['data'])
await ws.send(evt['data'])
SSE (Server-Sent Events) handler
# /events EventSource route handler
@app.route('/events')
async def ws_handler(r, w):
# upgrade connection to text/event-stream
sse = await uaioweb.EventSource.upgrade(r, w)
count = 0
while True:
count += 1
try:
await sse.send('Hello world #{}'.format(count))
except:
break
await asyncio.sleep(1)
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 Distribution
Close
Hashes for micropython-uaioweb-0.0.3.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | edaac99ea778775f372a9c44747d7e958d3843f37d468136f2e1defd7a8d3f7a |
|
MD5 | f894344356d47154f770d1c2eb9e176e |
|
BLAKE2b-256 | e4e0c3d6a06b544b0b1c612c43c51a3e829c9071d4fe8e52fadf30383d06aa67 |
Close
Hashes for micropython_uaioweb-0.0.3-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9bd7f37b15eae0cd4065108b9701dedf7dd6849c25184836b96606197720f9c1 |
|
MD5 | b7de6ba4c61dc2506648d84d23b487d0 |
|
BLAKE2b-256 | becf25e30883c1c480a9fe6d36dfdd5505032ce2d21ca34b16f3b54e22edf03c |