Django DRF 的文档一看过去,就头晕目眩。
将实践DRF应用做个记录,方便查阅。

运行环境 Runtime environment

1
2
3
4
5
操作系统 : Ubuntu18.04
IDE: JetBrains pycharm 2019.2.4 x64
Python: 3.6.9
Django: 3.0.5
djangorestframework: 3.11.0

背景

使用django开发应用接口,方便做到前后端分离的开发。
说真的,现在越来越多有力的框架出来,以后可能django市场份额会不会越来越少呢?
比如,现在新兴的fastAPI,我是感觉可以把flask淘汰了。
以后有机会要学学这个框架了。

项目结构

Django 怎么开展项目和创建、封装app应用就不赘述了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
├── apps
│   ├── __init__.py
│   └── search
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── fontEnd
│   └── dist
├── LICENSE
├── manage.py
├── moePloy
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py

安装和配置

  1. pip命令安装

    pip install djangorestframework

  2. moePloy/settings.py (全局配置文件)

    在django配置文件settings.py(以具体项目为准)的INSTALLED_APPS中添加’rest_framework’。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'corsheaders', # 跨域请求处理
    'rest_framework', # 添加rest_framework应用
    'search', # 搜索
    ]

    models(模组)&&Serializer(序列化器)

  3. 创建models(模组)

    drf主要是为了做数据接口的,既然使用到数据就会用到django models。
    修改文件 search/models.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    from django.db import models


    # Create your models here.
    class magnetInfo(models.Model):
    mtitle = models.CharField(max_length=255, verbose_name='名称', unique=True)
    mdate = models.DateField(verbose_name='发布日期', null=True)
    mpublisher = models.CharField(default="未知", verbose_name='发布人', null=True)
    magnet = models.TextField(verbose_name='磁性链接', null=True)
    magnetSpare = models.TextField(verbose_name='备用磁性链接', null=True)
    msize = models.CharField(max_length=255, verbose_name='文件大小', null=True)
    morigin = models.CharField(max_length=255, verbose_name='网站来源', null=True)
    murl = models.URLField(verbose_name='源链接', null=True)

    def __str__(self):
    return self.mtitle

    class Meta:
    verbose_name = '磁性链接信息'
    db_table = "magnetInfo"
    verbose_name_plural = verbose_name
  4. 创建Serializer(序列化器)

    models.py 主要是为了让django orm 方便管理数据库表的,
    而序列化器是为了把models取到的数据进行一层处理,转成json格式的对象(python字典),方便作为接口数据返回。
    apps/search/文件夹下创建serializer.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 导入drf
    from rest_framework import serializers
    # 导入要进行序列化操作的models
    from .models import magnetInfo

    class magnetInfoSerializer(serializers.ModelSerializer):
    """
    该类的主要作用是用来对模型进行序列化操作的,
    该类定义的属性、必须在模型中的属性保持一致、可以少、但不允许多

    为了让人不觉得太复杂,这里直接使用"__all__"表示所有models字段都做序列化
    """
    class Meta:
    model = magnetInfo

    # 使用"__all__"表示所有models字段都做序列化
    fields = "__all__"

    开发Views(视图)

DRF 中的类视图非常的强大,在Django原有的类视图基础上又做了一层封装。

完成常规操作(例如:增删改查)方面,都已经有现成类视图逻辑可以直接使用,节约开发实践。

相关的类视图源码也非常的好懂,所以不要太纠结自己造轮子的毛病。

简单来说,

1
2
3
4
5
6
7
8
9
如果不会用视图集和扩展类视图,就用DRF最底层的类视图APIVIew来造轮子(DRF所有类视图都基于APIVIew),  

如果会用通用类视图(GenericAPIView)那就是drf进阶水平,

如果会使用(ViewSet)视图集开发,就是个老手了,

如果能灵活运用上面三种来做综合开发,是drf大佬。

无论是APIVIew、GenericAPIView、ViewSet都可以做到自定义。

本文例子中,需求是将采集到的入库的信息,通过用户在浏览器输入搜索词,查询数据库信息得到数据列表。

就直接使用GenericAPIView中的ListAPIView类视图快速通过post请求方式查询数据库列表。

  1. 开发视图逻辑
    修改 apps/search/Views.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    # drf 响应&状态
    from rest_framework.response import Response
    from rest_framework import status

    # drf 类视图导入
    from rest_framework.views import APIView
    from rest_framework.generics import ListAPIView
    from rest_framework.viewsets import ModelViewSet

    # 导入模组&&序列化器
    from .serialzers import magnetInfo
    from .serialzers import magnetInfoSerializer


    class List_magnetInfo(ListAPIView):
    # 查询集,默认None
    queryset = magnetInfo.objects.all()
    # 定义该视图序列化器
    serializer_class = magnetInfoSerializer

    def post(self, request, *args, **kwargs):
    serialized = self.serializer_class(data=request.data)

    if serialized.is_valid(): # 验证数据是否合法并返回布尔值

    # 必须使用is_valid方法校验后才能使用.data序列化成字典形式
    print(serialized.data)

    if not serialized.data:
    print("无值")

    return Response(serialized.data, status=status.HTTP_201_CREATED)
    else:
    return Response(serialized._errors(), status=status.HTTP_400_BAD_REQUEST)

    *** 如果出现此类警告 ***

    解决办法,点我

  2. 修改路由映射

    全局根路由映射 moePloy/urls.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    from django.contrib import admin
    from django.urls import path
    from django.urls import re_path
    from django.urls import include
    from django.views.generic import TemplateView

    # 接口路由
    apiUrlpatterns = [
    re_path(r'^api/search', include('apps.search.urls')),
    ]

    # 前端路由
    FEUrlpatterns = [
    re_path(r'^$', TemplateView.as_view(template_name="index.html")),
    ]

    # 根路由
    urlpatterns = [
    # path('admin/', admin.site.urls),
    ]

    # 注意前后顺序
    urlpatterns += apiUrlpatterns
    # urlpatterns += FEUrlpatterns

    可以看到全局路由里做了路由分离
    创建子路由映射(应用路由映射) apps/search/urls.py 文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from django.urls import path
    from django.urls import include
    from django.urls import re_path
    from apps.search import views

    # 视图导入

    app_name = 'search'

    urlpatterns = [
    path('', views.List_magnetInfo.as_view()),
    ]
  3. 启动测试服务器

    基本开发已经完成,来启动测试看看。

    在django项目根目录下,执行命令

    (Django 基础操作)

    生成models迁移文件

    python manage.py makemigrations search

    数据库迁移

    python manage.py migrate

    运行测试服务器

    python manage.py runserver 你要部署的ip地址:端口

    例如:

    python manage.py runserver 192.168.1.68:5360

    Django 项目启动完成!

  4. 浏览器网页测试

    测试使用的地址是192.168.1.68:5360,以及urls.py中设置的路径,所以:

    http://192.168.1.68:5360/api/search

    看到页面说明部署已经成功了!

    页面的渲染是DRF组件自行渲染的,

    POST按钮就是模拟发送POST请求

    尝试发送一下请求

    响应网页,通过浏览器开发者工具能看到,

    发送了带有data数据的application/json内容类型的post请求

    由于,我们数据还是空的,所以响应了一个空的{}。

未完持续..

总结

django 的DRF快速应用入门开发,目前就这样了。

目的是为了用简短的博文让人快速过一遍DRF开发的瘾,不让读者看到一大串繁杂的介绍丢失了阅读的动力。