🔥 Fire up your API with this flamethrower

Overview

Flama

🔥 Fire up your API.

CI Status Docs Status Coverage Package version PyPI - Python Version


Documentation: https://flama.perdy.io


Flama

Flama aims to bring a layer on top of Starlette to provide an easy to learn and fast to develop approach for building highly performant GraphQL and REST APIs. In the same way of Starlette is, Flama is a perfect option for developing asynchronous and production-ready services.

Among other characteristics it provides the following:

  • Generic classes for API resources that provides standard CRUD methods over SQLAlchemy tables.
  • Schema system based on Marshmallow that allows to declare the inputs and outputs of endpoints and provides a reliable way of validate data against those schemas.
  • Dependency Injection that ease the process of managing parameters needed in endpoints. Flama ASGI objects like Request, Response, Session and so on are defined as components and ready to be injected in your endpoints.
  • Components as the base of the plugin ecosystem, allowing you to create custom or use those already defined in your endpoints, injected as parameters.
  • Auto generated API schema using OpenAPI standard. It uses the schema system of your endpoints to extract all the necessary information to generate your API Schema.
  • Auto generated docs providing a Swagger UI or ReDoc endpoint.
  • Pagination automatically handled using multiple methods such as limit and offset, page numbers...

Requirements

Installation

$ pip install flama

Example

from marshmallow import Schema, fields, validate
from flama.applications import Flama
import uvicorn

# Data Schema
class Puppy(Schema):
    id = fields.Integer()
    name = fields.String()
    age = fields.Integer(validate=validate.Range(min=0))


# Database
puppies = [
    {"id": 1, "name": "Canna", "age": 6},
    {"id": 2, "name": "Sandy", "age": 12},
]


# Application
app = Flama(
    components=[],      # Without custom components
    title="Foo",        # API title
    version="0.1",      # API version
    description="Bar",  # API description
    schema="/schema/",  # Path to expose OpenAPI schema
    docs="/docs/",      # Path to expose Swagger UI docs
    redoc="/redoc/",    # Path to expose ReDoc docs
)


# Views
@app.route("/", methods=["GET"])
def list_puppies(name: str = None) -> Puppy(many=True):
    """
    description:
        List the puppies collection. There is an optional query parameter that 
        specifies a name for filtering the collection based on it.
    responses:
        200:
            description: List puppies.
    """
    return [puppy for puppy in puppies if name in (puppy["name"], None)]
    

@app.route("/", methods=["POST"])
def create_puppy(puppy: Puppy) -> Puppy:
    """
    description:
        Create a new puppy using data validated from request body and add it 
        to the collection.
    responses:
        200:
            description: Puppy created successfully.
    """
    puppies.append(puppy)
    
    return puppy


if __name__ == '__main__':
    uvicorn.run(app, host='0.0.0.0', port=8000)

Dependencies

Following Starlette philosophy Flama reduce the number of hard dependencies to those that are used as the core:

It does not have any more hard dependencies, but some of them are necessaries to use some features:

  • pyyaml - Required for API Schema and Docs auto generation.
  • apispec - Required for API Schema and Docs auto generation.
  • python-forge - Required for pagination.
  • sqlalchemy - Required for Generic API resources.
  • databases - Required for Generic API resources.

You can install all of these with pip3 install flama[full].

Credits

That library is heavily inspired by APIStar server in an attempt to bring a good amount of it essence to work with Starlette as the ASGI framework and Marshmallow as the schema system.

Contributing

This project is absolutely open to contributions so if you have a nice idea, create an issue to let the community discuss it.

