1 FBV和CBV
FBV (function base views 基于函数的视图) 在视图里时候用函数请求处理,最开始使用的方法
url(r'^admin/',admin.函数名)
在views.py中定义函数来处理用户请求,函数中在定义请求方法的不同进行不同的处理。
CBV(class base views 基于类的视图) 在视图里使用类处理请求
ulr(r'^login',views.类名.as_view())
************
from django.views import View
class 类名(View):
在类中我们定义的get/post方法的名字不是我们自己定义的,而是按照固定的样式。
原理:
路由 url -> view方法 -> dispatch方法(反射执行其他:GET/POST/
2django中间件
- Process_request
- 路由匹配
- Process_ view
- 视图函数
- 如果报错
- process_exception
- 如果有render
- Process_render_template
- 结束
- process_response
中间件做过什么
-
权限控制
-
用户登录验证
-
django的csrf的实现(位于process_view)中 @csrf_exempt 免除csrf验证
在process_view 中判断视图是否被@csrf_exempt装饰
去请求体或者cookie中获取token ,然后校验
如果在setting中csrf中间件被注释,但是少量的视图需要用csrf中间件,可以使用装饰器@csrf_protect
在FBV中装饰器直接写在需要这个功能的视图前面就行,但是在CBV中直接写无效
CBV写法:
class StudentsView(View):
@menthod_decorator(csrf_exempt)
def dispatch(self,request,*args,**kwargs):
return super(StudentsView,self).dispatch(request,*args,**kwargs)
def get(self,request,*args,**kwargs):
pass
def post(self,request,*args,**kwargs):
pass
def put(self,request,*args,**kwargs):
pass
def delete(self,request,*args,**kwargs):
pass
或者是
@method_decorator(csrf_exempt,name='dispatch')
class StudentsView(View):
def get(self,request,*args,**kwargs):
pass
def post(self,request,*args,**kwargs):
pass
def put(self,request,*args,**kwargs):
pass
def delete(self,request,*args,**kwargs):
pass
3 restfui规范
-
根据method的不同进行不同的操作
FBV:url = (r'^order/',views.order) **************** def order(request): if request.method =='GET': pass elif request.method == 'POST': pass
CBV:
url = (r'^order/',views.OrderView.as_view()) ************* class OrderView(View): def get(self,request,*args,**kwargs): pass def post(self,request,*args,**kwargs): pass def put(self,request,*args,**kwargs): pass def delete(self,request,*args,**kwargs): pass
-
通信协议建议使用https 浏览器携带SSL证书
-
api专用域名 https://api.xxxxx(会存在跨域问题) https://xxx.api
-
路径 视网络上任何东西都是资源,均使用名词表示
-
过滤 通过在url上传参的形式传递搜索
-
错误处理 状态码是4XX时,应返回错误信息,error当做key
{ error:"Invalid API key" }
- 返回结果
4 rest framework框架
认证
问题:有些api需要用户登录之后才能访问
Student.object.update_or_create(user=obj,defaults={'字段':更新的值})
存在就更新 不存在就创建
解决:
a.创建两张表
b.用户登录(返回token并保存到数据库)
c 认证流程原理
d 局部使用和全局使用
e 内部自带的验证方法
1认证类,必须继承 from rest_framework.authentication import BaseAuthentication
认证方法:
from rest_framework import exceptions
class FirstAuthtication(BaseAuthentication):
def authenticate(self,request):
pass
def authenticate_header(self,request):
pass
class Authtication(BaseAuthentication):
def authenticate(self,request):
#获取token
token = request._request.GET.get('token').first()
#如果没有传递token
if not token:
raise exceptions.AuthenticationFailed('用户验证失败')
return (token.usr,token)
def authenticate_header(self,request):
pass
单个视图使用
#在视图开始添加
authentication_classes = [Authtication,]
全局使用
Setttings.py
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ['utiles.auth.FirstAuthtication', 'utiles.auth.Authtication']
}
如果在全局使用时某个视图不需要验证就在视图函数的开始添加
authentication_classes = [ ]
返回值
- None 进行下一个认证
- raise exceptions.AuthenticationFailed('用户验证失败') 抛出异常
- (元素1,元素2 ) 元素1赋值给request.user 元素2赋值给request.auth
源码流程
- Dispatch
- 封装request self.initialize_request(request, *args, **kwargs)
- 获取定义的认证类(全局/局部),通过列表生成创建对象
- inital
- Perform_authentication
- Request.user(内部循环)
- Perform_authentication
- 封装request self.initialize_request(request, *args, **kwargs)
权限
权限方法
from rest_framework.permissions import BasePermission
class MyPermission(BasePermission):
def has_premission(self,request,view):
if request.user.user_type != 3:
return False
return True
class OrderView(APIView):
peimission_classes = [MyPermission,]
def get(self,request,*args,**kwargs):
pass
源码流程:
- dispatch
- 封装request
- initial
- Check_permissions()
- Get_permissions() 循环得到对应的权限对象
- 内部循环权限对象的has_permission()方法
- Check_permissions()
全局方法
Settings.py中设置
REST_FRAMEWORK = {
"DEFAULT_PERMISSON_CLASSES":['utiles.auth.MyPermission']
}
如果在全局使用时某个视图不需要权限就在视图函数的开始添加
peimission_classes = []
局部方法 在指定的视图中间添加peimission
class OrderView(APIView):
peimission_classes = [MyPermission,]
def get(self,request,*args,**kwargs):
pass
网友评论