按照本系统设置目的,是为了建立一些工具用来处理简单的文件。
1. 准备djangorestframework
关于drf的说明请参见:Django REST Framework教程 | 大江狗的博客
本系列直接使用drf的序列化等其他功能。
安装
conda install djangorestframework
conda install django-filter
2. 创建工具的app
python manage.py startapp simpletool
创建简单的工具模型:
#simpletool/models.pyfrom django.db import models
from django.utils import timezone
# Create your models here.# 工具的model
class simpleTool(models.Model):title = models.CharField(max_length=50)description = models.CharField(max_length=200,default="")created = models.DateTimeField(default=timezone.now)updated = models.DateTimeField(auto_now=True)def __str__(self):return self.title
将app注册列表:
# drf_vue_tools/settings.pyINSTALLED_APPS = [''''rest_framework','simpletool',
]
然后要添加DRF的登录视图,以便DRF自动为可视化接口页面生成一个用户登录的入口:
# drf_vue_tools/urls.py...
from django.urls import includeurlpatterns = [...path('api-auth/', include('rest_framework.urls')),
]
最后再迁移数据:
python manage.py makemigrations
python manage.py migrate
3. 工具列表接口
工具模型已经定义好,现在写视图来查看所有工具:
#simpletool/views.py
from django.shortcuts import render
from django.http import JsonResponse
from simpletool.models import simpleTool
#暂时未定义
from simpletool.serializers import ToolListSerializer
# Create your views here.def tool_list(request):tools = simpleTool.objects.all()serializer = ToolListSerializer(tools,many=True)return JsonResponse(serializer.data,safe=False)
定义序列化器:
#simpletool/serializers.py
from rest_framework import serializersclass ToolListSerializer(serializers.Serializer):id = serializers.IntegerField(read_only=True)title = serializers.CharField(allow_blank=True,max_length=50)description = serializers.CharField(allow_blank=True)created = serializers.DateTimeField()updated = serializers.DateTimeField()
由上可见,views中得到所有tools list,创建序列化器,最后将序列化数据以Json形式返回。
而序列化器种定义的对象与原始models字段基本等同。
最后将各级urls.py 配置好:
# drf_vue_tool/urls.py
urlpatterns = ['''path('api/simpletool/',include('simpletool.urls',namespace='simpletool')),
]
以及
#simpletool/urls.py
from django.urls import path
from simpletool import viewsapp_name = 'simpletool'urlpatterns = [path('',views.tool_list,name='list'),
]
4. 创建管理员用户 & 添加测试数据
python manage.py createsuperuser
可自行设定用户名与密码,测试时设置为xiaofan0101,123456
更新admin文件
#simpletool/admin.py
from django.contrib import admin# Register your models here.
import inspect
import sys
from simpletool.models import *cls_members = inspect.getmembers(sys.modules[__name__],inspect.isclass)
for name,cls in cls_members:admin.site.register(cls)
运行:
python manage.py runserver
手动修改路径进入admin界面,使用管理员用户密码登录。
在simpletool中添加测试数据。
访问api/simpletool页面
5. 序列化器与视图
simpletool/serializers.py 中ToolListSerializer 与Model相似,代码感觉重复。DRF中提供了ModelSerializer来解决这个问题。序列化器文件可以修改为:
from rest_framework import serializers
from simpletool.models import simpleToolclass ToolListSerializer(serializers.ModelSerializer):class Meta:model = simpleToolfields = ['id','title','created']
ModelSerializer的功能与serializer基本一致,不同的是它额外做了些工作:
- 自动推断需要序列化的字段及类型
- 提供对字段数据的验证器的默认实现
- 提供了修改数据需要用到的.create(),.update()方法的默认实现
- 另外我们还可以再fields列表挑选需要的数据,以便减少数据体积。
除了对序列化器的支持以外,DRF还提供了对视图的扩展,以便视图更好的为接口服务。
将文章的视图修改如下:
主要的变化如下:
from django.shortcuts import render
from django.http import JsonResponse
from simpletool.models import simpleTool
from simpletool.serializers import ToolListSerializerfrom rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
# Create your views here.@api_view(['GET','POST'])
def tool_list(request):if request.method == 'GET':tools = simpleTool.objects.all()serializer = ToolListSerializer(tools,many=True)return Response(serializer.data) elif request.method == 'POST':serializer = ToolListSerializer(data=request.data)if serializer.is_valid():serializer.save()return Response(serializer.data,status=status.HTTP_200_OK)return Response(serializer.error,status=status.HTTP_400_BAD_REQUEST)
- @api_view装饰器允许视图接收GET,POST请求,以及提供如405 Method Not Allowed等默认实现,以便在不同的请求下进行正确的响应。
- 返回了Response,该对象由Django原生响应体扩展而来,它可以根据内容协商来确定返回给客户端的正确内容类型。如果数据验证有误,还可以返回适当的状态码来表示当前的情况。
上述视图是由于Response提供的内容协商能力。也就是说,Django后端根据客户端请求响应的内容类型不同,自动选择合适的表现形式;浏览器请求资源时,就返回可视化的HTML资源表示,其他形式请求时,又可以返回Json纯数据形式。(可利用httpie验证)
conda install httpie
http http://127.0.0.1:8000/api/simpletool/