Skip to main content

A Python HTTP Server.

Project description

⚡️Thunderlight is the fastest Python HTTP Server

Thunderlight is the fastest Python HTTP Server. It's dedicated for micro service and JSON API. In the future, a C version of this API is also supported. You can write Python or C in your server project to speed things up.

Installation

Install Thunderlight with pip.

pip install thunderlight

Documentation

get

Register a get request handler to the default app.

@get('/posts/:id')
async def posts(ctx: Ctx) -> None:
    ctx.res.json((await Post.id(ctx.req.args.id)).tojson())

post

Register a post request handler to the default app.

@post('/posts')
async def posts(ctx: Ctx) -> None:
    ctx.res.json(Post(**(await ctx.req.json())).save().tojson())

patch

Register a patch request handler to the default app.

@patch('/posts/:id')
async def posts(ctx: Ctx) -> None:
    ctx.res.json((await Post.id(ctx.req.args.id)).set(await ctx.req.json()).save().tojson())

delete

Register a delete request handler to the default app.

@delete('/posts/:id')
async def posts(ctx: Ctx) -> None:
    ctx.res.empty((await Post.id(ctx.req.args.id)).delete())

use

Append this middleware to the default app's middleware stack.

@use
async def measure_time(ctx: Ctx, next: Next) -> None:
    start = time()
    await next(ctx)
    time_elapsed = time() - start
    print(f'request {ctx.req.path} takes {time_elapsed} second.')

apply

Apply a middleware to a request handler. This is aka middleware for a single request handler.

async def validate_user(ctx: Ctx, next: Next) -> None:
    if ctx.req.headers['Authorization'] is not None:
        await next(ctx)
    else:
        ctx.res.code = 401
        ctx.res.json({"error": {"type": "Unauthorized"}})


@get('/users')
@apply(validate_user)
async def users(ctx: Ctx) -> None:
    ctx.res.json(await User.find())

App

Create a new server application.

app = App()

@app.get('/articles')
async def articles(ctx: Ctx) -> None:
    ctx.res.json(await Article.find())

Ctx

The context represents a request session.

ctx.req

The request object. This object is readonly.

ctx.res

The response object. Modify this object to present data to the user.

ctx.state

The custom state object that is internal to your custom handling code.

Req

This class represents the incoming request. This object is readonly.

req.client

The request client.

req.scheme

The request HTTP scheme.

req.version

The request HTTP version.

req.method

The request HTTP method.

req.path

The path of the request URL.

req.args

The args matched from url routing.

req.qs

The query string of the request URL.

req.headers

The request headers.

await req.body()

The raw request body.

await req.json()

The request's json body.

await req.form()

The request's form body.

await req.dict()

The request's json body or form body.

Res

The class represents the response returned to the frontend.

res.code

The status code.

res.headers

The response headers.

res.body

The response body.

res.json()

Response json to the frontend.

res.text()

Response text to the frontend

res.html()

Response html text to the frontend

res.redirect()

Response a redirect request to the frontend

res.file()

Response a file to the frontend

res.empty()

Empty response

State

You can attach anything to the state and fetch by key. This state shares the same state across middlewares and the route handler.

@app.get('/articles')
async def articles(ctx: Ctx) -> None:
    ctx.state.user = custom_user
    ctx.state.user # custom_user

Changelog

0.6.0 (Mar 25th, 2022)

  • Added generic response headers
  • Added wildcard URL route matching
  • Added static file serving

0.5.1 (Mar 8th, 2022)

  • Temporarily add static file

0.5.0 (Feb 24th, 2022)

  • Revert to Python implementation as the C implementation is not stable

0.2.8 (Jan 28th, 2022)

  • Fixed a bug that causes patch and delete requests to crash

0.2.7 (Jan 25th, 2022)

  • Fixed a bug that causes errors in handlers not propagated
  • Add __contains__ method to ReqHeaders

0.2.6 (Jan 25th, 2022)

  • Fixed a bug that would cause delete routes crashing

0.2.5 (Jan 24th, 2022)

  • Remove uvicorn and related dependencies
  • Rewrite with C
  • Fix req.json property

0.1.0 (Dec 10th, 2021)

  • Global methods added: get, post, patch, delete, use and apply.
  • Classes added: App, Ctx, Req, Res, State.
  • Function definition added: Handler, Next and Middleware.
  • Global helper methods added: main, gimme and make.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

thunderlight-0.6.0.tar.gz (12.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

thunderlight-0.6.0-py3-none-any.whl (13.4 kB view details)

Uploaded Python 3

File details

Details for the file thunderlight-0.6.0.tar.gz.

File metadata

  • Download URL: thunderlight-0.6.0.tar.gz
  • Upload date:
  • Size: 12.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.1

File hashes

Hashes for thunderlight-0.6.0.tar.gz
Algorithm Hash digest
SHA256 781c9863f57da6f2ce8129edcb5473fee79d6eaec8ac7e603252ab1753d2085b
MD5 cee16f1165acbcd516ff1cdb8ff0819e
BLAKE2b-256 7e2967156c856b208044306ebfe82e341028073b7709f7253b29b87a62a98c8c

See more details on using hashes here.

File details

Details for the file thunderlight-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: thunderlight-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 13.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.1

File hashes

Hashes for thunderlight-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 70fb99d2dd71aee8be50ffe12006f582a0d97269885b809c792b7462ad98da3b
MD5 a1cfdcef24ba1e61efb274e3c2ffc415
BLAKE2b-256 1246167d600c1e8ff5c7751cd74636b02675ffbd5c503fd3cea8a490465252eb

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page