как настроить пользовательское промежуточное ПО в django
Я пытаюсь создать промежуточное программное обеспечение, чтобы дополнительно передать kwarg для каждого представления, которое соответствует условию.
проблема в том, что я не могу найти пример, как настроить на middleware. Я видел классы, которые переопределяют метод, который я хочу, process_view:
Class CheckConditionMiddleware(object):
def process_view(self, request):
return None
но куда мне поместить этот класс? Я создаю приложение промежуточного программного обеспечения и помещаю этот класс внутрь него, а затем ссылаюсь на него в настройках.промежуточное ПО ?
3 ответа:
во-первых: структура пути
если у вас его нет, вам нужно создать middleware папка в вашем приложении, следуя структуре:
yourproject/yourapp/middleware
промежуточное программное обеспечение папки должно быть помещено в ту же папку, что и settings.py, urls, шаблоны...
важно: не забудьте создать __init__.py пустой файл внутри папки middleware, чтобы ваше приложение распознало эту папку
второй: Создайте промежуточное программное обеспечение
теперь мы должны создать файл для нашего пользовательского промежуточного программного обеспечения, в этом примере давайте предположим, что нам нужно промежуточное программное обеспечение, которое фильтрует пользователей на основе их 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
(djangoMIDDLEWARE
(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' )
готово ! теперь каждый запрос от каждого клиента будет вызывать ваш пользовательский middleware и обрабатывать ваш пользовательский код !
всего два шага. Это работает для меня с
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
список вашего проекта .правило для промежуточного программного обеспечения ссылка-это путь к классу из корневого каталога проекта.
например, в проекте под названием
mysite
дерево как следует.├── mysite │ ├── manage.py │ ├── mysite │ │ ├── __init__.py │ │ ├── middleware.py │ │ ├── settings.py │ │ ├── urls.py │ │ └── wsgi.py
мы просто добавляем наш класс промежуточного программного обеспечения
MultipleProxyMiddleware
на . Мы получаем следующее ссылочное имя.MIDDLEWARE = [ 'mysite.middleware.MultipleProxyMiddleware', ... ]
Это будет полезно в случае, когда вы знаете, какой тип исключения возникает в представлениях. Из вышесказанного я создал свой собственный класс, как
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"
он будет выполнен, когда исключение произойдет в случае строкового и целочисленного сложения.
вы можете написать соответствующие представления для выше класса middleware