Django核心知识点(类视图,中间件)

本文深入探讨Django框架中的类视图和中间件应用,介绍类视图的优势及路由设置,演示如何使用装饰器增强视图功能,同时解析中间件的工作原理与自定义方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

###Django核心知识点(类视图,中间件)
###1.类视图
####1.1类视图的好处:

1.代码可读性好
2.类视图相对于函数视图有更⾼的复⽤性,如果其他地⽅需要⽤到某个类视图的某个特定逻辑,直接继承该类视图即可

####定义路由部分

urlpatterns	=	[				
#	注意:					
#	url(路径,	执⾏的函数)				
#	url的第⼆个参数需要是⼀个函数				
#	我们这⾥如果传⼊:	views.RegisterView	会发现这个是⼀个类,	不是⼀个函数,				
#	所以我们需要调⽤系统给我们提供的	as_view()⽅法					
url(r'^registerview/$',views.RegisterView.as_view()) 
]

####注意点:
1.如果我们在类视图函数中没有定义⽅法, 但是我们请求了. 会报405找不到请求⽅法的错误. 例如: 类视图中没有定义Get⽅法, 但是我们使⽤Get⽅法进⾏了请求, 那么会报405的错误: 找不到对应的请求⽅ 法.
2.在类视图中定义的 Get 或者是 POST 都是对象⽅法, 第⼀个参数都是self.
3.第⼆个参数⼀般情况下都是 request对象. 其他的参数依次往后⾯写就可以
4.我们在使⽤类视图的时候, 需要在路由位置进⾏设置, 设置的第⼆个参数需要是⼀个函数, 所以我们这⾥调⽤了类以 后, 后⾯需要调⽤ as_view()函数

####1.2类视图使用装饰器
#####1.2.1在URL配置中装饰

#	导⼊views.py视图⽂件 from	.	
import	views
urlpatterns	=	[				
#我们在路由部分,把定义好的装饰器添加到当前的函数上
#这⾥需要注意:as_view()会返回⼀个view()函数				
#所以我们把装饰器添加到view()函数上.				
url(r'^demo/$',views.my_decorate(views.DemoView.as_view())) 
]

####弊端:

  1. 此种⽅式最简单,但因装饰⾏为被放置到了url配置中,单看视图的时候⽆法知道此视图还被添加了装饰器, 不利于代码的完整性,不建议使⽤。
  2. 此种⽅式会为类视图中的所有请求⽅法都加上装饰器⾏为(因为是在视图⼊⼝处,分发请求⽅式前)。

#####第一种解决方式:

from django.views.generic import View 
# 导⼊转换的装饰器⽅法:	
from django.utils.decorators import	method_decorator
# 为特定请求⽅法添加装饰器 
class DemoView(View):				
# 使⽤转换的⽅法将装饰器转化:				 
	@method_decorator(my_decorator)				
	def	get(self,request):								
		print('get⽅法')								
		return	HttpResponse('ok')
	def	post(self,	request):								
		print('post⽅法')								
		return	HttpResponse('ok')

#####第二种解决方式:

# 类视图 
class DemoView(View):				
	# 重写⽗类的dispatch⽅法,	因为这个⽅法被as_view()中的view()调⽤				
	# 所以我们对这个⽅法添加装饰器,也就相当于对整个类视图的⽅法添加装饰器.				
	@method_decorator(my_decorator)				
	def	dispatch(self,request,*args,**kwargs):								
		# 重写⽗类的这个⽅法我们不会修改它的任何参数,所以我们直接调⽤⽗类的这个⽅法即可								
		# 它⾥⾯的参数我们也不动它,	直接还传递过去.								
		return super().dispatch(request,*args,**kwargs)
	def	get(self,request):								
		print('get')								
		return	HttpResponse('getfunc	ok')
	def	post(self,	request):								
		print('post')								
		return	HttpResponse('postfunc	ok')

#####第三种解决方式

# 类视图 
# 给类视图增加上@method_decorator⽅法 
# 增加上之后,并不能够给其中的某⼀个函数增加上装饰器 
# 所以我们需要给method_decator配置第⼆个参数 
# 第⼆个参数就是类中某⼀个函数的名称.	意味着给当前这个函数增加上装饰器. 
@method_decorator(my_decorator,	name='get') 
class DemoView(View):				
@method_decorator(my_decorator)				
def	dispatch(self,	request,	*args,	**kwargs):								
    return	super().dispatch(request,	*args,	**kwargs)