Comments
  • Cannot import name 'ASGIInstance'

    Cannot import name 'ASGIInstance'

    Hi there,

    when trying out the example in the README, I get a strange import error for the typing module:

    Traceback (most recent call last):
      File "D:/projects/autogram/autogram/api/registrations.py", line 3, in <module>
        from flama.applications import Flama
      File "C:\Users\joscha.goetzer\.virtualenvs\autogram-PRYPx28t\lib\site-packages\flama\applications.py", line 12, in <module>
        from flama.injection import Injector
      File "C:\Users\joscha.goetzer\.virtualenvs\autogram-PRYPx28t\lib\site-packages\flama\injection.py", line 8, in <module>
        from flama.components.validation import VALIDATION_COMPONENTS
      File "C:\Users\joscha.goetzer\.virtualenvs\autogram-PRYPx28t\lib\site-packages\flama\components\validation.py", line 13, in <module>
        from flama.routing import Route
      File "C:\Users\joscha.goetzer\.virtualenvs\autogram-PRYPx28t\lib\site-packages\flama\routing.py", line 10, in <module>
        from starlette.types import ASGIApp, ASGIInstance, Receive, Scope, Send
    ImportError: cannot import name 'ASGIInstance'
    

    Am I missing something?

    opened by JosXa 7
  • Readme example is not working

    Readme example is not working

    Copy-pasting the example from readme produces this:

    INFO: ('127.0.0.1', 33118) - "GET / HTTP/1.1" 500
    ERROR: Exception in ASGI application
    Traceback (most recent call last):
      File "<venv>/lib/python3.7/site-packages/uvicorn/protocols/http/httptools_impl.py", line 372, in run_asgi
        result = await asgi(self.receive, self.send)
      File "<venv>/lib/python3.7/site-packages/starlette/middleware/errors.py", line 125, in asgi
        raise exc from None
      File "<venv>/lib/python3.7/site-packages/starlette/middleware/errors.py", line 103, in asgi
        await asgi(receive, _send)
      File "<venv>/lib/python3.7/site-packages/starlette/exceptions.py", line 74, in app
        raise exc from None
      File "<venv>/lib/python3.7/site-packages/starlette/exceptions.py", line 63, in app
        await instance(receive, sender)
      File "<venv>/lib/python3.7/site-packages/starlette_api/routing.py", line 168, in awaitable
        injected_func = await app.injector.inject(endpoint, state)
      File "<venv>/lib/python3.7/site-packages/starlette_api/injection.py", line 173, in inject
        state[output_name] = resolver(**kw)
      File "<venv>/lib/python3.7/site-packages/starlette_api/components/validation.py", line 79, in resolve
        query_params = validator().load(dict(query_params), unknown=marshmallow.EXCLUDE)
    AttributeError: module 'marshmallow' has no attribute 'EXCLUDE'
    

    UPD: I used starlette-api[full] for install

    opened by Spacehug 3
  • [Question] Documenting additional responses

    [Question] Documenting additional responses

    Do you have a way or have a way planned on how to document multiple responses from an endpoint?

    I would like to be able to document, for example, error responses from an endpoint such as BadRequest or validation errors and have that openapi information show up in the schema served to the swagger/redoc ui. It would also be nice to allow the @output_validation decorator could "validate" these as well if possible.

    For reference, another somewhat similar framework has the same open question: https://github.com/tiangolo/fastapi/issues/16

    Thanks for any info!

    opened by sherzberg 3
  • Improve README.md with examples on how to run it

    Improve README.md with examples on how to run it

    Hey, folks! :]

    It would be great if we had a basic example on how to run this, so it's easier to jump into and contribute as well. If I have the time, I can do it, but if someone had that already set up, it would be nice!

    Thanks!

    help wanted good first issue 
    opened by lucianoratamero 3
  • Not compatible with authentication ?

    Not compatible with authentication ?

    Hi there, I just try to plugin authentication from Starlette, but looks like this is not possible. From Starlette doc

    from starlette.authentication import requires
    
    @requires('authenticated')
    async def foobar(request, schema: Schema):
        pass
    

    This will raise error AttributeError: 'OpenAPIConverter' object has no attribute 'field2parameter' from flama/schemas.py Can't omit first parameter request cause that is required from the requires decorator for authentication. Any work around? Thanks

    opened by tricosmo 2
  • fix bugs around nested mounting

    fix bugs around nested mounting

    When using Mounts to nest routes any more than a single level deep, schema generation ignores all levels before the last and general routing completely blows up . This resolves those issues.

    example:

    app.mount('/api/', app=Router(routes=[                                                                                                                                                                                                     
        Mount('/v1/', app=Router(routes=[                                                              
            Mount('/check/', app=Router(routes=[                                                 
                Route('/', EligibilityEndpoint, app.router, methods=['GET']),       
                Route('/bulk/', BulkEligibilityEndpoint, app.router, methods=['POST']),          
            ])),                                                                                       
            Mount('/membership/', app=Router(routes=[                                                  
                Route('/purchase/', MembershipPurchaseEndpoint, app.router, methods=['POST']),        
            ])),                                                                                       
        ])),                                                                                           
    ]))
    
    opened by jsatt 2
  • marshmallow 3.0.0rc4 is not stable ?

    marshmallow 3.0.0rc4 is not stable ?

    Sorry, but I can't fix one issue because there is an issue with the dependencies and I don't know why.

    1. when I use poetry install for the installation of the dependencies, it tries to install marshmallow 3.0.0rc4, but in the pyproject.toml file, it's 2.19.0. But this is not the case in the poetry.lock file.

    and because I don't know poetry I have to learn the project and try to fix the issue with the dependency. Which version of marshmallow do you want to use? 3.0.0rc4 or 2.19.0 ?

    Thanks you

    opened by matrixise 2
  • Resource(many=True) and issubclass

    Resource(many=True) and issubclass

    I have added this test in tests/test_endpoints You can check here:

    https://github.com/PeRDy/starlette-api/compare/master...matrixise:test_resources_many

        def test_nested_api(self, app, client):
            class Resource(marshmallow.Schema):
                name = marshmallow.fields.String()
    
            @app.route('/resources', methods=['GET'])
            class ResourcesHTTPEndpoint(HTTPEndpoint):
                async def get(self) -> Resource(many=True):
                    return [{'name': 'Name'}]
            response = client.get('/resources')
            assert response.status_code == 200
    

    but I get this exception because you are waiting for a class and not an instance, but in the case of Resource(many=True) it's an instance.

    Do you know why?

    tests/test_endpoints.py:92: 
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    ../../../../.virtualenvs/tempenv-713715370977/lib/python3.7/site-packages/requests/sessions.py:546: in get
        return self.request('GET', url, **kwargs)
    ../../../../.virtualenvs/tempenv-713715370977/lib/python3.7/site-packages/starlette/testclient.py:382: in request
        json=json,
    ../../../../.virtualenvs/tempenv-713715370977/lib/python3.7/site-packages/requests/sessions.py:533: in request
        resp = self.send(prep, **send_kwargs)
    ../../../../.virtualenvs/tempenv-713715370977/lib/python3.7/site-packages/requests/sessions.py:646: in send
        r = adapter.send(request, **kwargs)
    ../../../../.virtualenvs/tempenv-713715370977/lib/python3.7/site-packages/starlette/testclient.py:211: in send
        raise exc from None
    ../../../../.virtualenvs/tempenv-713715370977/lib/python3.7/site-packages/starlette/testclient.py:208: in send
        loop.run_until_complete(connection(receive, send))
    /usr/lib64/python3.7/asyncio/base_events.py:584: in run_until_complete
        return future.result()
    ../../../../.virtualenvs/tempenv-713715370977/lib/python3.7/site-packages/starlette/middleware/errors.py:125: in asgi
        raise exc from None
    ../../../../.virtualenvs/tempenv-713715370977/lib/python3.7/site-packages/starlette/middleware/errors.py:103: in asgi
        await asgi(receive, _send)
    ../../../../.virtualenvs/tempenv-713715370977/lib/python3.7/site-packages/starlette/exceptions.py:74: in app
        raise exc from None
    ../../../../.virtualenvs/tempenv-713715370977/lib/python3.7/site-packages/starlette/exceptions.py:63: in app
        await instance(receive, sender)
    starlette_api/endpoints.py:37: in __call__
        response = await self.dispatch(request, state, **kwargs)
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    
    self = <tests.test_endpoints.TestCaseHTTPEndpoint.test_nested_api.<locals>.ResourcesHTTPEndpoint object at 0x7f0193c775c0>, request = <starlette.requests.Request object at 0x7f0193c776a0>
    state = {'app': <starlette_api.applications.Starlette object at 0x7f0193c52cf8>, 'exc': None, 'path_params': {}, 'receive': <function _ASGIAdapter.send.<locals>.receive at 0x7f0193ca7bf8>, ...}
    kwargs = {}, handler_name = 'get'
    handler = <bound method TestCaseHTTPEndpoint.test_nested_api.<locals>.ResourcesHTTPEndpoint.get of <tests.test_endpoints.TestCaseHTTPEndpoint.test_nested_api.<locals>.ResourcesHTTPEndpoint object at 0x7f0193c775c0>>
    app = <starlette_api.applications.Starlette object at 0x7f0193c52cf8>
    injected_func = functools.partial(<bound method TestCaseHTTPEndpoint.test_nested_api.<locals>.ResourcesHTTPEndpoint.get of <tests.test_endpoints.TestCaseHTTPEndpoint.test_nested_api.<locals>.ResourcesHTTPEndpoint object at 0x7f0193c775c0>>)
    response = [{'name': 'Name'}], return_annotation = <Resource(many=True)>
    
        async def dispatch(self, request: Request, state: typing.Dict, **kwargs) -> Response:
            handler_name = "get" if request.method == "HEAD" else request.method.lower()
            handler = getattr(self, handler_name, self.method_not_allowed)
        
            app = state["app"]
            injected_func = await app.injector.inject(handler, state)
        
            if asyncio.iscoroutinefunction(handler):
                response = await injected_func()
            else:
                response = injected_func()
        
            return_annotation = inspect.signature(handler).return_annotation
    >       if issubclass(return_annotation, marshmallow.Schema):
    E       TypeError: issubclass() arg 1 must be a class
    
    app        = <starlette_api.applications.Starlette object at 0x7f0193c52cf8>
    handler    = <bound method TestCaseHTTPEndpoint.test_nested_api.<locals>.ResourcesHTTPEndpoint.get of <tests.test_endpoints.TestCaseHTTPEndpoint.test_nested_api.<locals>.ResourcesHTTPEndpoint object at 0x7f0193c775c0>>
    handler_name = 'get'
    injected_func = functools.partial(<bound method TestCaseHTTPEndpoint.test_nested_api.<locals>.ResourcesHTTPEndpoint.get of <tests.test_endpoints.TestCaseHTTPEndpoint.test_nested_api.<locals>.ResourcesHTTPEndpoint object at 0x7f0193c775c0>>)
    kwargs     = {}
    request    = <starlette.requests.Request object at 0x7f0193c776a0>
    response   = [{'name': 'Name'}]
    return_annotation = <Resource(many=True)>
    self       = <tests.test_endpoints.TestCaseHTTPEndpoint.test_nested_api.<locals>.ResourcesHTTPEndpoint object at 0x7f0193c775c0>
    state      = {'app': <starlette_api.applications.Starlette object at 0x7f0193c52cf8>, 'exc': None, 'path_params': {}, 'receive': <function _ASGIAdapter.send.<locals>.receive at 0x7f0193ca7bf8>, ...}
    
    starlette_api/endpoints.py:54: TypeError
    

    Thank you,

    opened by matrixise 2
  • TypeError with route_scope in endpoints.py

    TypeError with route_scope in endpoints.py

    Hi,

    Here is a very small example when I try to construct an API with starlette-api but I get an error, could you tell me where my error is?

    Thank you

    import pytest
    from marshmallow import Schema
    from marshmallow import fields
    from starlette.testclient import TestClient
    from starlette_api.applications import Starlette
    from starlette_api.endpoints import HTTPEndpoint
    from starlette_api.routing import Router
    
    class RunnerSchema(Schema):
        id = fields.Integer()
        name = fields.String()
        token = fields.String()
    
    class RunnerEndpoint(HTTPEndpoint):
        async def get(self) -> RunnerSchema():
            return {"id": 1, "name": "name", "token": "token"}
    
    def create_app():
        app = Starlette(
            components=[],
            title="Foo",
            version="0.1",
            description="Foo",
            schema=False,
            docs=False,
            debug=False,
        )
    
        api = Router()
        api.add_route("/runners", RunnerEndpoint, methods=["GET"])
        app.mount("/api/v4", api)
    
        return app
    
    @pytest.fixture(scope="function")
    def app():
        return create_app()
    
    
    @pytest.fixture(scope="function")
    def client(app):
        return TestClient(app)
    
    def test_get_runners(client):
        response = client.get("/api/v4/runners")
    
        assert response.status_code == 200
        assert response.json() == {"id": 1, "name": "name", "token": "token"}
    

    Result of pytest

    self = <test_app.RunnerEndpoint object at 0x7f5dcb6c5588>, receive = <function _ASGIAdapter.send.<locals>.receive at 0x7f5dcb16d8c8>
    send = <function ExceptionMiddleware.__call__.<locals>.app.<locals>.sender at 0x7f5dcb6c7620>
    
        async def __call__(self, receive: Receive, send: Send):
            request = Request(self.scope, receive=receive)
            app = self.scope["app"]
            kwargs = self.scope.get("kwargs", {})
        
            route, route_scope = app.router.get_route_from_scope(self.scope)
        
            state = {
                "scope": self.scope,
                "receive": receive,
                "send": send,
                "exc": None,
                "app": app,
    >           "path_params": route_scope["path_params"],
                "route": route,
                "request": request,
            }
    E       TypeError: 'NoneType' object is not subscriptable
    
    app        = <starlette_api.applications.Starlette object at 0x7f5dcb6ab860>
    kwargs     = {}
    receive    = <function _ASGIAdapter.send.<locals>.receive at 0x7f5dcb16d8c8>
    request    = <starlette.requests.Request object at 0x7f5dcb702a90>
    route      = <bound method Router.not_found of <starlette_api.routing.Router object at 0x7f5dcb6ab978>>
    route_scope = None
    self       = <test_app.RunnerEndpoint object at 0x7f5dcb6c5588>
    send       = <function ExceptionMiddleware.__call__.<locals>.app.<locals>.sender at 0x7f5dcb6c7620>
    

    Version of starlette

    starlette==0.11.3
    starlette-api==0.5.0
    
    opened by matrixise 2
  • request syntax in flama

    request syntax in flama

    objective can have api from cli e.g. request.headers['api_key'] curl -X GET -i http://localhost:8000/api/http_api_key/instrument/ -H 'api_key: stifix' request.query_params curl -X PUT -i "http://localhost:8000/api/put/instrument/2?name=name0&strings=0" request.form() curl -X PUT -d "name=name1&strings=1" -i http://localhost:8000/api/put/instrument/2 request.json() curl -X PUT -d '{"name": "name2", "strings": 2}' -i http://localhost:8000/api/put_json/instrument/2

    in starlette we can use request e.g.

    def test(request):
        request.headers['api_key']
        request.query_params
        request.form()
        request.json()
    

    since flama is base on starlette, what is equivalent of starlette request above ?

    thanks

    opened by sugizo 1
  • Branding: remove

    Branding: remove "with this flamethrower" tagline

    The branding/logo of this project is great and "Flama" is a nicer name than its FastAPI competitor. However, the "with this flamethrower" tagline is overly narrow. Why is an API like a flamethrower? Just ends up sounding weird.

    I suggest you just make the tagline "Fire up your API". Simple.

    opened by davenquinn 1
  • Enhanced model serialisation

    Enhanced model serialisation

    At the moment, the model serialisation builds a binary which contains:

    • lib: ModelFormat
    • model: typing.Any

    Whilst this is OK, and it's allowed us keep making progress, we might highly benefit from having a much richer structure. Our previous discussion seems to point at something like:

    {
    	"data": {
    		"binary": b"...",
    	},
    	"meta": {
    		"id": ...,
    		"timestamp": ...,
    		"framework": {
    			"lib": "...",
    			"version": "...",
    		},
    		"model": {
    				"class": "...",
    				"info": {**info},
    				"params": {**hyperparams},
    				"metrics": {**metrics},
    		},
    		"extra": {
    			**free_info
    		},
    	},
    }
    

    This will change the current implementation in model.py. Essentially, it will have to extend the dataclass:

    @dataclasses.dataclass(frozen=True)
    class Model:
        """ML Model wrapper to provide mechanisms for serialization and deserialization using Flama format."""
    
        lib: ModelFormat
        model: typing.Any
    

    to accomodate the previous JSON structure.

    Helpful links:

    • pytorch: https://stackoverflow.com/questions/42480111/how-do-i-print-the-model-summary-in-pytorch
    • keras/tensorflow:
      model.output_shape # model summary representation
      model.summary() # model configuration
      model.get_config() # list all weight tensors in the model
      model.get_weights() # get weights and biases
      
    enhancement 
    opened by migduroli 0
  • Allow declarative routing

    Allow declarative routing

    Modify how Routes and Routers are initialized and how are handling the main application to allow declarative routing for all Routes types.

    An example of the goal syntax:

    class PuppyResource(BaseResource, metaclass=CRUDResource):
        name = "puppy"
        model = puppy_model
        schema = puppy_schema
    
    routes = [
        Route("/", root_mock),
        ResourceRoute("/", PuppyResource),
        Mount("/foo", routes=[
            Route("/", foo_mock, methods=["GET"]),
            Route("/view", foo_view_mock, methods=["GET"])
        ])
    ]
    
    app = Flama(routes=routes)
    
    enhancement 
    opened by perdy 0
