我正在尝试创建中间件,以便可选地将kwarg传递给符合条件的每个视图。
问题是我找不到如何设置中间件的示例。我见过的类覆盖了我想要的方法,process_view:
Class CheckConditionMiddleware(object):
def process_view(self, request):
return None
但是我把这个班级放在哪里?我是否创建了一个中间件应用程序并将此类放在其中,然后在settings.middleware中引用它?
答案 0 :(得分:6)
自 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"
在字符串和整数加法的情况下发生异常时将执行。
您可以为上述中间件类编写相应的视图