def	get(self,	request):								
	print('get')								
	return	HttpResponse('getfunc	ok')
def	post(self,	request):								
	print('post')								
	return	HttpResponse('postfunc	ok')

#####第四种解决方式

# 类视图 
# 因为我们可以直接给dispatch⽅法添加装饰器,意味着,我们内部不⽤重写dispatch⽅法了. 
@method_decorator(my_decorator,	name='dispatch') 
class DemoView(View):
	def	get(self,request):								
		print('get')								
		return	HttpResponse('getfunc	ok')
	def	post(self,	request):								
		print('post')								
		return	HttpResponse('postfunc	ok')

method_decorator:method_decorator的作⽤是为函数视图装饰器补充第⼀个self参数,以适配类视图⽅,如果将装饰器本身改为可以适配类视图⽅法的,类似如下,则⽆需再使⽤method_decorator

def	my_decorator(func):				
    def	wrapper(self,request,*args,**kwargs):# 此处增加了self								
	    print('⾃定义装饰器被调⽤了')								
	    print('请求路径%s' % request.path)								
		 return func(self,request,*args,**kwargs) #	此处增self				
	return	wrapper

###2.中间件
####2.1中间件的定义⽅法

  1. 在⼀个⼦应⽤中创建⼀个中间件⽂件. 例如: middleware(别的名字也可以)

  2. 在setting.py⽂件的MIDDLEWARE部分注册添加.

  3. 在调⽤视图时,便会调⽤中间件了
    定义⼀个中间件⼯⼚函数,然后返回⼀个可以调⽤的中间件。
    中间件⼯⼚函数需要接收⼀个可以调⽤的get_response对象。
    返回的中间件也是⼀个可以被调⽤的对象,并且像视图⼀样需要接收⼀个request对象参数,返回⼀个response对象
    ####2.2中间件模板

    def	simple_middleware(get_response):				
    # 此处编写的代码仅在Django第⼀次配置和初始化的时候执⾏⼀次。
    
    	def	middleware(request):								 
    # 此处编写的代码会在每个请求处理视图前被调⽤。								
    		response = get_response(request)								
    # 此处编写的代码会在每个请求处理视图之后被调⽤。								
    		return	response
    	return middleware
    

例如,在users应⽤中新建⼀个middleware.py⽂件

def	my_middleware(get_response):				
    print('init	被调⽤')				
    def	middleware(request):								
	    print('before	request	被调⽤')								
		response = get_response(request)								
		print('after	response	被调⽤')								
		return	response				
	return	middleware

定义好中间件后,需要在settings.py ⽂件中添加注册中间件

MIDDLEWARE	=	[				'django.middleware.security.SecurityMiddleware',				'django.contrib.sessions.middleware.SessionMiddleware',				'django.middleware.common.CommonMiddleware',				#	'django.middleware.csrf.CsrfViewMiddleware',				'django.contrib.auth.middleware.AuthenticationMiddleware',				'django.contrib.messages.middleware.MessageMiddleware',				'django.middleware.clickjacking.XFrameOptionsMiddleware',				'users.middleware.my_middleware',		#	添加中间件 ]

定义⼀个视图进⾏测试

def	demo_view(request):				
    print('view	视图被调⽤')				
    return	HttpResponse('OK')

注意:Django运⾏在调试模式下,中间件init部分有可能被调⽤两次

####2.3多个中间件的执行顺序
在请求视图被处理前,中间件由上⾄下依次执⾏
在请求视图被处理后,中间件由下⾄上依次执⾏

####2.4中间件的一些了解
Django中的中间件是⼀个轻量级、底层的插件系统,可以介⼊Django的请求和响应处理过程,修改Django的输⼊或输 出。中间件的设计为开发者提供了⼀种⽆侵⼊式的开发⽅式,增强了Django框架的健壮性。
我们可以使⽤中间件,在Django处理视图的不同阶段对输⼊或输出进⾏⼲预

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值