Django Ninja - Fast Django REST Framework

Overview

Fast to learn, fast to code, fast to run

Test Coverage PyPI version

Django Ninja - Fast Django REST Framework

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

Key features:

  • Easy: Designed to be easy to use and intuitive.
  • FAST execution: Very high performance thanks to Pydantic and async support.
  • Fast to code: Type hints and automatic docs lets you focus only on business logic.
  • Standards-based: Based on the open standards for APIs: OpenAPI (previously known as Swagger) and JSON Schema.
  • Django friendly: (obviously) has good integration with the Django core and ORM.
  • Production ready: Used by multiple companies on live projects (If you use django-ninja and would like to publish your feedback, please email [email protected]).

Django Ninja REST Framework

Documentation: https://django-ninja.rest-framework.com


Installation

pip install django-ninja

Usage

In your django project next to urls.py create new api.py file:

from ninja import NinjaAPI

api = NinjaAPI()


@api.get("/add")
def add(request, a: int, b: int):
    return {"result": a + b}

Now go to urls.py and add the following:

...
from .api import api

urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/", api.urls),  # <---------- !
]

That's it !

Now you've just created an API that:

  • receives an HTTP GET request at /api/add
  • takes, validates and type-casts GET parameters a and b
  • decodes the result to JSON
  • generates an OpenAPI schema for defined operation

Interactive API docs

Now go to http://127.0.0.1:8000/api/docs

You will see the automatic interactive API documentation (provided by Swagger UI):

Swagger UI

What next?

