热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pythonmiddleware_Django中间件

Django中间件提示:关于Django1.10的变化在本文的最后面有详细的说明。我们从浏览器发出一个请求Request,得到一个响应后的内容HttpR

Django 中间件

提示:关于 Django 1.10 的变化在本文的最后面有详细的说明。

我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下:

也就是说,每一个请求都是先通过中间件中的 process_request 函数,这个函数返回 None 或者 HttpResponse 对象,如果返回前者,继续处理其它中间件,如果返回一个 HttpResponse,就处理中止,返回到网页上。

中间件不用继承自任何类(可以继承 object ),下面一个中间件大概的样子:class CommonMiddleware(object):

def process_request(self, request):

return None

def process_response(self, request, response):

return response

还有 process_view, process_exception 和 process_template_response 函数。

一,比如我们要做一个 拦截器,发现有恶意访问网站的人,就拦截他!

假如我们通过一种技术,比如统计一分钟访问页面数,太多就把他的 IP 加入到黑名单 BLOCKED_IPS(这部分没有提供代码,主要讲中间件部分)#项目 zqxt 文件名 zqxt/middleware.py

class BlockedIpMiddleware(object):

def process_request(self, request):

if request.META['REMOTE_ADDR'] in getattr(settings, "BLOCKED_IPS", []):

