Django 视图类丶增加额外功能及中间件

本文介绍了如何在Django中创建视图类并遵循开放封闭原则添加额外功能,包括通过URL装饰和两种未详述的方法。同时,详细讨论了中间件的定义、自定义过程以及中间件的执行顺序,为Django应用的扩展提供了指导。
摘要由CSDN通过智能技术生成

创建视图类

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

中间件顺序

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值