【django 1】django rest framework api 实践

发布于:2025-04-14 ⋅ 阅读:(19) ⋅ 点赞:(0)

django 是一个大而全的框架,并且诞生在前后端一体的时代,明显的 mvc 风格,对于当前前后端分离的情况,有些不合时宜,为了让 django 更好的开发后端接口,Django REST framework 应运而生,Django Ninja 亦是如此。

Django REST framework

https://www.django-rest-framework.org/tutorial/quickstart/

pip install djangorestframework

3小时搞定DRF框架 | Django REST framework前后端分离框架实践
https://github.com/liaogx/drf-tutorial

APIView

提供了很多种写接口的方式,对于从 java 过来,感觉还是不太灵活,apiview 稍微好些
https://pythondjango.cn/django/rest-framework/3-CBV-APIView-viewsets/#%E4%BD%BF%E7%94%A8%E5%9F%BA%E7%A1%80apiview%E7%B1%BB

\项目\应用\views.py 定义类接口

class CourseList(APIView):
    permission_classes = (IsAuthenticated,)  # settings.py中已设置,此处是多余的

    def get(self, request):
        """
        :param request:
        :return:
        """
        queryset = Course.objects.all()
        s = CourseSerializer(instance=queryset, many=True)  # 这里是instance = xx
        # s = CourseSerializer(instance=queryset.first())
        return Response(s.data, status=status.HTTP_200_OK)

    def post(self, request):
        """
        :param request:
        :return:
        """
        s = CourseSerializer(data=request.data)  # 这里是data = xx, return前要先调用.is_valid()
        if s.is_valid():
            s.save(teacher=self.request.user)
            # 分别是<class 'django.http.request.QueryDict'> <class 'rest_framework.utils.serializer_helpers.ReturnDict'>
            print(type(request.data), type(s.data))
            return Response(data=s.data, status=status.HTTP_201_CREATED)
        return Response(data=s.errors, status=status.HTTP_400_BAD_REQUEST)

\项目\应用\urls.py 注册类到 url

urlpatterns = [
    # Class Based View
    path("cbv/list/", views.CourseList.as_view(), name="cbv-list"),
    path("cbv/detail/<int:pk>/", views.CourseDetail.as_view(), name="cbv-detail"),
]

\项目\项目\urls.py 注册应用 url 到项目 url

urlpatterns = [
    path("docs/", include_docs_urls(title="DRF API文档", description="Django REST framework快速入门")),
    path("course/", include("course.urls")),
]

接口文档

pip install

coreapi==2.3.3
coreschema==0.0.4

\项目\项目\settings.py 配置

REST_FRAMEWORK = {
    "DEFAULT_SCHEMA_CLASS": "rest_framework.schemas.coreapi.AutoSchema",
}

同时还要在 \项目\项目\urls.py 注册 url

urlpatterns = [
    path("docs/", include_docs_urls(title="DRF API文档", description="Django REST framework快速入门")),
]

然后就可以打开 http://localhost:8000/docs/ 但是有认证需要登陆 admin 123456,django 真是太全面了 😅
配置后还需要打开 http://127.0.0.1:8000/docs/json/?format=api 才能获取 openapi json 文件,可以导入 postman apifox 等接口调试工具

swagger openapi

openapi 2.0
插一句,这个 django 用着真是有着厚重的历史年度感
https://github.com/axnsan12/drf-yasg

这里直接上 openapi 3.0
https://github.com/tfranzel/drf-spectacular

pip install drf-spectacular

\项目\项目\settings.py 配置

INSTALLED_APPS = [
    # ALL YOUR APPS
    'drf_spectacular',
]

REST_FRAMEWORK = {
    # YOUR SETTINGS
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}

\项目\项目\urls.py 注册 url

from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
urlpatterns = [
    # YOUR PATTERNS
    path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
    # Optional UI:
    path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
    path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
]

打开 http://localhost:8000/api/schema/swagger-ui/ 终于看到现代化的 swagger 文档了,点击 /api/schema/ 即可下载 openapi 文档,比 Django REST framework 原生的 coreapi 高到不知道哪里去了,遥遥领先

api

调试时注意 url 要以 / 结尾,不然请求有问题,django 规范 / 是要在最后。什么反人类设计
另外提一句 chrome 默认打开 http://localhost:8000/ 是会去掉 / 的