return http.HttpResponseForbidden('

Forbidden

')

这里的代码的功能就是 获取当前访问者的 IP (request.META['REMOTE_ADDR']),如果这个 IP 在黑名单中就拦截,如果不在就返回 None (函数中没有返回值其实就是默认为 None),把这个中间件的 Python 路径写到settings.py中

1.1 Django 1.9 和以前的版本:MIDDLEWARE_CLASSES = (

'zqxt.middleware.BlockedIpMiddleware',

...其它的中间件

)

1.2 Django 1.10 版本 更名为 MIDDLEWARE(单复同形),写法也有变化,详见 第四部分。

如果用 Django 1.10版本开发,部署时用 Django 1.9版本或更低版本,要特别小心此处。MIDDLEWARE = (

'zqxt.middleware.BlockedIpMiddleware',

...其它的中间件

)

Django 会从 MIDDLEWARE_CLASSES 或 MIDDLEWARE 中按照从上到下的顺序一个个执行中间件中的 process_request 函数,而其中 process_response 函数则是最前面的最后执行。

二,再比如,我们在网站放到服务器上正式运行后,DEBUG改为了 False,这样更安全,但是有时候发生错误我们不能看到错误详情,调试不方便,有没有办法处理好这两个事情呢?普通访问者看到的是友好的报错信息

管理员看到的是错误详情,以便于修复 BUG

当然可以有,利用中间件就可以做到!代码如下:import sys

from django.views.debug import technical_500_response

from django.conf import settings

class UserBasedExceptionMiddleware(object):

def process_exception(self, request, exception):

if request.user.is_superuser or request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:

return technical_500_response(request, *sys.exc_info())

把这个中间件像上面一样,加到你的 settings.py 中的 MIDDLEWARE_CLASSES 中,可以放到最后,这样可以看到其它中间件的 process_request的错误。

普通人看到的是普通的 404(自己点开看看),而我可以看到:

三,分享一个简单的识别手机的中间件,更详细的可以参考这个:django-mobi 或 django-mobileMOBILE_USERAGENTS = ("2.0 MMP","240x320","400X240","AvantGo","BlackBerry",

"Blazer","Cellphone","Danger","DoCoMo","Elaine/3.0","EudoraWeb",

"Googlebot-Mobile","hiptop","IEMobile","KYOCERA/WX310K","LG/U990",

"MIDP-2.","MMEF20","MOT-V","NetFront","Newt","Nintendo Wii","Nitro",

"Nokia","Opera Mini","Palm","PlayStation Portable","portalmmm","Proxinet",

"ProxiNet","SHARP-TQ-GX10","SHG-i900","Small","SonyEricsson","Symbian OS",

"SymbianOS","TS21i-10","UP.Browser","UP.Link","webOS","Windows CE",

"WinWAP","YahooSeeker/M1A1-R2D2","iPhone","iPod","Android",

"BlackBerry9530","LG-TU915 Obigo","LGE VX","webOS","Nokia5800")

class MobileTemplate(object):

"""

If a mobile user agent is detected, inspect the default args for the view

func, and if a template name is found assume it is the template arg and

attempt to load a mobile template based on the original template name.

"""

def process_view(self, request, view_func, view_args, view_kwargs):

if any(ua for ua in MOBILE_USERAGENTS if ua in

request.META["HTTP_USER_AGENT"]):

template = view_kwargs.get("template")

if template is None:

for default in view_func.func_defaults:

if str(default).endswith(".html"):

template = default

if template is not None:

template = template.rsplit(".html", 1)[0] + ".mobile.html"

try:

get_template(template)

except TemplateDoesNotExist:

pass

else:

view_kwargs["template"] = template

return view_func(request, *view_args, **view_kwargs)

return None

四,补充:Django 1.10 接口发生变化,变得更加简洁class SimpleMiddleware(object):

def __init__(self, get_response):

self.get_response = get_response

# One-time configuration and initialization.

def __call__(self, request):

# Code to be executed for each request before

# the view (and later middleware) are called.

# 调用 view 之前的代码

response = self.get_response(request)

# Code to be executed for each request/response after

# the view is called.

# 调用 view 之后的代码

return response

Django 1.10.x 也可以用函数来实现中间件,详见官方文档。

五,让 你写的中间件 兼容 Django新版本和旧版本try:

from django.utils.deprecation import MiddlewareMixin  # Django 1.10.x

except ImportError:

MiddlewareMixin = object  # Django 1.4.x - Django 1.9.x

class SimpleMiddleware(MiddlewareMixin):

def process_request(self, request):

pass

def process_response(request, response):

pass

新版本中 django.utils.deprecation.MiddlewareMixin 的 源代码 如下:class MiddlewareMixin(object):

def __init__(self, get_response=None):

self.get_response = get_response

super(MiddlewareMixin, self).__init__()

def __call__(self, request):

response = None

if hasattr(self, 'process_request'):

response = self.process_request(request)

if not response:

response = self.get_response(request)

if hasattr(self, 'process_response'):

response = self.process_response(request, response)

return response

__call__ 方法会先调用 self.process_request(request),接着执行 self.get_response(request) 然后调用 self.process_response(request, response)

旧版本(Django 1.4.x-Django 1.9.x) 的话,和原来一样。



推荐阅读
  • 本文首先对信息漏洞的基础知识进行了概述,重点介绍了几种常见的信息泄露途径。具体包括目录遍历、PHPINFO信息泄露以及备份文件的不当下载。其中,备份文件下载涉及网站源代码、`.bak`文件、Vim缓存文件和`DS_Store`文件等。目录遍历漏洞的详细分析为后续深入研究奠定了基础。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 本文详细解析了JSONP(JSON with Padding)的跨域机制及其工作原理。JSONP是一种通过动态创建``标签来实现跨域请求的技术,其核心在于利用了浏览器对``标签的宽松同源策略。文章不仅介绍了JSONP的产生背景,还深入探讨了其具体实现过程,包括如何构造请求、服务器端如何响应以及客户端如何处理返回的数据。此外,还分析了JSONP的优势和局限性,帮助读者全面理解这一技术在现代Web开发中的应用。 ... [详细]
  • 本文详细解析了如何使用 jQuery 实现一个在浏览器地址栏运行的射击游戏。通过源代码分析,展示了关键的 JavaScript 技术和实现方法,并提供了在线演示链接供读者参考。此外,还介绍了如何在 Visual Studio Code 中进行开发和调试,为开发者提供了实用的技巧和建议。 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 本文介绍了如何在 PyCharm 中高效利用 Anaconda 管理项目环境配置。首先,确保已安装必要的软件。以 Windows 10 64位专业版为例,建议使用 PyCharm 2018.2 或更高版本。通过 Anaconda 创建和管理虚拟环境,可以显著提升开发效率,确保项目依赖的一致性和隔离性。文章详细阐述了从安装到配置的每一步操作,帮助开发者快速上手并充分利用这些工具的优势。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 最近,我在CentOS 5服务器上成功部署了GForge 5.7 Community Edition。与Advanced Server版本相比,虽然功能略有简化,但仍然能够满足大多数开源项目管理的需求。为了确保数据安全,我开发了一套全自动备份脚本,该脚本能够定期备份GForge的数据和配置文件,并将其存储在远程服务器上,以防止数据丢失。此外,该脚本还具备错误检测和日志记录功能,便于故障排查和维护。 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • 本文介绍了使用 Python 编程语言高效抓取微博文本和动态网页图像数据的方法。通过详细的示例代码,展示了如何利用爬虫技术获取微博内容和动态图片,为数据采集和分析提供了实用的技术支持。对于对网络数据抓取感兴趣的读者,本文具有较高的参考价值。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
author-avatar
墨镜空间新
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有