一、获取请求头信息
客户端请求数据时,Django内部会对请求头的信息进行处理,例如,request.get,request.post等信息,已经处理过的数据可以直接进行调用,对于没有处理过的数据,可以获取request.environ进行获取,request.environ的数据类型为字典。
print(request.environ)
for i,v in request.environ.items():
print(i,v,sep="----")
较为常用的有:HTTP_USER_AGENT(客户端的访问形式,如windows火狐浏览器)
二、FBV验证登录的装饰器
对于FBV的页面来说,只需要对装饰的页面添加装饰器即可,下面是装饰器函数auth:
def auth(func):
"""FBV验证装饰器"""
def inner(request,*args,**kwargs):
v = request.COOKIES.get("auth")
print(v)
if not v:
return redirect("/cook/login")
return func(request,*args,**kwargs)
return inner
三、CBV验证登录的装饰器
1.只装饰get方法、post方法
需要进行的操作:
导入django内置模块:from django.utils.decorators import method_decorator
调用装饰方法:@method_decorator(auth)
from django import views
from django.utils.decorators import method_decorator
class myfunc(views.View):
def dispatch(self, request, *args, **kwargs):
# 调用父类中的dispatch,用于寻找类中是否有相应的方法
# 用户请求,匹配URL,寻找urls中的处理方法,调用该父类函数查询是否有相应的方法,调用相应方法
print('before')
result=super(myfunc, self).dispatch(request, *args, **kwargs)
print('after')
return result
@method_decorator(auth)
def get(self,request):
return HttpResponse("GET")
def post(self,request):
return HttpResponse("POST")
2.装饰整个类里面的方法:
2.1 此方法不常用
from django import views
from django.utils.decorators import method_decorator
class myfunc(views.View):
method_decorator(auth)
def dispatch(self, request, *args, **kwargs):
# 调用父类中的dispatch,用于寻找类中是否有相应的方法
# 用户请求,匹配URL,寻找urls中的处理方法,调用该父类函数查询是否有相应的方法,调用相应方法
print('before')
result=super(myfunc, self).dispatch(request, *args, **kwargs)
print('after')
return result
def get(self,request):
return HttpResponse("GET it")
def post(self,request):
return HttpResponse("POST")
2.2 简单写法(推荐)
直接在要装饰的类前面写:
@method_decorator(auth,name="dispatch")
from django import views
from django.utils.decorators import method_decorator
@method_decorator(auth,name="dispatch")
class myfunc(views.View):
#def dispatch(self, request, *args, **kwargs):
# 调用父类中的dispatch,用于寻找类中是否有相应的方法
# 用户请求,匹配URL,寻找urls中的处理方法,调用该父类函数查询是否有相应的方法,调用相应方法
#print('before')
#result=super(myfunc, self).dispatch(request, *args, **kwargs)
#print('after')
#return result
def get(self,request):
return HttpResponse("GET it")
def post(self,request):
return HttpResponse("POST")