如何在django中设置自定义中间件

时间:2013-08-19 20:10:56

标签: python django django-views django-middleware

我正在尝试创建中间件,以便可选地将kwarg传递给符合条件的每个视图。

问题是我找不到如何设置中间件的示例。我见过的类覆盖了我想要的方法,process_view:

Class CheckConditionMiddleware(object):  
    def process_view(self, request):  

        return None  

但是我把这个班级放在哪里?我是否创建了一个中间件应用程序并将此类放在其中,然后在settings.middleware中引用它?

3 个答案:

答案 0 :(得分:6)

在 Django 中编写中间件>=1.10

自 Django 1.10 起,中间件类必须在其 get_response 方法中接受 __init__() 参数并提供 __call__() 方法。虽然这可以通过在定义中间件类时使用 django.utils.deprecation.MiddlewareMixin 来实现(answer by W.Perrin 所示),但在当前支持的 Django 版本中创建基于类的中间件看起来像这样:

class CustomMiddleware(object):
    def __init__(self, get_response):
        """
        One-time configuration and initialisation.
        """
        self.get_response = get_response

    def __call__(self, request):
        """
        Code to be executed for each request before the view (and later
        middleware) are called.
        """
        response = self.get_response(request)
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        """
        Called just before Django calls the view.
        """
        return None

    def process_exception(self, request, exception):
        """
        Called when a view raises an exception.
        """
        return None

    def process_template_response(self, request, response):
        """
        Called just after the view has finished executing.
        """
        return response

process_view()process_exception()process_template_response() 是特殊的钩子,Django 在处理中间件时调用,你可以在你的中间件类中定义。在上面的例子中,实现的钩子除了确保 Django 将调用下一个中间件来进一步处理响应/请求外,不会做任何特别的事情。

激活中间件

要激活中间件组件,请将其添加到 Django 设置中的 MIDDLEWARE 列表中。

MIDDLEWARE = [
    # Default Django 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',

    # Add your custom middleware
    'path.to.your.middleware.CustomMiddleware',
]

答案 1 :(得分:3)

只需两个步骤。 django2.1对我有用。

1。创建自己的中间件类。

官方手册中有一个很好的演示。

https://docs.djangoproject.com/en/2.1/ref/request-response/#django.http.HttpRequest.get_host

    from django.utils.deprecation import MiddlewareMixin

    class MultipleProxyMiddleware(MiddlewareMixin):
        FORWARDED_FOR_FIELDS = [
            'HTTP_X_FORWARDED_FOR',
            'HTTP_X_FORWARDED_HOST',
            'HTTP_X_FORWARDED_SERVER',
        ]

        def process_request(self, request):
            """
            Rewrites the proxy headers so that only the most
            recent proxy is used.
            """
            for field in self.FORWARDED_FOR_FIELDS:
                if field in request.META:
                    if ',' in request.META[field]:
                        parts = request.META[field].split(',')
                        request.META[field] = parts[-1].strip()

2。在项目MIDDLEWARE文件的setting.py列表中引用您的中间件类。

中间件引用规则是从项目的根目录到类的路径。

例如,在名为mysite的项目中,树如下所示。

├── mysite
│   ├── manage.py
│   ├── mysite
│   │   ├── __init__.py
│   │   ├── middleware.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py

我们只是在MultipleProxyMiddleware文件中添加了中间件类middleware.py。我们得到以下参考名称。

MIDDLEWARE = [
    'mysite.middleware.MultipleProxyMiddleware',  
     ...
]

答案 2 :(得分:-2)

如果你知道视图中出现了什么类型的异常,那将会有所帮助。 从上面我创建了我自己的Custom类,如

from .models import userDetails

class customMiddleware(object):

    def process_request(self,request):
        result=''
        users = userDetails.objects.all()
        print '-->',users ,'---From middleware calling ---'

        username=request.POST.get("username")
        salary = request.POST.get("salary")
        if salary:
            try:
                result = username+int(salary)
            except:
                print "Can't add"

在字符串和整数加法的情况下发生异常时将执行。

您可以为上述中间件类编写相应的视图