django+drf+vue 简单系统搭建 (2) - drf 应用

按照本系统设置目的,是为了建立一些工具用来处理简单的文件。

 1. 准备djangorestframework

关于drf的说明请参见:Django REST Framework教程 | 大江狗的博客

本系列直接使用drf的序列化等其他功能。

安装

conda install djangorestframework
conda install django-filter

2. 创建工具的app

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

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 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'),
]

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

django+drf+vue 简单系统搭建 (2) - drf 应用_第1张图片

 手动修改路径进入admin界面,使用管理员用户密码登录。

django+drf+vue 简单系统搭建 (2) - drf 应用_第2张图片

在simpletool中添加测试数据。 

django+drf+vue 简单系统搭建 (2) - drf 应用_第3张图片

访问api/simpletool页面

5. 序列化器与视图

 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基本一致,不同的是它额外做了些工作:

  • 自动推断需要序列化的字段及类型
  • 提供对字段数据的验证器的默认实现
  • 提供了修改数据需要用到的.create(),.update()方法的默认实现
  • 另外我们还可以再fields列表挑选需要的数据,以便减少数据体积。

除了对序列化器的支持以外,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)
  • @api_view装饰器允许视图接收GET,POST请求,以及提供如405 Method Not Allowed等默认实现,以便在不同的请求下进行正确的响应。
  • 返回了Response,该对象由Django原生响应体扩展而来,它可以根据内容协商来确定返回给客户端的正确内容类型。如果数据验证有误,还可以返回适当的状态码来表示当前的情况。
  • django+drf+vue 简单系统搭建 (2) - drf 应用_第4张图片

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

conda install httpie
http http://127.0.0.1:8000/api/simpletool/

django+drf+vue 简单系统搭建 (2) - drf 应用_第5张图片

你可能感兴趣的:(django_drf_vue,django,python,后端)