Web后端:Django-rest-framework的使用
Django DRF 的文档一看过去,就头晕目眩。
将实践DRF应用做个记录,方便查阅。
运行环境 Runtime environment
1 | 操作系统 : Ubuntu18.04 |
背景
使用django开发应用接口,方便做到前后端分离的开发。
说真的,现在越来越多有力的框架出来,以后可能django市场份额会不会越来越少呢?
比如,现在新兴的fastAPI,我是感觉可以把flask淘汰了。
以后有机会要学学这个框架了。
项目结构
Django 怎么开展项目和创建、封装app应用就不赘述了。
1 | ├── apps |
安装和配置
pip命令安装
pip install djangorestframework
moePloy/settings.py (全局配置文件)
在django配置文件settings.py(以具体项目为准)的INSTALLED_APPS中添加’rest_framework’。
1
2
3
4
5
6
7
8
9
10
11INSTALLED_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(序列化器)
创建models(模组)
drf主要是为了做数据接口的,既然使用到数据就会用到django models。
修改文件 search/models.py1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21from 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创建Serializer(序列化器)
models.py 主要是为了让django orm 方便管理数据库表的,
而序列化器是为了把models取到的数据进行一层处理,转成json格式的对象(python字典),方便作为接口数据返回。
apps/search/文件夹下创建serializer.py1
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 | 如果不会用视图集和扩展类视图,就用DRF最底层的类视图APIVIew来造轮子(DRF所有类视图都基于APIVIew), |
本文例子中,需求是将采集到的入库的信息,通过用户在浏览器输入搜索词,查询数据库信息得到数据列表。
就直接使用GenericAPIView中的ListAPIView类视图快速通过post请求方式查询数据库列表。
开发视图逻辑
修改 apps/search/Views.py1
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)*** 如果出现此类警告 ***
修改路由映射
全局根路由映射 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
24from 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
12from 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()),
]启动测试服务器
基本开发已经完成,来启动测试看看。
在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 项目启动完成!
浏览器网页测试
测试使用的地址是192.168.1.68:5360,以及urls.py中设置的路径,所以:
看到页面说明部署已经成功了!
页面的渲染是DRF组件自行渲染的,
POST按钮就是模拟发送POST请求
尝试发送一下请求
响应网页,通过浏览器开发者工具能看到,
发送了带有data数据的application/json内容类型的post请求
由于,我们数据还是空的,所以响应了一个空的{}。
未完持续..
总结
django 的DRF快速应用入门开发,目前就这样了。
目的是为了用简短的博文让人快速过一遍DRF开发的瘾,不让读者看到一大串繁杂的介绍丢失了阅读的动力。