조건을 충족하는 모든 뷰에 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"
문자열과 정수 더하기의 경우 예외가 발생하면 실행됩니다.
위 미들웨어 클래스에 대한 해당 뷰를 작성할 수 있습니다.