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


80

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

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

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

        return None  

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


2
당신은 여기 내 대답 중 하나를 수행하십시오 stackoverflow.com/questions/17751163/...
Hieu 응우 엔

그것은 훌륭한 대답이지만 django 책을
karthikr 2013-08-19

당신은 이것을 할 수 있습니다 : stackoverflow.com/questions/17751163/…
Atma

@karthikr 당신이 준 링크가 깨졌습니다 : /
fedorqui 'SO stop harming'May

답변:


139

첫째 : 경로 구조

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

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

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


파일 경로가 맞습니까? 대신 yourproject / yourapp / middleware 여야하지 않습니까?
tiagovrtr

예 @tiagovrtr 경로는 yourproject/yourapp/middleware. 나는 그것이 매우 명백했다 가정하지만 난 그것을 업데이트 할 경우 그 웁니다 당신을
AlvaroAV

11
확인 이 답변 : 당신이로 실행하면TypeError: object() takes no parameters
T. 크리스티안

3

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

-3

뷰에서 어떤 종류의 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"

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.