Django 튜 토리 얼 노트 의 미들웨어 상세 설명
6650 단어 django중간 부품middleware
미들웨어 는 말 그대로 request 와 response 처리 사이 에 있 는 처리 과정 으로 상대 적 으로 경량급 이 며 전체적으로 django 의 입 출력 을 바 꿉 니 다.전 체 를 바 꾸 기 때문에 신중 하고 실 용적 이 어야 하 며 잘 사용 하지 못 하면 성능 에 영향 을 줄 수 있다.
모든 미들웨어 는 하나의 기능 을 책임 집 니 다.예 를 들 어 AuthenticationMiddleware 는 sessions 처리 와 관련 이 있 습 니 다.
미들웨어 활성화
settings.py 프로필 에 MIDDLEWARE 를 설정 해 야 합 니 다.CLASSES:
MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
물론 중간 부품 을 사용 하지 않 아 도 됩 니 다.이것 은 빈 것 으로 설정 할 수 있 습 니 다.미들웨어 순서
일반적으로 저 희 는 브 라 우 저 에서 Request 를 요청 합 니 다.응답 을 받 은 내용 은 Http Response 입 니 다.이 요청 이 Django 에 전달 되 는 과정 은 다음 과 같 습 니 다.processrequest 와 process response 의 실행 순 서 는 정반 대 입 니 다.다음 그림 과 같 습 니 다.
즉,모든 요청 은 중간 부품 중의 프로 세 스 를 먼저 통과 하 는 것 이다request 함수,이 함 수 는 None 또는 HttpResponse 대상 을 되 돌려 줍 니 다.전 자 를 되 돌려 주면 다른 미들웨어 를 계속 처리 하고 HttpResponse 를 되 돌려 주면 중 지 를 처리 하고 웹 페이지 로 돌아 갑 니 다.
중간 부품 은 어떤 종류(object 를 계승 할 수 있 음)에서 도 계승 하지 않 습 니 다.다음 중간 부품 의 대략적인 모습:
class CommonMiddleware(object):
def process_request(self, request):
return None
def process_response(self, request, response):
return response
필요 한 훅 몇 개:1. Sessions
2. Authentication
3. CSRF Protection
4. GZipping Content
예 를 들 어,예 를 들 어 우 리 는 데이터 통 계 를 해 야 한다.
class BlockedIpMiddleware(object):
def process_request(self, request):
... access
access = access+1
... ,
이 코드 의 기능 은 간단 한 접근 에 한 번 더 추가 하 는 것 입 니 다.이 미들웨어 의 Python 경 로 를 settings.py 에 기록 하 는 것 입 니 다.
MIDDLEWARE_CLASSES = (
'zjj.middleware.BlockedIpMiddleware',
...
)
Django 는 MIDDLEWARECLASSES 에서 위 에서 아래로 미들웨어 의 process 를 하나씩 수행 합 니 다.request 함수,그 중 processresponse 함 수 는 맨 앞의 마지막 실행 입 니 다.둘째,예 를 들 어 우리 가 사이트 에서 서버 에 올 려 본 격 적 으로 실 행 된 후에 DEBUG 는 False 로 바 뀌 었 습 니 다.그러면 더욱 안전 합 니 다.그러나 가끔 오류 가 발생 하면 오류 상세 페이지 를 표시 하지 못 하고 이 두 가지 일 을 잘 처리 할 방법 이 있 습 니까?
일반 방문 자 들 이 본 것 은 우호 적 인 오류 신고 정보 이다.
관리자 가 본 것 은 버그 를 복구 하기 위해 오류 상세 한 상황 입 니 다.
물론 있 습 니 다.중간 부품 을 이용 하면 할 수 있 습 니 다!코드 는 다음 과 같 습 니 다:
import sys
from django.views.debug import technical_500_response
from django.conf import settings
class UserBasedExceptionMiddleware(object):
def process_exception(self, request, exception):
if request.user.is_superuser or request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
return technical_500_response(request, *sys.exc_info())
이 중간 부품 을 위 와 같이 settings.py 에 추가 하 는 MIDDLEWARECLASSES 에서 마지막 에 놓 으 면 다른 미들웨어 의 process 를 볼 수 있 습 니 다.request 의 오류.방문 자가 관리자 일 때 이 사이트 에 존재 하지 않 는 페이지 를 방문 하 는 등 오류 에 대한 자세 한 정 보 를 제공 합 니 다.
보통 사람들 이 보 는 것 은 보통 404(스스로 눌 러 보 세 요)인 데 우 리 는 볼 수 있 습 니 다.
3.핸드폰 을 간단하게 식별 하 는 미들웨어 를 공유 하고 더 자세 한 것 은 이것 을 참고 할 수 있 습 니 다:django-mobi
MOBILE_USERAGENTS = ("2.0 MMP","240x320","400X240","AvantGo","BlackBerry",
"Blazer","Cellphone","Danger","DoCoMo","Elaine/3.0","EudoraWeb",
"Googlebot-Mobile","hiptop","IEMobile","KYOCERA/WX310K","LG/U990",
"MIDP-2.","MMEF20","MOT-V","NetFront","Newt","Nintendo Wii","Nitro",
"Nokia","Opera Mini","Palm","PlayStation Portable","portalmmm","Proxinet",
"ProxiNet","SHARP-TQ-GX10","SHG-i900","Small","SonyEricsson","Symbian OS",
"SymbianOS","TS21i-10","UP.Browser","UP.Link","webOS","Windows CE",
"WinWAP","YahooSeeker/M1A1-R2D2","iPhone","iPod","Android",
"BlackBerry9530","LG-TU915 Obigo","LGE VX","webOS","Nokia5800")
class MobileTemplate(object):
"""
If a mobile user agent is detected, inspect the default args for the view
func, and if a template name is found assume it is the template arg and
attempt to load a mobile template based on the original template name.
"""
def process_view(self, request, view_func, view_args, view_kwargs):
if any(ua for ua in MOBILE_USERAGENTS if ua in
request.META["HTTP_USER_AGENT"]):
template = view_kwargs.get("template")
if template is None:
for default in view_func.func_defaults:
if str(default).endswith(".html"):
template = default
if template is not None:
template = template.rsplit(".html", 1)[0] + ".mobile.html"
try:
get_template(template)
except TemplateDoesNotExist:
pass
else:
view_kwargs["template"] = template
return view_func(request, *view_args, **view_kwargs)
return None
현지 화 된 미들웨어 의 예 를 다시 들 어 보 자.
class LocaleMiddleware(object):
def process_request(self, request):
if 'locale' in request.cookies:
request.locale = request.cookies.locale
else:
request.locale = None
def process_response(self, request, response):
if getattr(request, 'locale', False):
response.cookies['locale'] = request.locale
cookies 의 locale 을 request 의 locale 에 설정 하여 나중에 사용 하 는 것 입 니 다.이 부분 은 django 공식 문서 와 인터넷 상의 튜 토리 얼 을 참고 하 였 으 며,여기 서도 선배 들 의 공유 에 감 사 드 립 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.