Подтвердить что ты не робот

Как настроить пользовательское промежуточное ПО в Django

Я пытаюсь создать промежуточное программное обеспечение, чтобы при желании передать kwarg каждому представлению, которое соответствует условию.

Проблема в том, что я не могу найти пример того, как настроить промежуточное программное обеспечение. Я видел классы, которые переопределяют метод, который я хочу, process_view:

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

        return None  

Но куда мне положить этот класс? Должен ли я создать промежуточное приложение и поместить в него этот класс, а затем ссылаться на него в settings.middleware?

4b9b3361

Ответ 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"

Он будет выполняться, когда исключение возникает в случае добавления строки и целого.

Вы можете написать соответствующие представления для класса промежуточного ПО