Package: xpresso
Xpresso is an ASGI web framework built on top ofStarlette,Pydanticanddi, with heavy inspiration fromFastAPI.Some of the standout features are:ASGI support for high performance (within the context of Python web frameworks)OpenAPI documentation generationAutomatic parsing and validation of request bodies and parameters, with hooks for custom extractorsFull support forOpenAPI parameter serializationHighly typed and tested codebase with great IDE supportA powerful dependency injection system, backed bydiRequirementsPython 3.7+InstallationpipinstallxpressoYou'll also want to install an ASGI server, such asUvicorn.pipinstalluvicornExampleCreate a file namedexample.py:frompydanticimportBaseModelfromxpressoimportApp,Path,FromPath,FromQueryclassItem(BaseModel):item_id:intname:strasyncdefread_item(item_id:FromPath[int],name:FromQuery[str])->Item:returnItem(item_id=item_id,name=name)app=App(routes=[Path("/items/{item_id}",get=read_item,)])Run the application:uvicornexample:appNavigate tohttp://127.0.0.1:8000/items/123?name=foobarbazin your browser.
You will get the following JSON response:{"item_id":123,"name":"foobarbaz"}Now navigate tohttp://127.0.0.1:8000/docsto poke around the interactiveSwagger UIdocumentation:For more examples, tutorials and reference materials, see ourdocumentation.Inspiration and relationship to other frameworksXpresso 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 standalonedilibrary.Decoupling the framework from Pydantic by usingAnnotated(PEP 593) instead of default values (param: FromQuery[str]instead ofparam: str = Query(...)).Middleware on Routersso that you can use generic ASGI middleware in a routing-aware manner (for example, installing profiling middleware on only some paths without using regex matching).Support forlifespans on any Router or mounted App(this silently fails in FastAPI and Starlette)dependency injection into the application lifespanand support formultiple dependency scopes.Formalizing the framework for extracting parameters and bodies from requests into theBinder APIso that 3rd party extensions can do anything the framework does.Support forcustomizing parameter and form serialization.Better performance by implementingdependency resolution in Rust,executing dependencies concurrentlyandcontrolling threading of sync dependencies on a per-dependency basis.Current stateThis project is under active development.
It should not be considered "stable" or ready to be used in production.
It is however ready for experimentation and learning!What is implemented and mostly stable?Extraction and OpenAPI documentation of parameters (query, headers, etc.) and request bodies (including multipart requests).Parameter serialization.Routing, including applications, routers and routes.Dependency injection and testing utilities (dependency overrides).Most of this APIs will begenerallystable going forward, although some minor aspects like argument names will probably change at some point.What is not implemented or unstable?Low-level API for binders (stuff inxpresso.binders): this is public, but should be considered experimental and is likely to change. The high level APIs (FromPath[str]andAnnotated[str, PathParam(...)]) are likely to be stable.Security dependencies and OpenAPI integration. This part used to exist, but needed some work. It is planned for the future, but we need to think about the scope of these features and the API.See this release on GitHub:v0.46.0