No project description provided
Project description
jj
Installation
pip3 install jj==2.0.0-dev.2
Usage
import jj
@jj.match("*")
async def handler(request: jj.Request) -> jj.Response:
return jj.Response(body="200 OK")
jj.serve()
Documentation
Matchers
Method
match_method(method
)
from jj.http.methods import ANY, GET, POST
@jj.match_method(GET)
async def handler(request):
return jj.Response(body="Method: " + request.method)
Path
match_path(path
)
@jj.match_path("/users")
async def handler(request):
return jj.Response(body="Path: " + request.path)
Params
match_param(name
, val
)
@jj.match_param("locale", "en_US")
async def handler(request):
locales = request.params.getall('locale')
return jj.Response(body="Locales: " + ",".join(locales))
match_params(params
)
@jj.match_params({"locale": "en_US", "timezone": "UTC"})
async def handler(request):
# Literal String Interpolation (PEP 498)
return jj.Response(body=f"Params: {request.params}")
Headers
match_header(name
, val
)
@jj.match_header("X-Forwarded-Proto", "https")
async def handler(request):
proto = request.headers.getone("X-Forwarded-Proto")
return jj.Response(body="Proto: " + proto)
match_headers(headers
)
@jj.match_headers({
"x-user-id": "1432",
"x-client-id": "iphone",
})
async def handler(request):
return jj.Response(body=f"Headers: {request.headers}")
Combining Matchers
match_any(matchers
)
from jj.http import PATCH, PUT
@jj.match_any([
jj.match_method(PUT),
jj.match_method(PATCH),
])
async def handler(request):
return jj.Response(body="200 OK")
match_all(matchers
)
@jj.match_all([
jj.match_method("*"),
jj.match_path("/"),
jj.match_params({"locale": "en_US"}),
jj.match_headers({"x-request-id": "0fefbf48"}),
])
async def handler(request):
return jj.Response(body="200 OK")
match(method
, path
, params
, headers
)
@jj.match("*", "/", {"locale": "en_US"}, {"x-request-id": "0fefbf48"})
async def handler(request):
return jj.Response(body="200 OK")
Responses
Response
JSON Response
@jj.match("*")
async def handler(request):
return jj.Response(json={"message": "200 OK"})
HTML Response
@jj.match("*")
async def handler(request):
return jj.Response(body="<p>text<p>", headers={"Content-Type": "text/html"})
Binary Response
@jj.match("*")
async def handler(request):
return jj.Response(body=b"<binary>")
Not Found Response
@jj.match("*")
async def handler(request):
return jj.Response(status=404, reason="Not Found")
TunnelResponse β
@jj.match("*")
async def handler(request):
return jj.TunnelResponse(target="https://httpbin.org/")
Apps
Single App
import jj
from jj.http.methods import GET, ANY
from jj.http.codes import OK, NOT_FOUND
class App(jj.App):
@jj.match(GET, "/")
async def root_handler(self, request: jj.Request) -> jj.Response:
return jj.Response(status=OK, json={"message": "200 OK"})
@jj.match(ANY)
async def default_handler(self, request: jj.Request) -> jj.Response:
return jj.Response(status=NOT_FOUND, json={"message": "Not Found"})
jj.serve(App(), port=5000)
Multiple Apps
import jj
class App(jj.App):
@jj.match("*")
async def handler(self, request: jj.Request) -> jj.Response:
return jj.Response(body="App")
class AnotherApp(jj.App):
@jj.match("*")
async def handler(self, request: jj.Request) -> jj.Response:
return jj.Response(body="AnotherApp")
jj.start(App(), port=5001)
jj.start(AnotherApp(), port=5002)
jj.wait_for([KeyboardInterrupt])
App Inheritance
import jj
class UsersApp(jj.App):
@jj.match("*", path="/users")
async def handler(self, request: jj.Request) -> jj.Response:
return jj.Response(body="Users")
class GroupsApp(jj.App):
@jj.match("*", path="/groups")
async def handler(self, request: jj.Request) -> jj.Response:
return jj.Response(body="Groups")
class App(UsersApp, GroupsApp):
pass
jj.serve(App())
Middlewares
Handler Middleware
import jj
from jj.http.codes import OK, FORBIDDEN
class Middleware(jj.Middleware):
async def do(self, request, handler, app):
if request.headers.get("x-secret-key") != "<SECRET_KEY>":
return jj.Response(status=FORBIDDEN, body="Forbidden")
return await handler(request)
class App(jj.App):
@Middleware()
@jj.match("*")
async def handler(self, request: jj.Request) -> jj.Response:
return jj.Response(status=OK, body="Ok")
jj.serve(App())
App Middleware
import jj
from jj.http.codes import OK, FORBIDDEN
class ReusableMiddleware(jj.Middleware):
def __init__(self, secret_key):
super().__init__()
self._secret_key = secret_key
async def do(self, request, handler, app):
if request.headers.get("x-secret-key") != self._secret_key:
return jj.Response(status=FORBIDDEN, body="Forbidden")
return await handler(request)
private = @ReusableMiddleware("<SECRET_KEY>")
@private
class App(jj.App):
@jj.match("*")
async def handler(self, request: jj.Request) -> jj.Response:
return jj.Response(status=OK, body="Ok")
jj.serve(App())
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
jj-2.0.0.dev2.tar.gz
(28.1 kB
view hashes)
Built Distribution
jj-2.0.0.dev2-py3-none-any.whl
(52.4 kB
view hashes)