Issues
  • Authentication Docs Error

    Authentication Docs Error

    image image

    I am trying to use Django Auth system, but the Docs are not working on POST/PUT requests and also on Django core admin requests.

    Config:

    api = NinjaAPI(csrf=True, auth=[django_auth])
    

    The only way I could do to access and execute a POST on the Swagger documentation is by adding @csrf_exempt decorator from django.views.decorators.csrf

    @router.delete('/v1/auth/logout/', auth=None)
    def auth_logout(request):
        logout(request)
        resp = HttpResponseRedirect('/')
        # trocar o método para GET -> 303
        resp.status_code = 303
        return resp
    
    
    @router.post('/v1/auth/status/')
    @csrf_exempt
    def auth_status(request):
        if request.user.is_authenticated:
            return True
        else:
            return HttpError(401, 'Unauthenticated')
    

    I already tryed commenting django.middleware.csrf.CsrfViewMiddleware, but doest work.

    Is there a way to use django_sessions with documentation working on POST requests and default admin endpoints? if not, just allow us to use django_auth without forcing to enable CSRF token pls.

    opened by luizfelipevbll 13
  • Unable to upload file (always get 'field required' message)

    Unable to upload file (always get 'field required' message)

    Hi @vitalik, I'm trying to upload a file but it's always getting a "field required" message.

    Screenshot from 2021-08-15 08-55-14

    Handler:

    FileParam = File
    def file_create(request: HttpRequest,
            name: str = FileParam(..., max_length=100),
            description: Optional[str] = FileParam(None, max_length=500),
            file: UploadedFile = FileParam(...),
            folder: Optional[UUID] = FileParam(None)
        ):
    

    Has anything been missed?

    opened by aprilahijriyan 12
  • foreign-key value failed to be valid integer in NinjaResponseSchema

    foreign-key value failed to be valid integer in NinjaResponseSchema

    ValidationError at /api/order/orders
    6 validation errors for NinjaResponseSchema
    response -> 0 -> customer_id
      value is not a valid integer (type=type_error.integer)
    response -> 0 -> vendor_id
      value is not a valid integer (type=type_error.integer)
    response -> 0 -> vender_product_id
      value is not a valid integer (type=type_error.integer)
    response -> 1 -> customer_id
      value is not a valid integer (type=type_error.integer)
    response -> 1 -> vendor_id
      value is not a valid integer (type=type_error.integer)
    response -> 1 -> vender_product_id
      value is not a valid integer (type=type_error.integer)
    

    my schema is like this:

    class OrderSchema(Schema):
        customer_id: int
        vendor_id: int
        vender_product_id: int
        total_product: int
        total_price: int
        created_on: datetime
        updated_on: datetime
    
    opened by Ismaili1995 10
  • Casting response body onto schema

    Casting response body onto schema

    I can see Ninja does quite good job in casting requests into Schemas together with type casting. Can I also return some object that will then be casted onto some other defined Schema ie to filter off some sensitive attributes? Something like response_model functionality from Fastapi: https://fastapi.tiangolo.com/tutorial/response-model/

    design 
    opened by simplynail 9
  • Looks like you created multiple NinjaAPIs

    Looks like you created multiple NinjaAPIs

    Hi there, I was playing around a bit with the basic tutorial (it worked perfectly in the beginning) and got this error at some point:

      File "/django/django_aia_backend/django_aia_backend/urls.py", line 31, in <module>
        path('api/', include(api.urls)),
      File "/djangovenv/lib/python3.9/site-packages/ninja/main.py", line 314, in urls
        self._validate()
      File "/djangovenv/lib/python3.9/site-packages/ninja/main.py", line 398, in _validate
        raise ConfigError("\n".join(msg))
    ninja.errors.ConfigError: Looks like you created multiple NinjaAPIs
    To let ninja distinguish them you need to set either unique version or url_namespace
     - NinjaAPI(..., version='2.0.0')
     - NinjaAPI(..., urls_namespace='otherapi')
    Already registered: ['api-1.0.0']
    

    not sure what is the problem here. I only have one instantiation of NinjaAPI. I tried giving it a specific version name but that does not change anything.

    To be fair, I played around a bit before, among other things creating a django app called 'api' for using standard DRF. I deleted this and every reference to it, but even after starting a brand new django project, the error persists. Does the api instantiation get persisted somewhere in venv? I cannot explain otherwise why this happens.

    opened by Raketuv 9
  • Add custom schemas to Swagger UI

    Add custom schemas to Swagger UI

    Hey!

    Is there a way to append schemas which aren't shown in Swagger?

    I've coded a trick from #86 to use a complex object in the GET query but a schema I've specified is not in generated Swagger docs as it's not a real Schema for django-ninja, it's just a string field. I had a look at Router and NinjaAPI methods but couldn't find something similar to "add_schema".

    opened by igoose1 9
  • [proposal] Models to Schemas

    [proposal] Models to Schemas

    Read full proposal here - http://django-ninja.rest-framework.com/proposals/models/

    To make it possible to convert django models to ninja Schemas:

    from ninja import ModelSchema
    
    class UserOut(ModelSchema):
        class Meta:
            model = User
            fields = ['email', 'first_name', 'last_name']
    
    

    This feature will definitely land soon to production code

    But there is just one open question:

    configuration class - should it be Meta (django way) or Config (pydantic way) ?

    design 
    opened by vitalik 9
  • create_schema: ValueError: cannot specify both default and default_factory

    create_schema: ValueError: cannot specify both default and default_factory

    Hi, i have this error, after clone my repo and run python manage.py migrate

    Watching for file changes with StatReloader
    Performing system checks...
    
    Exception in thread django-main-thread:
    Traceback (most recent call last):
      File "/home/me/.pyenv/versions/3.8.9/lib/python3.8/threading.py", line 932, in _bootstrap_inner
        self.run()
      File "/home/me/.pyenv/versions/3.8.9/lib/python3.8/threading.py", line 870, in run
        self._target(*self._args, **self._kwargs)
      File "/home/me/myproject/.venv/lib/python3.8/site-packages/django/utils/autoreload.py", line 64, in wrapper
        fn(*args, **kwargs)
      File "/home/me/myproject/.venv/lib/python3.8/site-packages/django/core/management/commands/runserver.py", line 118, in inner_run
        self.check(display_num_errors=True)
      File "/home/me/myproject/.venv/lib/python3.8/site-packages/django/core/management/base.py", line 419, in check
        all_issues = checks.run_checks(
      File "/home/me/myproject/.venv/lib/python3.8/site-packages/django/core/checks/registry.py", line 76, in run_checks
        new_errors = check(app_configs=app_configs, databases=databases)
      File "/home/me/myproject/.venv/lib/python3.8/site-packages/django/core/checks/urls.py", line 13, in check_url_config
        return check_resolver(resolver)
      File "/home/me/myproject/.venv/lib/python3.8/site-packages/django/core/checks/urls.py", line 23, in check_resolver
        return check_method()
      File "/home/me/myproject/.venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 412, in check
        for pattern in self.url_patterns:
      File "/home/me/myproject/.venv/lib/python3.8/site-packages/django/utils/functional.py", line 48, in __get__
        res = instance.__dict__[self.name] = self.func(instance)
      File "/home/me/myproject/.venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 598, in url_patterns
        patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
      File "/home/me/myproject/.venv/lib/python3.8/site-packages/django/utils/functional.py", line 48, in __get__
        res = instance.__dict__[self.name] = self.func(instance)
      File "/home/me/myproject/.venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 591, in urlconf_module
        return import_module(self.urlconf_name)
      File "/home/me/.pyenv/versions/3.8.9/lib/python3.8/importlib/__init__.py", line 127, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
      File "<frozen importlib._bootstrap>", line 991, in _find_and_load
      File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 783, in exec_module
      File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
      File "/home/me/myproject/backend/urls.py", line 4, in <module>
        from .api import api
      File "/home/me/myproject/backend/api.py", line 3, in <module>
        from backend.product.api import router as product_router
      File "/home/me/myproject/backend/product/api.py", line 11, in <module>
        ProductSchema = create_schema(Product)
      File "/home/me/myproject/.venv/lib/python3.8/site-packages/ninja/orm/factory.py", line 57, in create_schema
        create_pydantic_model(name, __base__=Schema, **definitions),  # type: ignore
      File "pydantic/main.py", line 990, in pydantic.main.create_model
      File "pydantic/main.py", line 299, in pydantic.main.ModelMetaclass.__new__
      File "pydantic/fields.py", line 403, in pydantic.fields.ModelField.infer
      File "pydantic/fields.py", line 388, in pydantic.fields.ModelField._get_field_info
      File "pydantic/fields.py", line 173, in pydantic.fields.FieldInfo._validate
    ValueError: cannot specify both default and default_factory
    
    opened by rg3915 9
  • "none is not an allowed value"

    I found an error on the part of pydantic Example:

    
    # model.py
    TestModel(models.Model):
        revenue_total = models.FloatField(default=0, null=True, blank=True)
    
    # schemas.py
    TestSchema = create_schema(TestModel)
    
    # api.py
    @api.get("/tests", response=List[TestSchema])
    def get_tests(request):
        return TestModel.objects.all()
    

    output:

    Traceback (most recent call last):
      File "venv/lib/python3.8/site-packages/ninja/operation.py", line 94, in run
        return self._result_to_response(request, result)
      File "venv/lib/python3.8/site-packages/ninja/operation.py", line 177, in _result_to_response
        result = response_model.from_orm(resp_object).dict(
      File "pydantic/main.py", line 631, in pydantic.main.BaseModel.from_orm
    pydantic.error_wrappers.ValidationError: 1 validation error for NinjaResponseSchema
    response -> 5 -> revenue_total
      none is not an allowed value (type=type_error.none.not_allowed)
    

    exception if the value in db is NULL

    opened by 2ik 7
  • Resolve #103, Path params with Django converters

    Resolve #103, Path params with Django converters

    A basic resolution for Django path converters. It currently adds Custom Path Converters if they are annotated.

    opened by stephenrauch 7
  • Documentation about unit tests

    Documentation about unit tests

    I'm quite new to django, and now I'm working on a django project and I want to use django-ninja. However, I could not find much documentation about how to make unit tests using this framework. Is there any? Maybe it could be good to add some in the official documentation.

    documentation 
    opened by lgabs 1
  • [proposal] Best efforts to merge this project with FastAPI

    [proposal] Best efforts to merge this project with FastAPI

    Django Ninja is amazing and I love it so far. Without it, I would NOT have used FastAPI instead, because with the later, I didn't find any way to integrate Django ORM, and learning a new ORM was a deal breaker for me.

    That being said, after reading the Django Ninja Motivation page, I have the intuition that it would be possible to have the Django ninja features directly implemented in FastAPI (or vice versa). As I said, it's an intuition, I may be wrong, and I don't know how hard this would be.

    But both projects are relatively new and small. They need traction and people to work on to improve. In that sense, I think collaboration will always be superior to competition. That's why my proposal is to ensure that the reason there are currently 2 projects, is that it's actually impossible or irrelevant to merge them. My proposal is to keep a constant eye on this opportunity, to gather forces rather than split them if it's possible.

    opened by ddahan 1
  • Using a source attribute in schemas?

    Using a source attribute in schemas?

    I'm in the middle of migrating a Django Rest Framework API to Django ninja.

    What is the workaround to the source keyword used in DRF, which does not seem to exist with Django ninja?

    For example for this DRF code:

    class RecipeSerializer(serializers.ModelSerializer):
        name = serializers.CharField(source="item.name")
        cooking_tools = CookingToolSerializer(many=True)
    
    class RecipeSchema(ModelSchema):
        name: str # Obviously, it can NOT work as the `name` attribute belongs to `Item` model, not a `Recipe` model.
        cooking_tools: List[CookingToolSchema]
    

    Any idea? Thanks.

    opened by ddahan 6
  • [Bug]   pydantic json_encoder is ignored  (is it bug or feature?)

    [Bug] pydantic json_encoder is ignored (is it bug or feature?)

    example

    override json_encoders

    class HelloResponseSchema(NinjaSchema):
        aa_datetime : datetime
    
        class Config(NinjaSchema.Config):
            json_encoders = {
                datetime: lambda v: datetime_to_utc_isoformat(v),
            }
    
    ...
    
    @app.get("/aaa")
    def api_aaa():
         return 200 , HelloResponseSchema(...)
    
    
    

    api_aaa API Response's datetime field should not be isoformat because NinjaJsonEncoder does not use pydantic.json()

    
    # ninja   responses.py
    
    class NinjaJSONEncoder(DjangoJSONEncoder):
        def default(self, o: Any) -> Any:
            if isinstance(o, BaseModel):
                return o.dict()
            return super().default(o)
    
    
    class Response(JsonResponse):
        def __init__(self, data: Any, **kwargs: Any) -> None:
            super().__init__(data, encoder=NinjaJSONEncoder, safe=False, **kwargs)
    
    

    is it bug or feature?

    opened by KimSoungRyoul 0
  • [proposal] need DATETIME_FORMAT to ninja Schema

    [proposal] need DATETIME_FORMAT to ninja Schema

    maybe I think that Datetime format is useful feature like drf settings (https://www.django-rest-framework.org/api-guide/settings/#date-and-time-formatting)

    proposal 1 with Pydantic Config

    
    api =NinjaAPI(
       ...
      renderer= ....
      ...
      config= Config(
          DATETIME_FORMAT = "%Y-%M-%D HH:MM:SS",
          DATE_FORMAT = "%Y-%M-%D",
          TIME_FORMAT = "%Y-%M-%D HH:MM:SS",
      )
    )
    

    or. it can use it using django config.

    
    # settings.py 
    
    DJANGO_NINJA =  {
          ....
          "DATETIME_FORMAT": "%Y-%M-%D HH:MM:SS",
          "DATE_FORMAT": "%Y-%M-%D",
          "TIME_FORMAT": "%Y-%M-%D HH:MM:SS",
    
    }
    
    

    if you think it's necessary, can i pull request and request review?

    opened by KimSoungRyoul 7
  • Ordering of routes affecting pytest using django test client

    Ordering of routes affecting pytest using django test client

    Hi, when running pytest the order which the routes are defined affects if the method can be used or not.

    test_obj.py

    import pytest
    MYMODEL = "/api/mymodel"
    
    @pytest.mark.django_db
    def test_list(client):
        resp = client.get(f"{MYMODEL}/")
        assert resp.status_code == 200
    
    
    @pytest.mark.django_db
    def test_get(client):
        id = 1
        resp = client.get(f"{MYMODEL}/{id}")
        assert resp.status_code == 200
    
    @pytest.mark.django_db
    def test_delete(client):
        resp = client.delete(f"{MYMODEL}/{id}")
        assert resp.status_code == 200
    

    api/object.py

    from typing import List
    from django.shortcuts import get_object_or_404
    from project.schemas import MyModelSchema
    from project.models import MyModel
    from ninja import Query, Router
    
    
    router = Router(tags=["mymodel"])
    
    
    @router.get("/", response=List[MyModelSchema])
    def list_objects(request):
        qs = MyModel.objects.all()
        return qs
    
    @router.delete("/{id}")
    def delete(request, id: str):
        instance = get_object_or_404(MyModel, id=id)
        instance.delete()
        return {"success": True}
    
    
    @router.get("/{id}", response=MyModelSchema)
    def get(request, id: str):
        instance = get_object_or_404(MyModel, id=id)
        return instance
    

    When delete is defined above get, the test_get tests fails with the stderr: Method Not Allowed: /api/mymodel/1, and vice versa if you reorder get above delete. Somehow the test client does not register that the two routes are defined with different methods on the same endpoint.

    Thank you for an otherwise great project.

    opened by robinsandstrom 4
  • Method Not Allowed: ...

    Method Not Allowed: ...

    That's a strange thing, somehow the order of handlers in a file affect request object.

    for example:

    @api.get("/{id}", response=UserRead, tags=["read"])
    async def get_user_by_id(request, id: int) -> UserRead: # noqa
        user = await UserCRUD().get_by_id(id)
        if not user:
            raise HttpError(404, "User not found")
    
        return user
    
    
    @api.put("/change_password", response=UserPasswordChanged)
    async def change_password(request, user_password: UserPassword) -> UserPasswordChanged: # noqa
        changed = await UserCRUD().change_password(request, user_password=user_password)
    
        return UserPasswordChanged(changed=changed)
    

    returns Method not allowed

    @api.put("/change_password", response=UserPasswordChanged)
    async def change_password(request, user_password: UserPassword) -> UserPasswordChanged: # noqa
        changed = await UserCRUD().change_password(request, user_password=user_password)
    
        return UserPasswordChanged(changed=changed)
    
    @api.get("/{id}", response=UserRead, tags=["read"])
    async def get_user_by_id(request, id: int) -> UserRead: # noqa
        user = await UserCRUD().get_by_id(id)
        if not user:
            raise HttpError(404, "User not found")
    
        return user
    

    is ok

    So if first post and then put - it goes nice, but if it is post, get, (post, put), ... - Method not allowed.

    opened by ETretyakov 4
  • added methods for AsyncOperation

    added methods for AsyncOperation

    I have read this issue 44 (https://github.com/vitalik/django-ninja/issues/44), please explain what is needed to solve the issue, this fix is really necessary for our development.

    opened by ETretyakov 3
  • Authentication AND/OR operators

    Authentication AND/OR operators

    That closes #196.

    After merging this will be possible:

    @api.get(
        "/",
        auth=(Auth1() & Auth2()) | Auth3()),
    )
    def f(request):
        pass
    

    What I don't like at this moment (marked lines are solved):

    • [ ] AuthBase.__call__ now is not abstractmethod, I used it for recursive descent. The previous method is renamed to "callable" and it's not the best name.

    • [ ] Swagger docs aren't built for operators. Must be something like this: https://swagger.io/docs/specification/authentication/#multiple

    • [ ] No clear error messages when trying to pair with "just callable".

    • [x] Django-ninja docs aren't yet written.

    The PR is in progress. Comments are welcome!

    opened by igoose1 1
  • Authentications with logical operators

    Authentications with logical operators

    Hi, ninja is really cool project, thank you for that!

    The issue: swagger allows us to combine different authentications using logical operators, but ninja allows us to use them only with OR operator. (using the first suitable authentication). But sometimes we need to use all authentications, for example, I need to use secret authentication for all queries AND Bearer authorization for most endpoints. Could you please add this functionality.

    Now I am using middlewares for these purposes, but they don't appear in swagger :(

    https://github.com/vitalik/django-ninja/blob/4e7fc53e57f98c21bf63da7d6b00688dee6185c0/ninja/operation.py#L137 the reference in source code, where the auth checking comes in

    opened by lololozhkin 1
Releases(v0.16.1)
  • v0.16.1(Oct 12, 2021)

    • Resolve #229 & #240 reporting dev errors under django dev-server (#242 by @stephenrauch)
    • Allow NOT_SET to survive copy.deepcopy() (#241 by @stephenrauch)
    Source code(tar.gz)
    Source code(zip)
  • v0.16.0(Oct 6, 2021)

    OpenAPI schemas names

    Generating OpenAPI automatically created schema names changed for duplicated names (see #230) Now instead of silence (or exceptions on other cases) django-ninja will just add sequential number suffix to the schema name in OpenAPI spec. For example if you already have schema called "User" and in some other module you create another "User" schema - the second will have name "User2" in openapi json.

    Other

    • Dot in query regression #238 (#239 by @stephenrauch)
    • Fix openapi schema title and description propagation for query, cookie, header, etc #123 (#233 from @stephenrauch)
    • Fix form schema single param #236 (#237 from @stephenrauch)
    • Improve #181, query with list type (#234 by @stephenrauch)
    • Path signature check (#232 by @stephenrauch)
    • Document how to handle empty form fields (#228 by @stephenrauch)
    • Misc fixes (#231 by @ehdgua01)
    Source code(tar.gz)
    Source code(zip)
  • v0.15.0(Sep 18, 2021)

    Major changes

    • Introduced ModelSchema - declarative way to create schemas from django models
    • Allow arbitrary mix of params Body, Form & File w/ multipart. (#226 by @stephenrauch) (also fixes #134, #162, #201)
    • Path params now support Django path converters (#187 by @stephenrauch)

    Other changes

    • Fixed #208 - Missing schema in requestBody (#209 by @stephenrauch)
    • UploadedFile usability #120
    • Types for "urls" property #155
    • Optimize tests (#217 by @mawassk)
    • Better error message for duplicate orm schema names #214 (#215 @stephenrauch)
    • Test coverage for branches (#211 @stephenrauch)
    • Formatting & styling for test files (#218 by @stephenrauch)
    • Documentation improvements (#207 by @eadwinCode, #205 #206 by @johnthagen )
    Source code(tar.gz)
    Source code(zip)
  • v0.14.0(Aug 14, 2021)

    Hello Everyone,

    This is a very nice release, which includes some new functionality and fixes And more important there are lot of people contributed to this update Thank you

    • Added experimental Pagination support - allows you easely paginate your querysets and customize pages (note - this feature currently in beta and may change a bit in future udpates)
    • Added support for streaming responses (#149 by @ErwinJunge )
    • Mixing simple arguments and models arguments in GET parameters (#178 by @stephenrauch )
    • Handle custom exceptions in authentication (#174 by @dozer133 )
    • Added build_absolute_uri on test client (#168 by @jairhenrique )
    • Typing improvements (#167, #170 by @davidszotten )
    • Fix assertion message (#175 by @igoose1 )
    • Resolve #148, missing wraps(), with a better error message. (#184 by @stephenrauch)
    • Improved documentation on forward refs ( #161 by @stephenrauch )
    • Fixed add_router() to router already attached to API ( #188 by @stephenrauch )
    • Bumped Swagger UI to 3.51.2 ( #192 by @igoose1 )
    Source code(tar.gz)
    Source code(zip)
  • v0.13.2(Jun 5, 2021)

  • v0.13.1(Jun 3, 2021)

  • v0.13.0(May 18, 2021)

    • Fixed create_schema ValueError on pydantic 1.8.2 (#135)
    • Allow collection fields to be identified when an alias is used #133 (by @kierandarcy )
    • New argument custom_fields in create_schema to override or add fields
    • Fixed create_schema Json field (#127)
    • Include ninja TestClient into distributed package
    Source code(tar.gz)
    Source code(zip)
  • v0.12.3(Apr 28, 2021)

  • v0.12.2(Apr 6, 2021)

  • v0.12.1(Mar 26, 2021)

  • v0.12.0(Mar 26, 2021)

  • v0.11.0(Mar 3, 2021)

  • v0.10.2(Feb 2, 2021)

  • 0.10.1(Jan 15, 2021)

  • v0.10.0(Jan 13, 2021)

  • v0.9.7(Dec 25, 2020)

  • v0.9.6(Dec 21, 2020)

  • v0.9.4(Dec 14, 2020)

  • v0.9.3(Dec 14, 2020)

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 2 Oct 22, 2021
Serverless Python

Zappa - Serverless Python About Installation and Configuration Running the Initial Setup / Settings Basic Usage Initial Deployments Updates Rollback S

Rich Jones 11.8k Oct 22, 2021
Serverless Python

Zappa - Serverless Python About Installation and Configuration Running the Initial Setup / Settings Basic Usage Initial Deployments Updates Rollback S

Rich Jones 11.7k Feb 17, 2021
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 8.6k Oct 21, 2021
Async Python 3.6+ web server/framework | Build fast. Run fast.

Sanic | Build fast. Run fast. Build Docs Package Support Stats Sanic is a Python 3.6+ web server and web framework that's written to go fast. It allow

Sanic Community Organization 15.5k Oct 21, 2021
Async Python 3.6+ web server/framework | Build fast. Run fast.

Sanic | Build fast. Run fast. Build Docs Package Support Stats Sanic is a Python 3.6+ web server and web framework that's written to go fast. It allow

Sanic Community Organization 15.5k Oct 21, 2021
The Web framework for perfectionists with deadlines.

Django Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design. Thanks for checking it out. All docu

Django 60.3k Oct 22, 2021
FastAPI framework, high performance, easy to learn, fast to code, ready for production

FastAPI framework, high performance, easy to learn, fast to code, ready for production Documentation: https://fastapi.tiangolo.com Source Code: https:

Sebastián Ramírez 37.2k Oct 23, 2021
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 349 Oct 13, 2021
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 1, 2021
A familiar HTTP Service Framework for Python.

Responder: a familiar HTTP Service Framework for Python Powered by Starlette. That async declaration is optional. View documentation. This gets you a

Taoufik 3.6k Oct 15, 2021
Containers And REST APIs Workshop

Containers & REST APIs Workshop Containers vs Virtual Machines Ferramentas Podman: https://podman.io/ Docker: https://www.docker.com/ IBM CLI: https:/

Vanderlei Munhoz 3 Oct 23, 2021
REST API framework designed for human beings

Eve Eve is an open source Python REST API framework designed for human beings. It allows to effortlessly build and deploy highly customizable, fully f

eve 6.4k Oct 17, 2021
REST API framework designed for human beings

Eve Eve is an open source Python REST API framework designed for human beings. It allows to effortlessly build and deploy highly customizable, fully f

eve 6.3k Feb 17, 2021
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.4k Oct 23, 2021
Endpoints is a lightweight REST api framework written in python and used in multiple production systems that handle millions of requests daily.

Endpoints Quickest API builder in the West! Endpoints is a lightweight REST api framework written in python and used in multiple production systems th

Jay Marcyes 30 Oct 12, 2021
Goblet is an easy-to-use framework that enables developers to quickly spin up fully featured REST APIs with python on GCP

GOBLET Goblet is a framework for writing serverless rest apis in python in google cloud. It allows you to quickly create and deploy python apis backed

Austen 30 Oct 13, 2021
Daniel Vaz Gaspar 3.5k Oct 22, 2021
Appier is an object-oriented Python web framework built for super fast app development.

Joyful Python Web App development Appier is an object-oriented Python web framework built for super fast app development. It's as lightweight as possi

Hive Solutions 116 Oct 2, 2021