找回密码
 立即注册

QQ登录

只需一步,快速开始

Django中心件Middleware功能详解

2024-11-4 21:49| 发布者: c2688| 查看: 195| 评论: 0

摘要: 目次创建中心件示例利用中心件留意事项过滤哀求过滤哀求+记载日志记载日志配置中心件留意事项Django中心件(Middleware)是一段在Django的哀求/相应处置惩罚过程中,可以参与并改变哀求或相应的代码。中心件是Django
目次

Django中心件(Middleware)是一段在Django的哀求/相应处置惩罚过程中,可以参与并改变哀求或相应的代码。中心件是Django框架中一个非常强盛的功能,它答应你在Django的视图函数之前或之后执行自定义代码。

中心件可以用于:

  • 执行一些哀求预处置惩罚。
  • 对哀求执行一些检查,比如用户认证。
  • 修改哀求对象。
  • 修改相应对象。
  • 记载哀求和相应的日志。

Django中心件的工作原理是,中心件以一个有序列表的形式存在,Django会按照这个列表的次序调用中心件。

创建中心件

要创建一个中心件,你需要定义一个Python类,该类包罗若干个特定的方法。最常用的方法有:

  • [code]__init__[/code]:初始化方法,中心件实例化时调用。
  • [code]__call__[/code]:每个哀求都会调用这个方法,可以在这里编写处置惩罚哀求的代码。
  • [code]process_view[/code]:在视图函数调用之前调用。
  • [code]process_exception[/code]:当视图函数抛出非常时调用。
  • [code]process_template_response[/code]:在模板相应对象天生后调用。

示例

下面是一个简单的中心件示例,它会在每个哀求的相应中添加一个自定义的HTTP头部:

[code]class SimpleMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 在视图函数之前执行的代码 response = self.get_response(request) # 在视图函数之后执行的代码 response['X-Custom-Header'] = 'Custom Value' return response[/code]

利用中心件

要利用中心件,你需要将它添加到你的Django项目标[code]settings.py[/code]文件中的[code]MIDDLEWARE[/code]列表中:

[code]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', 'myapp.middleware.SimpleMiddleware', # 添加你的中心件 ... ][/code]

确保中心件的次序符合你的业务逻辑需求。

留意事项

  • 中心件的执行次序很重要,因为它会影响哀求和相应的处置惩罚流程。
  • 要谨慎利用中心件,因为不得当的利用可能会导致安全问题或性能问题。
  • 某些中心件可能会修改哀求或相应对象,这可能会影响其他中心件或视图函数的行为。

通过中心件,你可以为Django应用添增强盛的功能和灵活性。

过滤哀求

在Django中,中心件可以用来过滤哀求和记载日志。这通常涉及到两个方面:哀求处置惩罚和相应处置惩罚。下面我将介绍如何利用中心件来实现这两个功能。

过滤哀求+记载日志

过滤哀求通常是指在哀求到达视图函数之前,根据某些条件决定是否答应哀求继续进行。比方,你可能想要实现一个简单的访问控制,只答应来自特定IP地址的哀求通过。

下面是一个简单的中心件示例,它检查哀求的泉源IP地址,并拒绝非授权的IP:

[code]class IPFilterMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 定义答应的IP地址列表 allowed_ips = ['192.168.1.1', '127.0.0.1'] # 获取哀求的IP地址 x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: ip = x_forwarded_for.split(',')[0] else: ip = request.META.get('REMOTE_ADDR') # 检查IP是否在答应的列表中 if ip not in allowed_ips: # 假如不在答应的列表中,返回403克制访问 from django.http import HttpResponseForbidden return HttpResponseForbidden("You are not allowed to access this site.") # 继续处置惩罚哀求 response = self.get_response(request) return response[/code]

记载日志

记载日志是中心件的另一个常见用途。你可以记载哀求的详细信息,比如哀求的URL、方法、IP地址等,这对于调试和监控应用非常有效。

下面是一个简单的日志记载中心件示例:

[code]import datetime class LoggingMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 哀求到达的时间 start_time = datetime.datetime.now() # 处置惩罚哀求 response = self.get_response(request) # 哀求竣事的时间 end_time = datetime.datetime.now() # 记载日志 logger = logging.getLogger(__name__) logger.info( f'Status Code: {response.status_code} ' f'| Method: {request.method} ' f'| Path: {request.path} ' f'| Time: {(end_time - start_time).total_seconds()}s' ) return response[/code]

配置中心件

要利用这些中心件,你需要将它们添加到你的Django项目标[code]settings.py[/code]文件中的[code]MIDDLEWARE[/code]列表中:

[code]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', 'myapp.middleware.IPFilterMiddleware', # 添加IP过滤中心件 'myapp.middleware.LoggingMiddleware', # 添加日志记载中心件 ... ][/code]

确保中心件的次序符合你的业务逻辑需求。

留意事项

  • 在利用中心件过滤哀求时,确保不要无意中阻止了正当的哀求。
  • 在记载日志时,留意不要记载敏感信息,如密码或个人身份信息。
  • 考虑性能影响,避免在中心件中执行复杂的操作,这可能会增加哀求的处置惩罚时间。

通过公道地利用中心件,你可以有效地控制哀求的访问和记载详细的日志信息,这对于维护和监控Django应用非常有帮助。

到此这篇关于Django中心件Middleware的文章就介绍到这了,更多相干Django中心件Middleware内容请搜索脚本之家从前的文章或继续欣赏下面的相干文章希望大家以后多多支持脚本之家!


来源:https://www.jb51.net/python/328347lbx.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

最新评论

关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-1 18:49 , Processed in 0.038872 second(s), 20 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部