drf框架 2 drf框架的请求生命周期(as_view和dispatch方法), 请求、解析、渲染、响应、异常, 序列化组件 ,ORM配置回顾(media文件配置),应用在settings.py中INSTALLED_APPS注册意义 ,数据库配置

应用是否需要在INSTALLED_APPS中注册

‘‘‘ 在没有使用到app的一些特殊操作时(比如数据库相关),不需要app的__init__文件注册时,文件夹可以不用注册,但是注册后,应用的所有功能都能使用 结论:所有应用都可以完成注册‘‘‘

 

数据库配置(全部在settings文件中完成即可)

import pymysqlpymysql.install_as_MySQLdb()DATABASES = { default: { ENGINE: django.db.backends.mysql, NAME: 数据库名, USER: 账号, PASSWORD: 密码, #‘HOST‘: ‘如果是127.0.0.1,该配置可以省略‘, "PORT": 3306, # 如果是3306,该配置可以省略 }}

 

ORM配置回顾

media文件配置

# models.pyfrom django.db import modelsclass User(models.Model): SEX_CHOICES = ((0, ), (1, )) name = models.CharField(max_length=64, verbose_name=姓名) age = models.IntegerField() height = models.DecimalField(max_digits=5, decimal_places=2, default=0) sex = models.IntegerField(choices=SEX_CHOICES, default=0) # sex = models.CharField(choices=[(‘0‘, ‘男‘), (‘1‘, ‘女‘)]) icon = models.ImageField(upload_to=icon, default=icon/default.png) # settings.py# root就是将文件夹添加到 os.path 中MEDIA_ROOT = os.path.join(BASE_DIR, media)# url就是配置路由 /路由名/MEDIA_URL = /media/# 主路由上面导入from django.views.static import servefrom django.conf import settings# 主路由最下方url(r^media/(?P<path>.*), serve, {document_root: settings.MEDIA_ROOT})

 

APIView的请求声明周期

技术图片

重写的as_view方法

"""1)as_view方法完成路由配置,返回配置函数是 csrf_exempt(view),也就是禁用了csrf认证规则结论:所有继承APIView的子类,都不受csrf认证规则的限制2)将请求处理的任务交给dispath方法完成"""

 

重写的dispatch方法

"""完成了三大核心任务:1)请求对象的处理:请求渲染模块2)请求过程的处理:三大认证模块 => 自己代码完成处理3)请求结果的响应:异常模块处理异常响应 | 响应渲染模块处理正常响应"""

 

请求解析模块

"""1)二次封装了原生Django的wsgi协议的request对象,并做了向下兼容(原来request对象的内容,用现在的request对象都能访问)2)将所有拼接参数都放在request.query_params中,将所有数据包参数都放在request.data中3)路由的有名无名分组的数据还是保存在args和kwargs中"""# 解析模块可以在settings.py自定义解析配置REST_FRAMEWORK = { # 解析模块 DEFAULT_PARSER_CLASSES: [ rest_framework.parsers.JSONParser, # json rest_framework.parsers.FormParser, # urlencoded rest_framework.parsers.MultiPartParser # form-data ], # 渲染模块 DEFAULT_RENDERER_CLASSES: [ rest_framework.renderers.JSONRenderer, rest_framework.renderers.BrowsableAPIRenderer, # 上线后会注释 ],}

例子:

技术图片
技术图片

from rest_framework.views import APIViewfrom rest_framework.response import Responsefrom . import models,serializers# APIView生命周期知识点class UserAPIView(APIView): def get(self,request,*args,**kwargs): return Response(get ok) # 处理请求 def post(self,request,*args,**kwargs): # 向下兼容:原来对象拥有,现在对象都运用 # print(type(request)) # drf的 # print(type(request._request)) # django原生wsgi的 # print(request.GET) # 拼接参数 print(request.query_params) # print(request.POST) # 数据包参数 print(request.data) return Response({ status:0, msg:ok, results:post success }) 

View Code

 

响应渲染模块

"""1)当三大认证模块和自己处理请求的视图逻辑没有出现异常时,会执行响应渲染模块2)响应的数据会交给渲染模块来完成数据的渲染,渲染方式有两种:Json格式数据渲染、Brower格式数据渲染"""# 渲染模块可以在settings.py自定义解析配置REST_FRAMEWORK = { # 渲染模块 DEFAULT_RENDERER_CLASSES: [ rest_framework.renderers.JSONRenderer, # 浏览器渲染,上线后会注释,不然浏览器请求接口就暴露了后台语言 rest_framework.renderers.BrowsableAPIRenderer, ],}

 对应效果代码:

技术图片
技术图片

from rest_framework.views import APIViewfrom rest_framework.response import Responseclass UserAPIView(APIView): def post(self, request, *args, **kwargs): return Response({ status: 0, msg: ok, results: post success })

View Code

 

序列化组件

单表序列化

models.py
from django.db import modelsfrom django.conf import settingsclass User(models.Model): SEX_CHOICES = ((0, ), (1, )) name = models.CharField(max_length=64, verbose_name=姓名) password = models.CharField(max_length=64) age = models.IntegerField() height = models.DecimalField(max_digits=5, decimal_places=2, default=0) sex = models.IntegerField(choices=SEX_CHOICES, default=0) # sex = models.CharField(choices=[(‘0‘, ‘男‘), (‘1‘, ‘女‘)]) icon = models.ImageField(upload_to=icon, default=icon/default.png) # 自定义序列化给前台的字段 # 优点:1)可以格式化数据库原有字段的数据 2)可以对外隐藏原有数据库字段名 3)可以直接连表操作 @property # 制造插头 def gender(self): return self.get_sex_display() @property def img(self): return settings.BASE_URL + settings.MEDIA_URL + self.icon.name def __str__(self): return self.name

 

serializers.py

from rest_framework import serializersfrom . import modelsclass UserModelSerializer(serializers.ModelSerializer): class Meta: # 该序列化类是辅助于那个Model类的 model = models.User # 设置参与序列化与反序列化字段 # 插拔式:可以选择性返回给前台字段(插头都是在Model类中制造) # fields = [‘name‘, ‘age‘, ‘height‘, ‘sex‘, ‘icon] fields = [name, age, height, gender, img]

 

views.py

from rest_framework.views import APIViewfrom rest_framework.response import Responsefrom . import models, serializersclass UserAPIView(APIView): def get(self, request, *args, **kwargs): pk = kwargs.get(pk) if pk: # 单查 # 1)数据库交互拿到资源obj或资源objs # 2)数据序列化成可以返回给前台的json数据 # 3)将json数据返回给前台 obj = models.User.objects.get(pk=pk) serializer = serializers.UserModelSerializer(obj, many=False) return Response(serializer.data) else: # 群查 # 1)数据库交互拿到资源obj或资源objs # 2)数据序列化成可以返回给前台的json数据 # 3)将json数据返回给前台 queryset = models.User.objects.all() # many操作的数据是否是多个 serializer = serializers.UserModelSerializer(queryset, many=True) return Response(serializer.data) def post(self, request, *args, **kwargs): # 单增 # 1)从请求request中获得前台提交的数据 # 2)将数据转换成Model对象,并完成数据库入库操作 # 3)将入库成功的对象列化成可以返回给前台的json数据(请求与响应数据不对等:请求需要提交密码,响应一定不展示密码) # 4)将json数据返回给前台 return Response()

 

小结

"""0)回顾Django及ORM1)APIView的生命周期禁用csrf(√) => 请求解析模块(√) => 三大认证模块 => 自己代码处理请求 => 异常响应|正常响应渲染模块(√)2)单表序列化:ModelSerializer"""

 

 

 

 

相关文章