Skip to main content

A developer centric, performant Python web framework

Project description

Xpresso

Test Coverage Package version Supported Python versions

Xpresso is an ASGI web framework built on top of Starlette, Pydantic and di, with heavy inspiration from FastAPI.

Some of the standout features are:

  • ASGI support for high performance (within the context of Python web frameworks)
  • OpenAPI documentation generation
  • Automatic parsing and validation of request bodies and parameters, with hooks for custom extractors
  • Full support for OpenAPI parameter serialization
  • Highly typed and tested codebase with great IDE support
  • A powerful dependency injection system, backed by di

Requirements

Python 3.7+

Installation

pip install xpresso

You'll also want to install an ASGI server, such as Uvicorn.

pip install uvicorn

Example

Create a file named example.py:

from pydantic import BaseModel
from xpresso import App, Path, FromPath, FromQuery

class Item(BaseModel):
    item_id: int
    name: str

async def read_item(item_id: FromPath[int], name: FromQuery[str]) -> Item:
    return Item(item_id=item_id, name=name)

app = App(
    routes=[
        Path(
            "/items/{item_id}",
            get=read_item,
        )
    ]
)

Run the application:

uvicorn example:app

Navigate to http://127.0.0.1:8000/items/123?name=foobarbaz in your browser. You will get the following JSON response:

{"item_id":123,"name":"foobarbaz"}

Now navigate to http://127.0.0.1:8000/docs to poke around the interactive Swagger UI documentation:

Swagger UI

For more examples, tutorials and reference materials, see our documentation.

Inspiration and relationship to other frameworks

Xpresso is mainly inspired by FastAPI. FastAPI pioneered several ideas that are core to Xpresso's approach:

  • Leverage Pydantic for JSON parsing, validation and schema generation.
  • Leverage Starlette for routing and other low level web framework functionality.
  • Provide a simple but powerful dependency injection system.
  • Use that dependency injection system to provide extraction of request bodies, forms, query parameters, etc.

Xpresso takes these ideas and refines them by:

  • Decoupling the dependency injection system from the request/response cycle, leading to an overall much more flexible and powerful dependency injection system, packaged up as the standalone di library. This is how Xpresso is able to provide dependency injection into the application lifespan and support for multiple dependency scopes.
  • Making the extraction of data from requests an API available to other developers, enabling features like compatibility with libraries other than Pydantic or MessagePack support to be made available as 3rd party extensions instead of feature requests. All of this with full support for hooking into the OpenAPI documentation generation.
  • Providing better support for application/x-www-form-urlencoded and multipart/form-data requests by describing them with dataclasses or Pydantic models. This includes support for advanced use cases like extracting JSON from a form field.
  • Able to inject App or a custom subclass you use into your lifespan and endpoints instead of having to resort to request.scope["app"].
  • Better performance by implementing dependency resolution in Rust, executing dependencies concurrently and controlling threading of sync dependencies on a per-dependency basis.
  • Allowing you to describe a single OpenAPI operation that accepts multiple content/types and extracting the right one based on headers
  • Giving you the ability to access and modify responses from within dependencies, allowing you to replace timing, tracing and logging middleware (which is routing ¨naive) with routing aware dependencies. No more middleware that accepts a regex pattern of paths!
  • Allowing dynamic building of security models triggered by lifespan events (you can load your Security model config from the environment at runtime).
  • Use of Annotated (PEP 593) instead of default values (param: str = Query(...)) which decouples the framework from Pydantic and enables a lot of the other features listed above and even allows you to make up your own markers to use if you make custom Binders.
  • Middleware on Router so that you can apply auth, logging or profiling to only some routes without resorting to regex path matching.
  • Support for lifespans on any Router or mounted App (this silently fails in FastAPI and Starlette)

See this release on GitHub: v0.9.3

Release history Release notifications | RSS feed

This version

0.9.3

Download files

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

Source Distribution

xpresso-0.9.3.tar.gz (44.5 kB view details)

Uploaded Source

Built Distribution

xpresso-0.9.3-py3-none-any.whl (74.0 kB view details)

Uploaded Python 3

File details

Details for the file xpresso-0.9.3.tar.gz.

File metadata

  • Download URL: xpresso-0.9.3.tar.gz
  • Upload date:
  • Size: 44.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.12 CPython/3.10.2 Linux/5.11.0-1027-azure

File hashes

Hashes for xpresso-0.9.3.tar.gz
Algorithm Hash digest
SHA256 d0ed988de8ca8c482015ef300b1153b5aa4a518245b7b6fc4e9044610c34e83b
MD5 66feacf6c8b9d0aff82e709df63278f3
BLAKE2b-256 5f69e6352273b263b8e6d4739880f286c36406e677c1572d1029dc792b2613f3

See more details on using hashes here.

File details

Details for the file xpresso-0.9.3-py3-none-any.whl.

File metadata

  • Download URL: xpresso-0.9.3-py3-none-any.whl
  • Upload date:
  • Size: 74.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.12 CPython/3.10.2 Linux/5.11.0-1027-azure

File hashes

Hashes for xpresso-0.9.3-py3-none-any.whl
Algorithm Hash digest
SHA256 0fca5d57f0c5d0361f2f25b3058cfa0fbc8514f29fbdfe21184b7dd18aed0666
MD5 9ddfed525ef77dc7b7d109770246bc65
BLAKE2b-256 76496a4c0d3ea6a0bac9d4984b72c7316a45bb13e500864a024a6f89f5584eb8

See more details on using hashes here.

Supported by

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