Django请求的生命周期:
Wsgi解析-----django框架-----中间件----视图函数------中间件-----前端
总路由进行匹配-------子路由------视图处理------返回------前端
客户端请求(遵循http协议,发送请求报文(请求行,请求头,请求体))--------(解析报文)web服务器(通过wsgi协议)--------django框架(根据报文封装request请求对象方便我们操作-------一次从上到下调用中间件中的process_request方法-------URL匹配-------依次调用中间件的process_view方法---------调用视图-------一次从下到上调用中间件的方法process_response方法)-----------返回响应给Web服务器(Web服务器构造响应报文)-----------返回响应报文给客户端
中间件:
在请求前或请求后必须要做的可以放到中间中执行
CSRF:跨站请求伪造 .403forbiden, dev中middleware
X-Csrftoken:表单里娶不到在请求头里取
Csrftoken:从cookie里取
对比两个值X-Csrftoken,Csrftoken
前后端不分离:后端返回完整的HTML页面给后端,只适合纯网页,手机APP不能展示HTML页面
Restful设计风格:
1.URL路径使用名词复数
2.同一个URL,不同的方法(get post put delete)代表不同的操作
3.查询字符串放过滤参数:页码数,page,orderby
4.相应数据格式:大部分为json
5.响应状态码:
200:获取或修改成功
201:新增成功
204:删除成功
400:参数有误
6:返回数据格式:前端需要什么,返回什么
jsonresponse数据为列表时需要jsonresponse([…],safe=False)
思路:
确定请求方式和URL地址
确定请求参数和参数传递方式
确定响应数据和响应格式以及响应状态码
视图工作:
把请求数据转换为模型类对象
操作数据库
将模型类对象转换为响应的数据(如JSON格式)
序列化:
把对象转换为字典或json的过程
把一种格式转换为另一种格式
反序列化:
把字典或json转化为对象的过程
和序列化相反的过程
环境安装:
pip install djangorestframework 》 settings apps注册 》
DRF框架使用过程:
1、在子应用中创建serializers.py文件
class BookInfoSerializer(serializers.ModelSerializer):
"""图书序列化器类"""
class Meta:
model = BookInfo #对应的模型类
fields = '__all__' #依据模型类的哪些字段生成对应序列化器类的字段
2、在views.py中创建BookInfoViewSet,是一个视图集合
from rest_framework.viewsets import ModelViewSetfrom booktest.serializers import BookInfoSerializerfrom booktest.models import BookInfo
class BookInfoViewSet(ModelViewSet):
"""视图集"""
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
queryset:指定视图集在进行数据查询时所使用的查询集
serializer_class:指定视图集在进行序列化或反序列化时所使用的序列化
器类
3、配置路由
from booktest import views
from rest_framework.routers import DefaultRouter
urlpatterns = [
...
]
路由Router: 动态生成视图集中处理函数的url配置项
router = DefaultRouter() # 路由Router
router.register(‘books’, views.BookInfoViewSet, base_name=‘books’) # 向路由Router中注册视图集
urlpatterns += router.urls # 将路由Router生成的url配置信息添加到django的路由列表
序列化:对象----》字典或json
反序列化:类比请求数据字典----》数据检验—》数据保存数据库等(新增、更新)
序列化容器定义:
模型类定义from django.db import models
class 模型类名(models.Model):
模型类字段 = models.字段类型(选项参数)
…
序列化器类定义from rest_framework import serializers
class 序列化器类名(serializers.Serializer):
# 序列化器字段 = serializers.字段类型(选项参数)
…
单独运行python:设置环境变量------》manage.py中的环境变量
设置Django运行所依赖的环境变量
import os
if not os.environ.get('DJANGO_SETTINGS_MODULE'):
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'drf_demo.settings')
让Django进行一次初始化import django
django.setup()
序列化容器:
容器字段对应:对象的属性名、字典数据的key
1、创建容器对象
serializer = UserSerializer(instance=None, data={}, **kwargs)
2、序列化传参:对象
serializer = UserSerializer(user)
serializer.data
3、反序列化传参:字典
serializer = UserSerializer(data=<ਁَ>)
serializer.is_valid()
serializer.errors
serializer.validated_data
通用参数选项:
readonly:为True,序列化(转字典)使用
writeonly:为true,反序列化(转对象)使用
required:默认true必传,反序列化时(转对象)允许不传设置false,有默认值时required自动为false
default:设置默认值,
Max_value :反序列化(转对象)时:校验数字最大值