Как настроить пользовательское промежуточное ПО в Django
Я пытаюсь создать промежуточное программное обеспечение, чтобы при желании передать kwarg каждому представлению, которое соответствует условию.
Проблема в том, что я не могу найти пример того, как настроить промежуточное программное обеспечение. Я видел классы, которые переопределяют метод, который я хочу, process_view
:
Class CheckConditionMiddleware(object):
def process_view(self, request):
return None
Но куда мне положить этот класс? Должен ли я создать промежуточное приложение и поместить в него этот класс, а затем ссылаться на него в settings.middleware
?
Ответы
Ответ 1
Сначала: структура пути
Если у вас его нет, вам нужно создать промежуточное ПО в вашем приложении по следующей структуре:
yourproject/yourapp/middleware
Средство промежуточного содержимого папки должно быть помещено в ту же папку, что и settings.py, urls, templates...
Важно: не забудьте создать пустой файл __init__.py внутри папки промежуточного программного обеспечения, чтобы ваше приложение распознало эту папку
Второе: создать промежуточное ПО
Теперь мы должны создать файл для нашего настраиваемого промежуточного программного обеспечения, в этом примере позвольте предположить, что мы хотим, чтобы промежуточное программное обеспечение, которое фильтрует пользователей на основе их IP, мы создаем файл filter_ip_middleware.py внутри middleware с этим кодом:
class FilterIPMiddleware(object):
# Check if client IP is allowed
def process_request(self, request):
allowed_ips = ['192.168.1.1', '123.123.123.123', etc...] # Authorized ip's
ip = request.META.get('REMOTE_ADDR') # Get client IP
if ip not in allowed_ips:
raise Http403 # If user is not allowed raise Error
# If IP is allowed we don't do anything
return None
Третий: добавьте промежуточное программное обеспечение в наш 'settings.py'
Нам нужно искать:
-
MIDDLEWARE_CLASSES
(django < 1.10)
-
MIDDLEWARE
(django >= 1.10)
Внутри settings.py и там нам нужно добавить наше промежуточное ПО (добавьте его в последнюю позицию). Он должен выглядеть следующим образом:
MIDDLEWARE = ( # Before Django 1.10 the setting name was 'MIDDLEWARE_CLASSES'
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# Above are django standard middlewares
# Now we add here our custom middleware
'yourapp.middleware.filter_ip_middleware.FilterIPMiddleware'
)
Готово! Теперь каждый запрос от каждого клиента вызовет ваше собственное промежуточное программное обеспечение и обработает ваш собственный код!
Ответ 2
Всего два шага. У меня работает с django2.1
.
1. Создайте свой собственный класс Middleware.
Есть хорошее демо из официального руководства.
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 в списке MIDDLEWARE
вашего файла setting.py
вашего проекта.
Правило для ссылок Middleware - это путь к вашему классу из корневого каталога вашего проекта.
Например, в проекте с именем mysite
дерево выглядит следующим образом.
├── mysite
│ ├── manage.py
│ ├── mysite
│ │ ├── __init__.py
│ │ ├── middleware.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
Мы просто добавляем наш класс Middleware MultipleProxyMiddleware
в файл middleware.py
. Мы получаем следующее имя ссылки.
MIDDLEWARE = [
'mysite.middleware.MultipleProxyMiddleware',
...
]
Ответ 3
Это будет полезно в случае, когда вы знаете, какой тип исключения возникает в представлениях.
Из вышеизложенного я создал свой собственный пользовательский класс, например
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"
Он будет выполняться, когда исключение возникает в случае добавления строки и целого.
Вы можете написать соответствующие представления для класса промежуточного ПО