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


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

     1. 准备djangorestframework

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

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

    安装

    1. conda install djangorestframework
    2. conda install django-filter

    2. 创建工具的app

    python manage.py startapp simpletool

    创建简单的工具模型:

    1. #simpletool/models.py
    2. from django.db import models
    3. from django.utils import timezone
    4. # Create your models here.
    5. # 工具的model
    6. class simpleTool(models.Model):
    7. title = models.CharField(max_length=50)
    8. description = models.CharField(max_length=200,default="")
    9. created = models.DateTimeField(default=timezone.now)
    10. updated = models.DateTimeField(auto_now=True)
    11. def __str__(self):
    12. return self.title

     将app注册列表:

    1. # drf_vue_tools/settings.py
    2. INSTALLED_APPS = [
    3. '''
    4. 'rest_framework',
    5. 'simpletool',
    6. ]

    然后要添加DRF的登录视图,以便DRF自动为可视化接口页面生成一个用户登录的入口:

    1. # drf_vue_tools/urls.py
    2. ...
    3. from django.urls import include
    4. urlpatterns = [
    5. ...
    6. path('api-auth/', include('rest_framework.urls')),
    7. ]

    最后再迁移数据:

    1. python manage.py makemigrations
    2. python manage.py migrate

    3. 工具列表接口

    工具模型已经定义好,现在写视图来查看所有工具:

    1. #simpletool/views.py
    2. from django.shortcuts import render
    3. from django.http import JsonResponse
    4. from simpletool.models import simpleTool
    5. #暂时未定义
    6. from simpletool.serializers import ToolListSerializer
    7. # Create your views here.
    8. def tool_list(request):
    9. tools = simpleTool.objects.all()
    10. serializer = ToolListSerializer(tools,many=True)
    11. return JsonResponse(serializer.data,safe=False)

    定义序列化器:

    1. #simpletool/serializers.py
    2. from rest_framework import serializers
    3. class ToolListSerializer(serializers.Serializer):
    4. id = serializers.IntegerField(read_only=True)
    5. title = serializers.CharField(allow_blank=True,max_length=50)
    6. description = serializers.CharField(allow_blank=True)
    7. created = serializers.DateTimeField()
    8. updated = serializers.DateTimeField()

    由上可见,views中得到所有tools list,创建序列化器,最后将序列化数据以Json形式返回。

    而序列化器种定义的对象与原始models字段基本等同。

    最后将各级urls.py 配置好:

    1. # drf_vue_tool/urls.py
    2. urlpatterns = [
    3. '''
    4. path('api/simpletool/',include('simpletool.urls',namespace='simpletool')),
    5. ]

    以及

    1. #simpletool/urls.py
    2. from django.urls import path
    3. from simpletool import views
    4. app_name = 'simpletool'
    5. urlpatterns = [
    6. path('',views.tool_list,name='list'),
    7. ]

    4. 创建管理员用户 & 添加测试数据

    python manage.py createsuperuser

    可自行设定用户名与密码,测试时设置为xiaofan0101,123456

    更新admin文件

    1. #simpletool/admin.py
    2. from django.contrib import admin
    3. # Register your models here.
    4. import inspect
    5. import sys
    6. from simpletool.models import *
    7. cls_members = inspect.getmembers(sys.modules[__name__],inspect.isclass)
    8. for name,cls in cls_members:
    9. admin.site.register(cls)

    运行:

    python manage.py runserver

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

    在simpletool中添加测试数据。 

    访问api/simpletool页面

    5. 序列化器与视图

     simpletool/serializers.py 中ToolListSerializer 与Model相似,代码感觉重复。DRF中提供了ModelSerializer来解决这个问题。序列化器文件可以修改为:

    1. from rest_framework import serializers
    2. from simpletool.models import simpleTool
    3. class ToolListSerializer(serializers.ModelSerializer):
    4. class Meta:
    5. model = simpleTool
    6. fields = [
    7. 'id','title','created'
    8. ]

    ModelSerializer的功能与serializer基本一致,不同的是它额外做了些工作:

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

    除了对序列化器的支持以外,DRF还提供了对视图的扩展,以便视图更好的为接口服务。

    将文章的视图修改如下:

    主要的变化如下:

    1. from django.shortcuts import render
    2. from django.http import JsonResponse
    3. from simpletool.models import simpleTool
    4. from simpletool.serializers import ToolListSerializer
    5. from rest_framework import status
    6. from rest_framework.decorators import api_view
    7. from rest_framework.response import Response
    8. # Create your views here.
    9. @api_view(['GET','POST'])
    10. def tool_list(request):
    11. if request.method == 'GET':
    12. tools = simpleTool.objects.all()
    13. serializer = ToolListSerializer(tools,many=True)
    14. return Response(serializer.data)
    15. elif request.method == 'POST':
    16. serializer = ToolListSerializer(data=request.data)
    17. if serializer.is_valid():
    18. serializer.save()
    19. return Response(serializer.data,status=status.HTTP_200_OK)
    20. 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/

  • 相关阅读:
    Nginx之https加密网站
    支持JDK19虚拟线程的web框架,之三:观察运行中的虚拟线程
    基于51单片交通灯控制器_紧急+行人+总开关
    分享2022流畅运行Solidworks的电脑配置清单
    Sharding-JDBC 基础
    ChatGPT帮助一名儿童确诊病因,之前17位医生无法确诊
    Maven中央仓库增加依赖漏洞提醒功能
    SpringBoot源码解析(十九)启动内置tomcat
    78-基于STM32单片机的DDS函数信号波形发生器(实物图+源码+原理图+PCB+论文)全套资料
    2023年高教杯数学建模2023B题解析(仅从代码角度出发)
  • 原文地址:https://blog.csdn.net/weixin_44056331/article/details/134236791