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/ 是会去掉 / 的