创建视图类
class RegisterView(View):
def get(self,request):
print('当前的请求是get请求')
return HttpResponse('get')
def post(self,request):
return HttpResponse('post')
路由配置
url(r'register/',RegisterView.as_view()),
遵循开放封闭原则,添加额外功能
第一种方法,在URL地址上进行装饰
1、在指定的py文件中创建装饰器
def wrapper(func):
def inner(request,*args,**kwargs):
#todo 1.0手动传参,request
#todo 2.0 手动抛出处理方法返回的响应
return func(request)
return inner
2、在URL地址匹配的过程中,进行额外功能的添加
url(r'showinfo/',wrapper(ShowInfo.as_view()))
第二种方法
这里又有二种
第一种、
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView
class ProtectedView(TemplateView):
template_name = 'secret.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(ProtectedView, self).dispatch(*args, **kwargs)
二、
from django.utils.decorators import method_decorator
@method_decorator(login_required, name='dispatch')
class ProtectedView(TemplateView):
template_name = 'secret.html'
例子:
from django.utils.decorators import method_decorator
@method_decorator(wrapper,name='dispatch')
class ShowInfo(View):
def get(self,request):
return HttpResponse('用户已经正常登录')
注意点:
1、name值不能随便添加
第三种方法
def wrapper(func):
def inner(request,*args,**kwargs):
#todo 1.0手动传参,request
#todo 2.0 手动抛出处理方法返回的响应
return func(request)
return inner
class WapperClass:
@classmethod
def as_view(cls,**kwargs):
view = super().as_view(**kwargs)
view = wrapper(view)
return view
class ShowInfo(WapperClass,View):
def get(self,request):
return HttpResponse('用户已经正常登录')
注意点:
1、注意顺序,扩展在继承的类试图前面
中间件
定义
在请求与响应的过程中,修改Django的输入或者输出,在处理视图的各个阶段对输入和输出进行干预
https://docs.djangoproject.com/en/1.11/topics/http/middleware/ 官方文档
自定义中间件
class Middleware:
def __init__(self, get_response=None):
初始化操作
pass
def process_request(self, request):
#在每个请求上,request对象产生之后,URL地址匹配之前进行调用,返回None或者Httpresponse对象
pass
def process_view(self, request, callback, callback_args, callback_kwargs):
# 在处理视图之前,在每个请求上,URL地址匹配之后,视图函数调用之前,返回的是None或Httpresponse对象
pass
def process_response(self, request, response):
# 处理响应后,视图函数调用之后,所有的响应在返回浏览器之前被调用,在每一个请求上调用,返回 HTTPresponse对象
pass
def process_exception(self,request,exception):
# 异常处理:当视图抛出异常时调用,在每一个请求上调用,返回的Httpresponse对象
pass
def my_middleware2(get_response):
print('此处做的是初始化操作init 中间件2被调用')
def middleware(request):
print('在request被调用之前 中间件2')
response = get_response(request)
print('在response之后调用 中间件2')
return response
return middleware