[python] Django에서 커스텀 미들웨어를 설정하는 방법

조건을 충족하는 모든 뷰에 kwarg를 선택적으로 전달하는 미들웨어를 만들려고합니다.

문제는 미들웨어를 설정하는 방법의 예를 찾을 수 없다는 것입니다. 원하는 메서드를 재정의하는 클래스를 보았습니다 process_view.

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

        return None

하지만이 수업은 어디에 두어야합니까? 미들웨어 앱을 만들고이 클래스를 그 안에 넣은 다음 참조 settings.middleware합니까?



답변

첫째 : 경로 구조

없는 경우 구조에 따라 앱 내에 미들웨어 폴더 를 만들어야합니다 .

yourproject/yourapp/middleware

폴더 미들웨어는 settings.py, urls, templates …와 같은 폴더에 있어야합니다.

중요 : 앱이이 폴더를 인식 할 수 있도록 미들웨어 폴더 안에 __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 (장고 <1.10)
  • MIDDLEWARE (장고> = 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'
)

완료! 이제 모든 클라이언트의 모든 요청이 사용자 지정 미들웨어를 호출하고 사용자 지정 코드를 처리합니다!


답변

두 단계 만 있으면됩니다. 그것은 나를 위해 작동합니다 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',
     ...
]


답변

뷰에서 어떤 종류의 Exception이 발생하는지 알 때 도움이 될 것입니다. 위에서 나는 내 자신의 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"

문자열과 정수 더하기의 경우 예외가 발생하면 실행됩니다.

위 미들웨어 클래스에 대한 해당 뷰를 작성할 수 있습니다.


답변