Як налаштувати власні проміжні програми в Django


80

Я намагаюся створити проміжне програмне забезпечення, щоб необов'язково передавати kwarg до кожного представлення, яке відповідає умові.

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

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

        return None  

Але куди мені покласти цей клас? Чи можу я створити додаток проміжного програмного забезпечення та помістити цей клас всередину, а потім посилатися на нього settings.middleware?


2
Ви можете слідувати одній з моїх відповідей тут: stackoverflow.com/questions/17751163/…
Hieu Nguyen

Хоча це чудова відповідь, ви також можете дотримуватися книги
джанго

Ви можете зробити це: stackoverflow.com/questions/17751163/…
Атма

@karthikr посилання, яке ви дали, порушено: /
fedorqui 'ТАК перестань шкодити'

Відповіді:


139

Перший: Структура шляху

Якщо у вас його немає, вам потрібно створити папку проміжного програм у вашому додатку, дотримуючись структури:

yourproject/yourapp/middleware

Проміжне програмне забезпечення папки слід розміщувати в тій самій папці, що і settings.py, URL-адреси, шаблони ...

Важливо: Не забудьте створити порожній файл __init__.py всередині папки проміжного програмного забезпечення, щоб ваш додаток розпізнав цю папку

Друге: Створіть проміжне програмне забезпечення

Тепер нам слід створити файл для власного проміжного програмного забезпечення; у цьому прикладі припустимо, ми хочемо проміжне програмне забезпечення, яке фільтрує користувачів на основі їх IP-адреси, ми створюємо файл з назвою filter_ip_middleware.py всередині папки проміжного програмного забезпечення з таким кодом:

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'
)

Готово! Тепер кожен запит кожного клієнта буде викликати власне проміжне програмне забезпечення та обробляти власний код!


Чи правильний шлях до файлу? Чи не натомість це повинен бути ваш проект / yourapp / проміжне програмне забезпечення?
tiagovrtr

Так @tiagovrtr шлях повинен бути yourproject/yourapp/middleware. Я припустив, що це було досить очевидно, але я
оновлю

11
Перевірте цю відповідь, якщо вам TypeError: object() takes no parameters
Т. Крістіансен,

3

Всього два кроки. Це працює для мене з 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файлу проекту .

Правилом посилання на проміжне програмне забезпечення є шлях до вашого класу з кореневого каталогу вашого проекту.

Наприклад, у проекті з іменем mysiteдерево є таким.

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

Ми просто додаємо наш клас Middleware MultipleProxyMiddlewareу middleware.pyфайл. Ми отримуємо наступне посилальне ім’я.

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

-3

Це буде корисно у випадку, коли ви знаєте, який тип винятків трапляється у поданнях. З вищевикладеного я створив власний власний клас like

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"

Він буде виконаний, коли виключення відбудеться у випадку додавання рядків і цілих чисел.

Ви можете написати відповідні подання для вищезазначеного середнього класу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.