概述
备注:这是学rest_framework时做的笔记,给自己看的,格式有点乱
第一章
开发模式
普通开发方式,前后端放在一起
前后端分离
后端开发
为前端提供url(API/接口的开发)
永远返回HttpResponse
面向对象
-封装
-对同一类方法封装到类中
class File:
文件增删改查方法
class BD:
数据库的方法
将数据封装到对象中
继承
多个类重复的功能,可以用继承来实现
Django FBV、CBV
FBV
基于函数的视图
CBV
基于类的视图
view
class StudentView(View):
def get(self, request, *args, **kwargs):
return HttpResponse(json.dumps('GET'))
def post(self, request, *args, **kwargs):
return HttpResponse(json.dumps("post"))
def put(self, request, *args, **kwargs):
return HttpResponse(json.dumps("PUT"))
def delete(self, request, *args, **kwargs):
return HttpResponse(json.dumps("delete"))
url
path('student/', views.StudentView.as_view())
原理
基于反射实现,基于请求方法不同,执行不同的方法
url——>view方法——>dispatch方法(反射执行其他:get/post/delete/put)
面试题
1.csrf token在django里面是基于什么实现的
process_view方法:-检查视图是否被@csrf_exempt(免除csrf认证)
-去请求体或cookie中获取token
小知识
csrf时需使用
-@method_decorator(csrf_exempt)
-在dispatch方法中(单独方法无效)
django rest framework框架
pip install djangorestframework
认证
-仅使用
-源码流程
dispatch。。。
总结
1.本质:基于反射来实现
2.流程:路由,view,dispatch(反射)
3.取消csrf认证(装饰器要加到dispatch方法上且method_decorator装饰)
扩展:-csrf
基于中间件的process_view方法
装饰器给单独函数进行设置
restful规范(建议)
1.根据method不同,做不同的操作
作业
1.中间件
2.csrf
3.CBV
4.规范
10条规范
认识
djangorestframework
-如何验证(基于数据库实现用户认证)
-源码流程(面向对象回顾流程)
第二章
1.认证
a.问题1:有些API需要用户登录成功之后才能访问;有些无需登录就能访问
b.基本使用认证组件
解决:
a.创建两张表
b.用户登录(返回token并保存到数据库)
c.认证流程原理
d.再看一遍源码
1.局部视图使用&全局使用
2.匿名时request.user = None
e.内置认证类
1.认证类,必须继承:from rest_farmowrk.authentication import BaseAuthentication
2.其他认证类:BasicAuthentication,
2.权限
1.使用
- 创建类:继承BaseAuthentication;实现:authenticate方法
- 返回值:
- None,我不管了,下一认证来执行
- raise exception.AuthenticationFailed(“用户认证失败”) # from rest_framework import exceptions
- (元素1,元素2) # 元素1赋值给request.user,元素2赋值给request.auth
- 局部使用
在类里面写一个静态字段,如:authentication_classes = [BasicAuthentication, ]
- 全局使用
REST_FRMEWORK= {
“DEFAULT_AUTHENTICATION_CLASSES”:[认证方法的路径]
}
2.权限源码流程
- dispatch
- 封装request
- 获取定义的认证类(局部/全部),通过列表生成时创建对象。
- initial
- perform_authentication
request.user(内部循环…)
3.使用
类
为了更正规,必须继承:from rest_framework.permissions import BasePermission
class SVIPpermission(BasePermission):
meg = “必须是svip用户才能访问”
def has_permission(self, request, view):
“”“添加权限的逻辑”""
return True
has_permission()
has_object_permission()
返回值
- True,有权访问
- False,无权访问
全局
settings中:
REST_FARMEWORK = {
“DEFAULT_PERMISSION_CLASSES”: [‘rest01.utils.permissions.SVIPpermission’]
}
局部
class MyBaseView(object):
permission_classes = [‘MyPermissionl’]
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
print("before")
ret = super(MyBaseView, self).dispatch(request, *args, **kwargs)
print("after")
return ret
4.源码流程
一样
3.访问频率控制(节流)
全局
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES": ['utils.visit_throttle.VisitThrottle']
}
局部
throttle_classes = [VisitThrottle, ]
自己实现
用rest_framework内置类实现
4行代码 + settings中一个配置就能实现
今日回顾(课时29)记得看下
第三章
内容回顾
1.谈谈面向对象
封装
举例:rest_framework对request的封装,增加了认证的一下功能
继承、多态
举例:APIView
2.Django生命周期
1.wsgi
3.Django生命周期(rest_framework)
1.as_view(),执行view的内部函数
2.在view里边执行了dispatch()
3.在dispatch里先执行请求request的封装
4.然后是认证、权限、节流
5.之后通过反射执行对应method对应的函数
4.中间件&装饰器
中间件:适用于所有请求批量做操作
场景
- 基于角色的权限控制
- 用户认证
- crsf,(说原理)
- session(说原理)
- 黑名单
- 日志记录
rest框架原理
1.认证流程
2.权限
3.节流
今日内容概要
1.版本
2.解析器
3.序列化(重要!)
- 请求数据进行校验
- QuerySet进行序列化
4.分页
5.路由
6.视图
7.渲染器
在request.py中重写了好多方法
1.获取url中get传参值
query_params()
2.content_type()
3.stream():获取请求体
4.data()
5.user()
…
getattr(self, attr):用这个可以直接用原生request里的方法
1.版本
- 可以在url里通过get传参
- 内置:versioning_class = QueryParameterVersioning
1.版本
2.默认版本
3.allow版本
- 在URL中传参(推荐使用)
url中
在settings中配置
- 反向生成URL(先跳过,到时候再看)
2.解析器
前戏:django:request.POST/ request.body
必须具备的两个要求
1.请求头的要求
如果请求头中的 Content-Type:application/x-www-form-urlencoded,request.POST中才有值(request.body中解析数据)
2.数据格式的要求
name=alex&age=18&sex=男
rest_frameoerk解析器,对请求数据进行解析
JSONParser:解析json请求
FormParser:解析application/x-www-form-urlencoded’请求
MultiPartParser,解析’multipart/form-data’请求
FileUploadParser,解析media_type = ‘/’,上传文件用这
取文件:request.FILES
单独配置
在类中:
parser_classes = [JSONParser, FormParser]
全局配置
在settings.py中
REST_FRAMEWORK = {
“DEFAULT_PARSER_CLASSES”: [“rest_framework.parsers.JSONParser”, “rest_framework.parsers.FormParser”]
}
3.序列化
方式一
继承serializers.Serializer
方式二
继承serializers.ModelSerializer
fields = ‘all’:序列化MyModel中的全部字段
fields = [‘id’, ‘name’, ‘‘password]:需要显示的字段列表
extra_kwargs = {“字段名”: “xxx.xxx”}:生成字段的时候,额外的加某些参数,例如取外键值的时候
也可以对某个字段做详细处理
也可以自定义字段
depth
depth:0:只取1层,例如只取user表中的数据
depth:1:n:往下取n层,例如user中关联的外键,或者外键表中还有外键等等都能通过这取出来
生成链接
serializers.HyperlinkedIdentityField
请求数据校验
error_messages
自定义验证规则:valiadators
相应的钩子函数如何使用???
数据校验-钩子函数
validate_字段名(self, value):value就是用户提交的数据
4.分页
分页方式
1.分页,看第n页,每页显示n条数据
PageNumberPagination
方式一:用它默认的
方式二:自己继承重写
LimitOffsetPagination
CursorPagination
2.分页,在某个位置,向后查看多少条数据
3.加密分页,上一页和下一页
分页总结
1.如果数据量比较大时,分页怎么做
5.视图
GenericAPIView
继承了APIView
不很重要(需要再看一遍!!!)
GenericViewSet
继承了ViewSetMixin和GenericAPIView
ViewSetMixin主要是重写了as_view()方法,将method与自定义的方法名映射
ModelViewSet
公共类帮实现了增删改查功能
view中只需要重写实现GenericAPIView下的部分字段,GenericAPIView中有方法实现序列化、分页等功能,对于简单的增删改查,省的自己写
总结
1. 增删改查:用ModelViewSet
2.增删:用CreateModelMixin、RetrieveModelMixin
2.复杂逻辑:用APIView或者GenericViewSet
多条数据的话,用url区分,一个不加id,访问全部,一个加id,访问单条,都走同一个视图,
权限:
GenericAPIView.get_object()
check_object_permissions()
has_object_permission
循环查看有没有权限
6.路由
1.最初的路由
re_path(r’^(?P[v1|v2]+)/users/
′
,
v
i
e
w
s
.
U
s
e
r
V
i
e
w
.
a
s
v
i
e
w
(
)
,
n
a
m
e
=
′
u
s
e
r
′
)
,
2.
a
s
v
i
e
w
(
)
被
重
写
后
的
路
由
r
e
p
a
t
h
(
r
′
(
?
P
<
v
e
r
s
i
o
n
>
[
v
1
∣
v
2
]
+
)
/
p
a
g
e
3
/
', views.UserView.as_view(), name='user'), 2.as_view()被重写后的路由 re_path(r'^(?P<version>[v1|v2]+)/page3/
′,views.UserView.asview(),name=′user′),2.asview()被重写后的路由repath(r′(?P<version>[v1∣v2]+)/page3/’, views.Page3View.as_view({‘get’: ‘list’})),
3.渲染器渲染格式不同
re_path(r’^(?P[v1|v2]+)/page3/$’, views.Page3View.as_view({‘get’: ‘list’})),
http://127.0.0.1:8000/api/v1/page3/?format=json
re_path(r’^(?P[v1|v2]+)/page3/.(?Pw+)$’, views.Page3View.as_view({‘get’: ‘list’})),
http://127.0.0.1:8000/api/v1/page3/.json?page=4&size=3
4.继承了ModelViewSet,增删改查都有:自动生成路由方式
会生成4种url
api/ ^(?P[v1|v2]+)/ ^xxx/$ [name=‘role-list’]
api/ ^(?P[v1|v2]+)/ ^xxx.(?P[a-z0-9]+)/?$ [name=‘role-list’]
api/ ^(?P[v1|v2]+)/ xxx/(?P<pk>[/.]+)/$ [name=‘role-detail’]
api/ ^(?P[v1|v2]+)/ xxx/(?P<pk>[/.]+).(?P[a-z0-9]+)/?$ [name=‘role-detail’]
7.渲染
1.JSONRenderer:返回json数据
2.BrowsableAPIRenderer:页面看起来更美观
还有其他的比如:AdminRenderer,AdminRenderer等,这些都不重要
在settings中配置
还可以定制页面,只要找到对应页面配置就OK
最后
以上就是闪闪玉米为你收集整理的django之rest_framework框架总结的全部内容,希望文章能够帮你解决django之rest_framework框架总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复