Python菜鸟之路:Django 中间件
2016-11-21 18:16
363 查看
前言
在正式说Django中间件之前需要先了解Django一个完整的request的处理流程。我从其他网站扒了几张图过来。图片一:
class BaseHandler(object): def __init__(self): self._request_middleware = None self._view_middleware = None self._template_response_middleware = None self._response_middleware = None self._exception_middleware = None self._middleware_chain = None def load_middleware(self): """ Populate middleware lists from settings.MIDDLEWARE (or the deprecated MIDDLEWARE_CLASSES). Must be called after the environment is fixed (see __call__ in subclasses). """ self._request_middleware = [] self._view_middleware = [] self._template_response_middleware = [] self._response_middleware = [] self._exception_middleware = [] if settings.MIDDLEWARE is None: warnings.warn( "Old-style middleware using settings.MIDDLEWARE_CLASSES is " "deprecated. Update your middleware and use settings.MIDDLEWARE " "instead.", RemovedInDjango20Warning ) handler = convert_exception_to_response(self._legacy_get_response) for middleware_path in settings.MIDDLEWARE_CLASSES: mw_class = import_string(middleware_path) try: mw_instance = mw_class() except MiddlewareNotUsed as exc: if settings.DEBUG: if six.text_type(exc): logger.debug('MiddlewareNotUsed(%r): %s', middleware_path, exc) else: logger.debug('MiddlewareNotUsed: %r', middleware_path) continue if hasattr(mw_instance, 'process_request'): self._request_middleware.append(mw_instance.process_request) if hasattr(mw_instance, 'process_view'): self._view_middleware.append(mw_instance.process_view) if hasattr(mw_instance, 'process_template_response'): self._template_response_middleware.insert(0, mw_instance.process_template_response) if hasattr(mw_instance, 'process_response'): self._response_middleware.insert(0, mw_instance.process_response) if hasattr(mw_instance, 'process_exception'): self._exception_middleware.insert(0, mw_instance.process_exception) else: handler = convert_exception_to_response(self._get_response) for middleware_path in reversed(settings.MIDDLEWARE): middleware = import_string(middleware_path) try: mw_instance = middleware(handler) except MiddlewareNotUsed as exc: if settings.DEBUG: if six.text_type(exc): logger.debug('MiddlewareNotUsed(%r): %s', middleware_path, exc) else: logger.debug('MiddlewareNotUsed: %r', middleware_path) continue if mw_instance is None: raise ImproperlyConfigured( 'Middleware factory %s returned None.' % middleware_path ) if hasattr(mw_instance, 'process_view'): self._view_middleware.insert(0, mw_instance.process_view) if hasattr(mw_instance, 'process_template_response'): self._template_response_middleware.append(mw_instance.process_template_response) if hasattr(mw_instance, 'process_exception'): self._exception_middleware.append(mw_instance.process_exception) handler = convert_exception_to_response(mw_instance) # We only assign to this when initialization is complete as it is used # as a flag for initialization being complete. self._middleware_chain = handler
base.py中load_middleware
相关文章推荐
- python,django做中间件屏蔽非法访问
- Python菜鸟之路:Django Admin后台管理功能使用
- python3开发进阶-Django框架的中间件的五种用法和逻辑过程
- 详解Python的Django框架中的中间件
- Python3之Django Web框架中间件
- python/ Django之中间件
- Python菜鸟之路:Django 表单验证
- Python菜鸟之路:Django 文件上传的几种方式
- Python菜鸟之路:Django 信号
- Python 实现抽象类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
- Python菜鸟之路:Django 数据验证之钩子和Form表单验证
- Python菜鸟之路:Django 路由、模板、Model(ORM)
- Python菜鸟之路:Django 缓存
- Python菜鸟之路:Django 路由补充1:FBV和CBV - 补充2:url默认参数
- 自动化运维Python系列之Django CSRF跨站请求伪造、中间件 推荐
- Python菜鸟之路:Django 序列化数据
- Python菜鸟之路:Django 数据库操作进阶F和Q操作
- Python开发【Django】:中间件、CSRF
- 详解Python的Django框架中的中间件
- Python菜鸟之路:Django CSRF跨站请求伪造