Django配置回顾及DRF框架请求生命周期
1、Django配置回顾
前后端不分离的项目中app我们一般起名叫app,在前后端分离的项目中我们一般APP起名叫api,见名知意
1、应用是否一定要在INSTALLED_APPS中注册
在没有使用app的一些特殊功能时(比如数据库相关),可以不用注册,但是注册之后,应用的所有应用都能使用,所以我们将所有的app都完成注册
2、数据库配置(全部在settings文件中配置即可)
在settings中导入pymysql就可以,可以不用去__ init__中导入
import pymysql pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '数据库名', 'USER': '账号', 'PASSWORD': '密码', 'HOST': '如果是127.0.0.1,该配置可以省略', "PORT": 3306, # 如果是3306,该配置可以省略 } }
3、路由分发
主路由中,将应用分发给相关在子路由中交给各子路由自己处理
from django.conf.urls import url, include urlpatterns = [ # ... url(r'^api/', include('api.urls')), # /api/test/ ]
4、ORM配置回顾
暴露media文件夹下文件给用户配置
settings.py文件中
# root就是将文件夹添加到os.path中 MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # url就是配置路由 /路由名/ MEDIA_URL = '/media/'
主路由urls.py下
from django.views.static import serve from django.conf import settings urlpatterns = [ ... # document_root必须指向icon/001.png所在的路径=>path变量,可以进入serve查看 url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}) ]
2、APIView的请求生命周期
1、重写as_view()方法
1、as_view()方法完成路由配置,返回配置函数 csrf_exempt(view) 中禁用了csrf认证规则
所以:所有继承APIView的子类,都不受csrf认证规则的限制,因为csrf规则对get请求没有限制,没有drf自己的好
2、将请求处理的任务交给dispatch方法
2、重写的dispatch方法
完成了三大核心任务:
1、请求对象的处理:请求解析模块
2、请求过程的处理:三大认证模块 => 自己代码完成处理
3、请求结果的响应:异常模块处理异常响应 | 响应渲染模块处理正常响应
1、请求解析模块
-
二次封装了Django的wsgi协议的request对象,并做了向下兼容(原来request对象的内容,用现在的request对象都能访问)
-
将所有的拼接参数都放在了request.query_params中,将所有的数据包参数都放在了request.data中
-
路由的有名和无名分组还是在args和kwargs中
-
解析模块可以自定义在settings.py中自定义配置
REST_FRAMEWORK = { # parsers解析模块,进入rest_framework中的settings中查找 'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.JSONParser', # 解析json 'rest_framework.parsers.FormParser', # 解析urlencoded 'rest_framework.parsers.MultiPartParser' # 解析form-data ], }
2、响应渲染模块
-
当三大认证模块和自己处理的视图逻辑没有出现异常时,会执行响应渲染模块
-
-
渲染模块可以在自定义的settings中自定义配置
REST_FRAMEWORK = { # 渲染模块 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', # json数据格式渲染 # 浏览器渲染,上线后会注释,不然浏览器请求接口就暴露了后台语言 'rest_framework.renderers.BrowsableAPIRenderer', ], }
3、序列化组件
单表序列化
在创建表时,给已经有的表添加新字段有三种方式:1)设置该字段的默认值;2)设置该字段可以为空;3)在使用数据库迁移命令的时候设置默认值
序列化组件 serializers,子类ModelSerializer可以快速帮我们创建一个序列化
使用:
1、在models.py中
from django.db import models from django.conf import settings class User(models.Model): name = models.CharField(max_length=64, verbose_name='姓名') height = models.DecimalField(max_digits=5, decimal_places=2, default=0) sex = models.CharField(choices=[('0', '男'), ('1', '女')]) icon = models.ImageField(upload_to='icon', default='icon/default.png') # 自定义序列化给前台的字段 # property优点:1)可以格式化数据库原有字段的数据 2)可以对外隐藏原有数据库原有字段名 3)可以直接连表操作 @property # 制造插头 def gender(self): # choices方法获取值get_xxx_display() return self.get_sex_display() @property def img(self): # 返回url地址 服务器地址+media+具体名 # return 'http://127.0.0.1:8000' + settings.MEDIA_URL + str(self.icon) return settings.BASE_URL + settings.MEDIA_URL + self.icon.name
2、自定义serializers.py文件
from rest_framework import serializers from . import models class UserModelSerializer(serializers.ModelSerializer): class Meta: # 该序列化类是辅助于那个Model类的 model = models.User # 设置参与序列化与反序列化字段 # 插拔式:可以选择性返回给前台字段(插头都是在Model类中制造) # fields = ['name', 'sex', 'icon'] fields = ['name', 'gender', 'img']
3、在views.py中
from rest_framework.views import APIView from rest_framework.response import Response from . import models, serializers class 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) # many操作的数据是否有多个,默认是False可以不写 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()