Releases(v0.16.0)
Owner
José Antonio Perdiguero
Artificial Intelligence Engineer & Software Architect
José Antonio Perdiguero
An easy-to-use high-performance asynchronous web framework.

中文 | English 一个易用的高性能异步 web 框架。 Index.py 文档 Index.py 实现了 ASGI3 接口,并使用 Radix Tree 进行路由查找。是最快的 Python web 框架之一。一切特性都服务于快速开发高性能的 Web 服务。 大量正确的类型注释 灵活且高效的

Index.py 264 Dec 31, 2022
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

2k Dec 31, 2022
Web framework based on type hint。

Hint API 中文 | English 基于 Type hint 的 Web 框架 hintapi 文档 hintapi 实现了 WSGI 接口,并使用 Radix Tree 进行路由查找。是最快的 Python web 框架之一。一切特性都服务于快速开发高性能的 Web 服务。 大量正确的类型

Aber 19 Dec 02, 2022
Phoenix LiveView but for Django

Reactor, a LiveView library for Django Reactor enables you to do something similar to Phoenix framework LiveView using Django Channels. What's in the

Eddy Ernesto del Valle Pino 526 Jan 02, 2023
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框架

162 Dec 26, 2022
The web framework for inventors

Emmett is a full-stack Python web framework designed with simplicity in mind. The aim of Emmett is to be clearly understandable, easy to be learned an

