Skip to main content

基于Django的API接口开发框架。使用pydantic做接口参数验证,自动生成swagger接口管理界面,支持多种返回体封装。

Project description

django-apis

基于Django的API接口开发框架。使用pydantic做接口参数验证,自动生成swagger接口管理界面,支持多种返回体封装。

安装

pip install django-apis

兼容性要求

  • Python 3.8及以上
  • Django 3.2及以上

配置项

  • DJANGO_APIS_OPENAPI_LOGIN_URL: Swagger管理界面访问受管理登录保护。在未登录访问时跳转的登录页面地址。

  • DJANGO_APIS_SWAGGER_UI_PATH: Swagger管理界面二级路径(不包括django_apis.urls引入部分)。默认值为/docs/

  • DJANGO_APIS_OPENAPI_TITLES: Swagger标题。

  • DJANGO_APIS_OPENAPI_VERSIONs: Swagger版本号。

  • DJANGO_APIS_OPENAPI_DESCRIPTIONs: Swagger描述。

  • DJANGO_APIS_OPENAPI_TAGS: 自定义标签

    DJANGO_APIS_OPENAPI_TAGS = {
        "default": [
            {"name": "test1", "description": "测试1"},
        ],
        "another": [
            {"name": "test2", "description": "测试2"},
        ]
    }
    
  • DJANGO_APIS_OPENAPI_SERVERS: Swagger服务器列表。

    DJANGO_APIS_OPENAPI_SERVERS = {
        "default": [
            {"url": "http://127.0.0.1:8000", "description": "本地开发环境"},
            {"url": "http://192.168.1.1", "description": "测试环境"},
        ],
        "another": [
            {"url": "http://192.168.1.1:8000", "description": "本地开发环境"},
            {"url": "http://192.168.1.1:8001", "description": "测试环境"},
        ]
    }
    
  • DJANGO_APIS_OPENAPI_SECURITY_DEFINITIONS: Swagger认证列表。

    DJANGO_APIS_OPENAPI_SECURITY_DEFINITIONS = {
        "default": {
            "BasicAuth": {
                "type": "http",
                "scheme": "basic",
            },
            "BearerAuth": {
                "type": "http",
                "scheme": "bearer",
            },
            "ApikeyAuth": {
                "type": "apiKey",
                "name": "X-API-Key",
                "in": "header",
            },
            "OpenID": {
                "type": "openIdConnect",
                "openIdConnectUrl": "https://example.com/.well-known/openid-configuration",
            },
            "OAuth2": {
                "type": "oauth2",
                "flows": {
                    "authorizationCode": {
                        "authorizationUrl": "https://example.com/oauth/authorize",
                        "tokenUrl": "https://example.com/oauth/token",
                        "scopes": {
                            "read": "Grants read access",
                            "write": "Grants write access",
                            "admin": "Grants access to admin operations",
                        },
                    }
                },
            },
        },
        "another": {
            "BasicAuth": {
                "type": "http",
                "scheme": "basic",
            },
            "BearerAuth": {
                "type": "http",
                "scheme": "bearer",
            },
            "ApikeyAuth": {
                "type": "apiKey",
                "name": "X-API-Key",
                "in": "header",
            },
            "OpenID": {
                "type": "openIdConnect",
                "openIdConnectUrl": "https://example.com/.well-known/openid-configuration",
            },
            "OAuth2": {
                "type": "oauth2",
                "flows": {
                    "authorizationCode": {
                        "authorizationUrl": "https://example.com/oauth/authorize",
                        "tokenUrl": "https://example.com/oauth/token",
                        "scopes": {
                            "read": "Grants read access",
                            "write": "Grants write access",
                            "admin": "Grants access to admin operations",
                        },
                    }
                },
            },
        },
    }
    

如何自定义Apiview类型

注意事项

  1. 定义自己的base_response_class,并重置自定义的Apiview中的base_response_class属性。
  2. 重载Apiview中的make_responsemake_error_response方法。

自定义Apiview类型案例

from django.http import JsonResponse
from django_apis.views import Apiview
from django_apis.schemas import ResponseBase
from typing import Any
import pydantic

class ErrorInfo(pydantic.BaseModel):
    code: int = 0
    message: str = "OK"

# 响应体格式定义要与make_response及make_error_response实际响应匹配
class ExampleApiviewResponseBase(ResponseBase):
    success: bool = True
    error: ErrorInfo = ErrorInfo()
    result: Any = None

