按照本系统设置目的,是为了建立一些工具用来处理简单的文件。
关于drf的说明请参见:Django REST Framework教程 | 大江狗的博客
本系列直接使用drf的序列化等其他功能。
安装
- conda install djangorestframework
- conda install django-filter
python manage.py startapp simpletool
创建简单的工具模型:
- #simpletool/models.py
-
- from 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.py
-
- INSTALLED_APPS = [
- '''
- 'rest_framework',
- 'simpletool',
- ]
然后要添加DRF的登录视图,以便DRF自动为可视化接口页面生成一个用户登录的入口:
- # drf_vue_tools/urls.py
-
- ...
- from django.urls import include
-
- urlpatterns = [
- ...
- path('api-auth/', include('rest_framework.urls')),
- ]
最后再迁移数据:
- python manage.py makemigrations
- python manage.py migrate
工具模型已经定义好,现在写视图来查看所有工具:
- #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 serializers
-
- class 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 views
-
- app_name = 'simpletool'
-
- urlpatterns = [
- path('',views.tool_list,name='list'),
- ]
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页面

simpletool/serializers.py 中ToolListSerializer 与Model相似,代码感觉重复。DRF中提供了ModelSerializer来解决这个问题。序列化器文件可以修改为:
- from rest_framework import serializers
- from simpletool.models import simpleTool
-
-
- class ToolListSerializer(serializers.ModelSerializer):
- class Meta:
- model = simpleTool
- fields = [
- 'id','title','created'
- ]
ModelSerializer的功能与serializer基本一致,不同的是它额外做了些工作:
除了对序列化器的支持以外,DRF还提供了对视图的扩展,以便视图更好的为接口服务。
将文章的视图修改如下:
主要的变化如下:
- from django.shortcuts import render
- from django.http import JsonResponse
- from simpletool.models import simpleTool
- from simpletool.serializers import ToolListSerializer
-
- from 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)

上述视图是由于Response提供的内容协商能力。也就是说,Django后端根据客户端请求响应的内容类型不同,自动选择合适的表现形式;浏览器请求资源时,就返回可视化的HTML资源表示,其他形式请求时,又可以返回Json纯数据形式。(可利用httpie验证)
conda install httpie
http http://127.0.0.1:8000/api/simpletool/