Emmett 796 Dec 26, 2022
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
web.py is a web framework for python that is as simple as it is powerful.

web.py is a web framework for Python that is as simple as it is powerful. Visit http://webpy.org/ for more information. The latest stable release 0.62

5.8k Dec 30, 2022
Loan qualifier app - Loan Qualifier Application Built With Python

Loan Qualifier Application This program is designed to automate the discovery pr

Phil Hills 1 Jan 04, 2022
News search API developed for the purposes of the ColdCase Project.

Saxion - Cold Case - News Search API Setup Local – Linux/MacOS Make sure you have python 3.9 and pip 21 installed. This project uses a MySQL database,

Dimitar Rangelov 3 Jul 01, 2021
A high-level framework for building GitHub applications in Python.

A high-level framework for building GitHub applications in Python. Core Features Async Proper ratelimit handling Handles interactions for you (

Vish M 3 Apr 12, 2022
A beginners course for Django

The Definitive Django Learning Platform. Getting started with Django This is the code from the course "Getting Started With Django", found on YouTube

JustDjango 288 Jan 08, 2023
A public API written in Python using the Flask web framework to determine the direction of a road sign using AI

python-public-API This repository is a public API for solving the problem of the final of the AIIJC competition. The task is to create an AI for the c

Lev 1 Nov 08, 2021
Persistent remote applications for X11; screen sharing for X11, MacOS and MSWindows.

Table of Contents About Installation Usage Help About Xpra is known as "screen for X" : its seamless mode allows you to run X11 programs, usually on a

xpra.org 785 Dec 30, 2022
Official mirror of https://gitlab.com/pgjones/quart

Quart Quart is an async Python web microframework. Using Quart you can, render and serve HTML templates, write (RESTful) JSON APIs, serve WebSockets,

Phil Jones 2 Oct 05, 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
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

⚓ 0 Mar 05, 2022
NO LONGER MAINTAINED - A Flask extension for creating simple ReSTful JSON APIs from SQLAlchemy models.

NO LONGER MAINTAINED This repository is no longer maintained due to lack of time. You might check out the fork https://github.com/mrevutskyi/flask-res

1k Jan 04, 2023
TinyAPI - 🔹 A fast & easy and lightweight WSGI Framework for Python

TinyAPI - 🔹 A fast & easy and lightweight WSGI Framework for Python

xArty 3 Apr 08, 2022
Django Ninja - Fast Django REST Framework

Django Ninja is a web framework for building APIs with Django and Python 3.6+ type hints.

Vitaliy Kucheryaviy 3.8k Jan 02, 2023