class ExampleApiview(Apiview):
    base_response_data_field = "result"
    base_response_class = ExampleApiviewResponseBase

    def make_response(self, data):
        return JsonResponse(
            {
                "success": True,
                "error": {
                    "code": 0,
                    "message": "OK",
                },
                "result": data,
            },
            json_dumps_params={
                "ensure_ascii": False,
            },
        )

    # 强制所有响应的http status_code值为200
    def make_error_response(self, code, message, status_code=200):
        return JsonResponse(
            {
                "success": True,
                "error": {
                    "code": code,
                    "message": message,
                },
                "result": None,
            },
            json_dumps_params={
                "ensure_ascii": False,
            },
        )

example_apiview = ExampleApiview()

使用案例

import pydantic
from django_apis.views import apiview
from django_apis.schemas import OptionalUploadedFiles

@apiview()
def ping() -> str:
    return "pong"


class EchoPayload(pydantic.BaseMode):
    msg: str

@apiview(methods="post")
def echo(payload: EchoPayload) -> str:
    return payload.msg

class ApplyForm(pydantic.BaseMode):
    name: str
    start_date: str
    end_date: str
    files: OptionalUploadedFiles

@apiview(methods="post")
def apply(form: ApplyForm) -> bool:
    return True

版本记录

v0.2.0

  • 注意:不兼容0.1.x。

v0.2.1

  • 使用openapi 3.1.0版本.
  • 添加并通过更多关于复合模型的测试用例。

v0.2.2

  • 通过DJANGO_APIS_SWAGGER_LOGIN_REQUIRED配置项控制Swagger管理界面是否受登录保护。

v0.2.3

  • 使用typing.Union以兼容python3.9。

v0.2.4

  • 为接口添加security字段。

v0.2.5

  • query字段添加default支持。

v0.2.6

  • get_response_schema结果必须为ResponseBase子类,否则均使用make_generic_response_type进行动态生成。

v0.2.8

  • 修正:是否为HttpResponseBase实例判断错误的问题。

v0.2.10

  • 添加:django_apis.helper.auth模型,提供http_bearer_auth_protect、http_basic_auth_protect、apikey_auth_protect等认证验证方法。
  • 添加:视图级的tags定义支持。

v0.2.11

  • 修正: swagger中支持query参数可选。

v0.2.12

  • 添加:多site支持。
  • 修改:开源协议从MIT调整为Apache License, Version 2.0。

v0.2.13

  • 添加:Apiview.json_encoder属性,用于支持自定义json编码器。默认使用jsonutils.make_simple_json_encoder()编码器,可支持datetime/django model/django queryset等类型数据的json序列化。

v0.2.14

  • 添加get_apiview支持。
  • 添加django-environment-settings支持。
  • 添加:http apikey auth支持。
  • 添加:http basic auth支持。
  • 修改:完善接口异常日志。
  • 修正:登录后无法自动返回swagger-ui界面的问题。
  • 文档:更新DJANGO_APIS_OPENAPI_SECURITY_DEFINITIONS案例代码。

Project details


Download files

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

Source Distribution

django-apis-0.2.14.tar.gz (22.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_apis-0.2.14-py3-none-any.whl (23.4 kB view details)

Uploaded Python 3

File details

Details for the file django-apis-0.2.14.tar.gz.

File metadata

  • Download URL: django-apis-0.2.14.tar.gz
  • Upload date:
  • Size: 22.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for django-apis-0.2.14.tar.gz
Algorithm Hash digest
SHA256 9cbd6b6240d4b4bc97b3e13d9466b6dbee19fbd3d9c55170106983ae36d34ebc
MD5 5ae57408ce7ec3dfc42538bcd2499103
BLAKE2b-256 7b10d36ba3dfb12884c8126b040cb0ceac34ef03c1496d9f46bee6e5bfaff409

See more details on using hashes here.

File details

Details for the file django_apis-0.2.14-py3-none-any.whl.

File metadata

  • Download URL: django_apis-0.2.14-py3-none-any.whl
  • Upload date:
  • Size: 23.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for django_apis-0.2.14-py3-none-any.whl
Algorithm Hash digest
SHA256 0d283dedf7fa70fca75a5e6f1fe9cc2f0502046e3481b4f59077519cff496283
MD5 e4f0c81de8d63fb7ee101fef960b32c7
BLAKE2b-256 404b136d0c063930c2c2b7053d63a36ab9b8b547983d5ea26d71507ebbea97ef

See more details on using hashes here.

Supported by

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