Developer centric, performant and extensible Python ASGI framework

Overview

Xpresso

Test Coverage Package version Supported Python versions

Introduction

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.

Comments
  • Pip can't resolve dependencies

    Pip can't resolve dependencies

    I'm having some trouble installing the following from a requirements file:

    jinja2
    piccolo[postgres]
    piccolo_admin
    xpresso
    uvicorn
    

    Pip can't resolve the dependencies and gets caught in an endless loop.

    It only started today - I noticed because the CI started failing. I can't see anything in the latest Xpresso release which may have caused this.

    Do you have any ideas?

    opened by dantownsend 10
  • Cannot import name 'DependantBase' from 'di.api.dependencies'

    Cannot import name 'DependantBase' from 'di.api.dependencies'

    I'm getting this error when running Xpresso:

    from di.api.dependencies import DependantBase
    ImportError: cannot import name 'DependantBase' from 'di.api.dependencies'
    

    I see you renamed something in di recently. How about putting something like this for backwards compatibility:

    DependantBase = DependentBase
    
    opened by dantownsend 6
  • feat/refactor!: router-level middleware, support for lifespans on mounted apps

    feat/refactor!: router-level middleware, support for lifespans on mounted apps

    Closes #32

    This is a middle road of where we are now and #32: App is not longer based on Starlette, but Router still inherits from Starlette's Router and adds middleware on top of it

    opened by adriangb 6
  • chore(dev): Improve low Code and Refactor Functions

    chore(dev): Improve low Code and Refactor Functions

    Hello @adriangb It's been a long time we talk about the projects, I just find the right time to do some improvement in code may be related to styling and improving code to use the last Pythonic ways, that's why!

    I guess you will find most of the refactor functions are:

    • Simplifies boolean if expressions by removing unnecessary explicit references to True or False states.
    • Replaces conditional assignment to a variable with an if expression

    And other ones, also sorry for this Big Pull request 😅

    opened by yezz123 4
  • feat: add @Router.get, @Router.put, etc. decorators to Router

    feat: add @Router.get, @Router.put, etc. decorators to Router

    Background: https://github.com/encode/starlette/pull/704

    There are pros and cons to the decorator / list of routes approach. I think the big pro of the decorator approach is having the path parameters close to the endpoint function. The main con is that it introduces a lot of code paths, for example with App.add_middleware() and the relationship between App and App.router.

    A good compromise may be to add decorators only for Path. This gives us the best of both worlds:

    • Path parameter declarations are close to where they are used
    • There is no complicated state management (Path is pretty simple)
    • Other classes are boilerplate free and have simple declarative constructor composability

    The main issue is how to deal with Operation. I guess we'd have to make the decorators accept all of the parameters of Operation, which I don't like.

    opened by adriangb 3
  • feat: add App.dependency_overrides

    feat: add App.dependency_overrides

    App.dependency_overrides can be used as a mapping or context manager that yields a mapping

    This reduces a lot of boilerplate for users by wrapping their callable in Depends for them and shortening the function calls. It also acts as an ExitStack: users can assign overrides without increasing indentation and they all get unwound when the underlaying context manager exits.

    opened by adriangb 2
  • bug: repeated vs comma separated array headers

    bug: repeated vs comma separated array headers

    As per specs, these should be treated as equivalent. But I believe we are only dealing with the latter right now. It might make sense to double check what the ASGI spec, the HTTP specs, the OpenAPI spec, requests/TesClient and finally Starlette have to say about the matter and then fix the issue (if there is one)

    opened by adriangb 2
  • chore(deps): bump certifi from 2022.9.24 to 2022.12.7

    chore(deps): bump certifi from 2022.9.24 to 2022.12.7

    Bumps certifi from 2022.9.24 to 2022.12.7.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • chore(deps-dev): bump httpx from 0.18.1 to 0.23.0

    chore(deps-dev): bump httpx from 0.18.1 to 0.23.0

    Bumps httpx from 0.18.1 to 0.23.0.

    Release notes

    Sourced from httpx's releases.

    Version 0.23.0

    0.23.0 (23rd May, 2022)

    Changed

    • Drop support for Python 3.6. (#2097)
    • Use utf-8 as the default character set, instead of falling back to charset-normalizer for auto-detection. To enable automatic character set detection, see the documentation. (#2165)

    Fixed

    • Fix URL.copy_with for some oddly formed URL cases. (#2185)
    • Digest authentication should use case-insensitive comparison for determining which algorithm is being used. (#2204)
    • Fix console markup escaping in command line client. (#1866)
    • When files are used in multipart upload, ensure we always seek to the start of the file. (#2065)
    • Ensure that iter_bytes never yields zero-length chunks. (#2068)
    • Preserve Authorization header for redirects that are to the same origin, but are an http-to-https upgrade. (#2074)
    • When responses have binary output, don't print the output to the console in the command line client. Use output like <16086 bytes of binary data> instead. (#2076)
    • Fix display of --proxies argument in the command line client help. (#2125)
    • Close responses when task cancellations occur during stream reading. (#2156)
    • Fix type error on accessing .request on HTTPError exceptions. (#2158)

    Version 0.22.0

    0.22.0 (26th January, 2022)

    Added

    Fixed

    • Don't perform unreliable close/warning on __del__ with unclosed clients. (#2026)
    • Fix Headers.update(...) to correctly handle repeated headers (#2038)

    Version 0.21.3

    0.21.3 (6th January, 2022)

    Fixed

    • Fix streaming uploads using SyncByteStream or AsyncByteStream. Regression in 0.21.2. (#2016)

    Version 0.21.2

    0.21.2 (5th January, 2022)

    Fixed

    • HTTP/2 support for tunnelled proxy cases. (#2009)
    • Improved the speed of large file uploads. (#1948)

    Version 0.21.1

    ... (truncated)

    Changelog

    Sourced from httpx's changelog.

    0.23.0 (23rd May, 2022)

    Changed

    • Drop support for Python 3.6. (#2097)
    • Use utf-8 as the default character set, instead of falling back to charset-normalizer for auto-detection. To enable automatic character set detection, see the documentation. (#2165)

    Fixed

    • Fix URL.copy_with for some oddly formed URL cases. (#2185)
    • Digest authentication should use case-insensitive comparison for determining which algorithm is being used. (#2204)
    • Fix console markup escaping in command line client. (#1866)
    • When files are used in multipart upload, ensure we always seek to the start of the file. (#2065)
    • Ensure that iter_bytes never yields zero-length chunks. (#2068)
    • Preserve Authorization header for redirects that are to the same origin, but are an http-to-https upgrade. (#2074)
    • When responses have binary output, don't print the output to the console in the command line client. Use output like <16086 bytes of binary data> instead. (#2076)
    • Fix display of --proxies argument in the command line client help. (#2125)
    • Close responses when task cancellations occur during stream reading. (#2156)
    • Fix type error on accessing .request on HTTPError exceptions. (#2158)

    0.22.0 (26th January, 2022)

    Added

    Fixed

    • Don't perform unreliable close/warning on __del__ with unclosed clients. (#2026)
    • Fix Headers.update(...) to correctly handle repeated headers (#2038)

    0.21.3 (6th January, 2022)

    Fixed

    • Fix streaming uploads using SyncByteStream or AsyncByteStream. Regression in 0.21.2. (#2016)

    0.21.2 (5th January, 2022)

    Fixed

    • HTTP/2 support for tunnelled proxy cases. (#2009)
    • Improved the speed of large file uploads. (#1948)

    0.21.1 (16th November, 2021)

    Fixed

    • The response.url property is now correctly annotated as URL, instead of Optional[URL]. (#1940)

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • refactor!: change binder API to modify OpenAPI schema in place

    refactor!: change binder API to modify OpenAPI schema in place

    This paves the path for more OpenAPI generation (security models and such) without bloating the API, at the cost of shifting some responsibilies to each implementer instead of centralizing them in the OpenAPI generation infra

    opened by adriangb 1
  • chore: simplify binder APIs by dropping support for generic field extractors

    chore: simplify binder APIs by dropping support for generic field extractors

    BREAKING_CHANGE: removed ExtractField and ExtractRepeatedField. Extracting JSON from a form field is no longer supported. Changes to generated OpenAPI.

    I think proving out the idea of very generic extractors (e.g.FromRepeatedFormField[FromJson[Model]]) was interesting. It also helped shape some APIs. But I don't think this is a feature I would use all that often, and so I would prefer to get some real world use cases form users before exposing these sorts of APIs. We can add these APIs in the future, but we can't remove them (without breaking changes).

    Removing this functionality (and refactoring the binder APIs and implementations) we can arrive at a much simpler system (2 interfaces / ~2 functions to implement the binder API), and reduce the package's codebase by ~15%.

    There's a lot more cleanup that needs to be done with tests after this (e.g. coverage for the file extractor); that will be done in subsequent changes.

    opened by adriangb 1
  • chore(deps): bump setuptools from 65.4.1 to 65.5.1

    chore(deps): bump setuptools from 65.4.1 to 65.5.1

    Bumps setuptools from 65.4.1 to 65.5.1.

    Changelog

    Sourced from setuptools's changelog.

    v65.5.1

    Misc ^^^^

    • #3638: Drop a test dependency on the mock package, always use :external+python:py:mod:unittest.mock -- by :user:hroncok
    • #3659: Fixed REDoS vector in package_index.

    v65.5.0

    Changes ^^^^^^^

    • #3624: Fixed editable install for multi-module/no-package src-layout projects.
    • #3626: Minor refactorings to support distutils using stdlib logging module.

    Documentation changes ^^^^^^^^^^^^^^^^^^^^^

    • #3419: Updated the example version numbers to be compliant with PEP-440 on the "Specifying Your Project’s Version" page of the user guide.

    Misc ^^^^

    • #3569: Improved information about conflicting entries in the current working directory and editable install (in documentation and as an informational warning).
    • #3576: Updated version of validate_pyproject.
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Make response scraping from return values pluggable

    Make response scraping from return values pluggable

    https://github.com/adriangb/xpresso/pull/106#discussion_r968491622

    While it is currently possible to use a combination of the reponse_factory parameter to Operation and explicitly setting the response schema via the responses parameter to Operation to support non-Pydantic responses, it is super boilerplatey and cumbersome.

    opened by adriangb 1
  • doc: binder example for msgspec

    doc: binder example for msgspec

    cc @jcrist

    I'm not covering a bunch of edge cases and additional features (empty bodies, include_in_schema=False, descriptions, etc.) nor am I covering doing the same thing for query/path/etc. params. I think it would be interesting as a 3rd party package though!

    opened by adriangb 3
  • Add section to the docs about ecosystem / ASGI integration?

    Add section to the docs about ecosystem / ASGI integration?

    I know it's still early days for Xpresso, but how about an ecosystem page in the docs?

    I know Piccolo is compatible, and there's bound to be other generic ASGI middleware etc which is known to work.

    Just an idea.

    opened by dantownsend 1
  • POC for security classes using Protocol

    POC for security classes using Protocol

    This uses Protocols to create "template classes": classes that give you errors if you don't implement all of the required class variables.

    This at least allows some typechecking of missing parameters and wrongly typed parameters

    Screenshot 2022-02-27 223825 Screenshot 2022-02-27 223609
    opened by adriangb 1
Releases(0.46.0)
  • 0.46.0(Dec 21, 2022)

    What's Changed

    • fix: rename things to match di>=0.73.0 and pin di by @adriangb in https://github.com/adriangb/xpresso/pull/112
    • chore: fix ci by removing httptools (doesn't build 3.11 wheels) by @adriangb in https://github.com/adriangb/xpresso/pull/113
    • fix: bump minimum Pydantic version for compatibility with 3.11 by @adriangb in https://github.com/adriangb/xpresso/pull/114
    • feat!: rename FromFile and File to FromRawBody and RawBody by @adriangb in https://github.com/adriangb/xpresso/pull/117

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.44.1...0.46.0

    Source code(tar.gz)
    Source code(zip)
  • 0.44.1(Oct 6, 2022)

  • 0.44.0(Oct 6, 2022)

    What's Changed

    • Update Starlette to >=0.21.0 by @adriangb in https://github.com/adriangb/xpresso/pull/108

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.43.0...0.44.0

    Source code(tar.gz)
    Source code(zip)
  • 0.43.0(Oct 5, 2022)

    What's Changed

    • Pin importlib-metadata by @adriangb in https://github.com/adriangb/xpresso/pull/110
    • don't run sync dependencies in threads by default by @adriangb in https://github.com/adriangb/xpresso/pull/109

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.42.3...0.43.0

    Source code(tar.gz)
    Source code(zip)
  • 0.42.3(Sep 12, 2022)

  • 0.42.2(Sep 12, 2022)

  • 0.42.1(Sep 9, 2022)

    What's Changed

    • fix minor typo in docs included -> include by @dantownsend in https://github.com/adriangb/xpresso/pull/102
    • chore: fix nightly tests by @adriangb in https://github.com/adriangb/xpresso/pull/105
    • doc: update examples to reflect dependency scope inference by @adriangb in https://github.com/adriangb/xpresso/pull/104

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.42.0...0.42.1

    Source code(tar.gz)
    Source code(zip)
  • 0.42.0(Aug 8, 2022)

    What's Changed

    • Incorporate scope inference by @adriangb in https://github.com/adriangb/xpresso/pull/101

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.41.2...0.42.0

    Source code(tar.gz)
    Source code(zip)
  • 0.41.2(Aug 3, 2022)

  • 0.41.1(Jun 2, 2022)

    What's Changed

    • chore: update lockfile by @adriangb in https://github.com/adriangb/xpresso/pull/98
    • chore(deps-dev): bump httpx from 0.18.1 to 0.23.0 by @dependabot in https://github.com/adriangb/xpresso/pull/99
    • fix: compatibility with pydantic master branch by @adriangb in https://github.com/adriangb/xpresso/pull/100

    New Contributors

    • @dependabot made their first contribution in https://github.com/adriangb/xpresso/pull/99

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.41.0...0.41.1

    Source code(tar.gz)
    Source code(zip)
  • 0.41.0(Apr 27, 2022)

    What's Changed

    • feat: support context managers for extractors by @adriangb in https://github.com/adriangb/xpresso/pull/95

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.40.0...0.41.0

    Source code(tar.gz)
    Source code(zip)
  • 0.40.0(Apr 22, 2022)

    What's Changed

    • refactor!: change binder API to modify OpenAPI schema in place by @adriangb in https://github.com/adriangb/xpresso/pull/94

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.39.0...0.40.0

    Source code(tar.gz)
    Source code(zip)
  • 0.39.0(Apr 22, 2022)

    What's Changed

    • Update query_params.py by @Kludex in https://github.com/adriangb/xpresso/pull/92
    • feat: allow binding of dependencies from within lifespans by @adriangb in https://github.com/adriangb/xpresso/pull/93

    New Contributors

    • @Kludex made their first contribution in https://github.com/adriangb/xpresso/pull/92

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.38.3...0.39.0

    Source code(tar.gz)
    Source code(zip)
  • 0.38.3(Apr 18, 2022)

  • 0.38.2(Apr 15, 2022)

  • 0.38.1(Apr 15, 2022)

  • 0.38.0(Apr 3, 2022)

  • 0.37.0(Apr 2, 2022)

  • 0.35.0(Apr 2, 2022)

  • 0.34.1(Mar 28, 2022)

  • 0.34.0(Mar 26, 2022)

  • 0.33.0(Mar 25, 2022)

  • 0.32.0(Mar 24, 2022)

    What's Changed

    • chore: simplify binder APIs by dropping support for generic field extractors by @adriangb in https://github.com/adriangb/xpresso/pull/90

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.31.1...0.32.0

    Source code(tar.gz)
    Source code(zip)
  • 0.31.1(Mar 17, 2022)

  • 0.31.0(Mar 17, 2022)

    What's Changed

    • feat: handle merging of response specs by @adriangb in https://github.com/adriangb/xpresso/pull/89

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.30.0...0.31.0

    Source code(tar.gz)
    Source code(zip)
  • 0.30.0(Mar 16, 2022)

    What's Changed

    • fix!: rename Config -> BaseConfig to avoid name collisions with pydantic.BaseSettings.Config by @adriangb in https://github.com/adriangb/xpresso/pull/88

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.29.0...0.30.0

    Source code(tar.gz)
    Source code(zip)
  • 0.29.0(Mar 13, 2022)

    What's Changed

    • feat: accept files as streams by @adriangb in https://github.com/adriangb/xpresso/pull/87

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.28.3...0.29.0

    Source code(tar.gz)
    Source code(zip)
  • 0.28.3(Mar 12, 2022)

    What's Changed

    • chore: cleanup Operation and Path by @adriangb in https://github.com/adriangb/xpresso/pull/86

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.28.2...0.28.3

    Source code(tar.gz)
    Source code(zip)
  • 0.28.2(Mar 11, 2022)

    What's Changed

    • fix: support starlette>=0.17.1 by @adriangb in https://github.com/adriangb/xpresso/pull/85

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.28.1...0.28.2

    Source code(tar.gz)
    Source code(zip)
  • 0.28.1(Mar 11, 2022)

    What's Changed

    • chore: remove importlib-metadata dependency by @adriangb in https://github.com/adriangb/xpresso/pull/84

    Full Changelog: https://github.com/adriangb/xpresso/compare/0.28.0...0.28.1

    Source code(tar.gz)
    Source code(zip)
Owner
Adrian Garcia Badaracco
Adrian Garcia Badaracco
The little ASGI framework that shines. ?

✨ The little ASGI framework that shines. ✨ Documentation: https://www.starlette.io/ Community: https://discuss.encode.io/c/starlette Starlette Starlet

Encode 7.7k Jan 1, 2023
Bablyon 🐍 A small ASGI web framework

A small ASGI web framework that you can make asynchronous web applications using uvicorn with using few lines of code

xArty 8 Dec 7, 2021
An abstract and extensible framework in python for building client SDKs and CLI tools for a RESTful API.

django-rest-client An abstract and extensible framework in python for building client SDKs and CLI tools for a RESTful API. Suitable for APIs made wit

Certego 4 Aug 25, 2022
A minimal, extensible, fast and productive API framework for Python 3.

molten A minimal, extensible, fast and productive API framework for Python 3. Changelog: https://moltenframework.com/changelog.html Community: https:/

Bogdan Popa 980 Nov 28, 2022
The lightning-fast ASGI server. ?

The lightning-fast ASGI server. Documentation: https://www.uvicorn.org Community: https://discuss.encode.io/c/uvicorn Requirements: Python 3.6+ (For P

Encode 6k Jan 3, 2023
Asita is a web application framework for python based on express-js framework.

Asita is a web application framework for python. It is designed to be easy to use and be more easy for javascript users to use python frameworks because it is based on express-js framework.

Mattéo 4 Nov 16, 2021
Pyrin is an application framework built on top of Flask micro-framework to make life easier for developers who want to develop an enterprise application using Flask

Pyrin A rich, fast, performant and easy to use application framework to build apps using Flask on top of it. Pyrin is an application framework built o

Mohamad Nobakht 10 Jan 25, 2022
The no-nonsense, minimalist REST and app backend framework for Python developers, with a focus on reliability, correctness, and performance at scale.

The Falcon Web Framework Falcon is a reliable, high-performance Python web framework for building large-scale app backends and microservices. It encou

Falconry 9k Jan 1, 2023
Free and open source full-stack enterprise framework for agile development of secure database-driven web-based applications, written and programmable in Python.

Readme web2py is a free open source full-stack framework for rapid development of fast, scalable, secure and portable database-driven web-based applic

null 2k Dec 31, 2022
Ape is a framework for Web3 Python applications and smart contracts, with advanced functionality for testing, deployment, and on-chain interactions.

Ape Framework Ape is a framework for Web3 Python applications and smart contracts, with advanced functionality for testing, deployment, and on-chain i

ApeWorX Ltd. 552 Dec 30, 2022
Bionic is Python Framework for crafting beautiful, fast user experiences for web and is free and open source

Bionic is fast. It's powered core python without any extra dependencies. Bionic offers stateful hot reload, allowing you to make changes to your code and see the results instantly without restarting your app or losing its state.

 ⚓ 0 Mar 5, 2022
Asynchronous HTTP client/server framework for asyncio and Python

Async http client/server framework Key Features Supports both client and server side of HTTP protocol. Supports both client and server Web-Sockets out

aio-libs 13.2k Jan 5, 2023
Fast, asynchronous and elegant Python web framework.

Warning: This project is being completely re-written. If you're curious about the progress, reach me on Slack. Vibora is a fast, asynchronous and eleg

vibora.io 5.7k Jan 8, 2023
Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.

Tornado Web Server Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. By using non-blocking ne

null 20.9k Jan 1, 2023
bottle.py is a fast and simple micro-framework for python web-applications.

Bottle: Python Web Framework Bottle is a fast, simple and lightweight WSGI micro web-framework for Python. It is distributed as a single file module a

Bottle Micro Web Framework 7.8k Dec 31, 2022
Sierra is a lightweight Python framework for building and integrating web applications

A lightweight Python framework for building and Integrating Web Applications. Sierra is a Python3 library for building and integrating web applications with HTML and CSS using simple enough syntax. You can develop your web applications with Python, taking advantage of its functionalities and integrating them to the fullest.

null 83 Sep 23, 2022
Flask Sugar is a web framework for building APIs with Flask, Pydantic and Python 3.6+ type hints.

Flask Sugar is a web framework for building APIs with Flask, Pydantic and Python 3.6+ type hints. check parameters and generate API documents automatically. Flask Sugar是一个基于flask,pyddantic,类型注解的API框架, 可以检查参数并自动生成API文档

null 162 Dec 26, 2022
Dazzler is a Python async UI/Web framework built with aiohttp and react.

Dazzler is a Python async UI/Web framework built with aiohttp and react. Create dazzling fast pages with a layout of Python components and bindings to update from the backend.

Philippe Duval 17 Oct 18, 2022
Lemon is an async and lightweight API framework for python

Lemon is an async and lightweight API framework for python . Inspired by Koa and Sanic .

Joway 29 Nov 20, 2022