A lightweight ASGI framework
Project description
bareASGI
A lightweight ASGI framework (read the documentation)
Status
Work in progress.
Overview
This is a bare ASGI web server framework. The goal is to provide a minimal implementation, with other facilities (serving static files, CORS, sessions, etc.) being implemented by optional packages.
Some of the features provided by web frameworks are not required for a given app, or conflict with the version or varient required for a given solution.
See also:
- bareASGI-cors for cross origin resource sharing
- bareASGI-static for static file serving
- bareASGI-jinja2 for Jinja2 template rendering
- bareASGI-graphql-next for GraphQL
Functionality
The framework supports:
- Http,
- WebSockets,
- A basic method and path based router,
- Middleware.
Examples
These examples use uvicorn as the ASGI server.
Simple Client
Here is a simple example which returns some text.
import uvicorn
from bareasgi import Application, text_writer
async def http_request_callback(scope, info, matches, content):
return 200, [(b'content-type', b'text/plain')], text_writer('This is not a test')
app = Application()
app.http_router.add({'GET'}, '/{rest:path}', http_request_callback)
uvicorn.run(app, port=9009)
Rest Server
Here is a simple rest server.
import uvicorn
import json
from bareasgi import Application, text_reader, text_writer
async def get_info(scope, info, matches, content):
text = json.dumps(info)
return 200, [(b'content-type', b'application/json')], text_writer(text)
async def set_info(scope, info, matches, content):
text = await text_reader(content)
data = json.loads(text)
info.update(data)
return 204, None, None
app = Application(info={'name': 'Michael Caine'})
app.http_router.add({'GET'}, '/info', get_info)
app.http_router.add({'POST'}, '/info', set_info)
uvicorn.run(app, port=9009)
WebSockets
A WebSocket example can be found in the examples folder. Here is the handler.
async def test_callback(scope, info, matches, web_socket):
await web_socket.accept()
try:
while True:
text = await web_socket.receive()
if text is None:
break
await web_socket.send('You said: ' + text)
except Exception as error:
print(error)
await web_socket.close()
Middleware
Here is a simple middleware example.
import uvicorn
from bareasgi import Application, text_writer
async def first_middleware(scope, info, matches, content, handler):
info['message'] = 'This is first the middleware. '
response = await handler(scope, info, matches, content)
return response
async def second_middleware(scope, info, matches, content, handler):
info['message'] += 'This is the second middleware.'
response = await handler(scope, info, matches, content)
return response
async def http_request_callback(scope, info, matches, content):
return 200, [(b'content-type', b'text/plain')], text_writer(info['message'])
app = Application(middlewares=[first_middleware, second_middleware])
app.http_router.add({'GET'}, '/test', http_request_callback)
uvicorn.run(app, port=9009)
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
File details
Details for the file bareasgi-3.0.1.tar.gz
.
File metadata
- Download URL: bareasgi-3.0.1.tar.gz
- Upload date:
- Size: 11.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/39.1.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3d30ff952ac43d053037d9686252a75caa51a97e3c625c9552a3d36a25b0fd17 |
|
MD5 | bb063d1707bc20ec2ab5a052cb2c294c |
|
BLAKE2b-256 | aa270b21faafb5b779f3bd271be769830e88a472b5698a1b6c7920b3f2448aaf |
File details
Details for the file bareasgi-3.0.1-py3-none-any.whl
.
File metadata
- Download URL: bareasgi-3.0.1-py3-none-any.whl
- Upload date:
- Size: 18.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/39.1.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9628468755462f0a732a301eed0e34019742fe578ce86f4499571c5e7ea2b8f8 |
|
MD5 | 155efbf04f2ff138b801994839b076be |
|
BLAKE2b-256 | 7091b7e688798a0048645594d0fd93653f5224129de079f8756e60997d52a118 |