Django 중간부품 종합 가이드
무엇이 중간부품입니까?
말 그대로 중간부품은 기본적으로 일반적인 요청-응답 주기 중간에 나타나는 메커니즘으로 특정한 중간 기능을 제공하는 데 사용된다.중간부품 구성 요소는 HTTP 요청을 받아들여 일부 작업을 수행한 다음 다음 다음 구성 요소로 전달합니다. 이 구성 요소는 다른 중간부품이나 최종 보기일 수 있습니다.
사진작가: Jody Boucher
중간부품은 요청을 체인의 하류로 전달하는 것이 아니라 응답을 직접 되돌릴 수 있다.예를 들어, Django의 CSRF Middleware은 요청이 서버와 동일한 도메인에서 유효한지 확인하고, 그렇지 않으면 즉시 403 응답 금지로 돌아갑니다.이것은 잠재적인 악의적인 요청이 시스템에 들어가는 것을 방지하는 데 도움이 된다.
중간부품은 시종 전역적이다. 즉, 시스템에 들어가는 모든 요청에 적용된다.
중간부품의 용도
1. 필터링 요청
잘못된 요청이나 잠재적인 악의적인 요청을 필터링하고 바로 되돌려보낼 수 있도록 중간부품을 작성해서 더 이상 진행하지 못하게 할 수 있습니다.하나의 인위적인 예는 위에서 언급한 CSRF 중간부품으로 서로 다른 영역에서 요청을 필터합니다.또 다른 가능한 예는 RBAC(Role-Based Access Control) 중간부품으로 사용자가 접근할 수 없는 자원을 읽거나 수정하는 것을 막는다.또는 또 다른 예는 지리적 막힘 중간부품으로 특정한 지리적 위치에서 요청을 필터하는 것이다.
2. 데이터 주입 요청
중간부품은 요청에 추가 데이터를 주입하는 데 사용할 수 있으며, 이 데이터는 응용 프로그램 내부에서 더욱 사용할 수 있다.Django의 Authentication Middleware을 예로 들면, user
대상을 모든 유효한 요청에 추가할 수 있습니다.이것은 보기와 기타 중간부품이 로그인한 사용자의 상세한 정보에 접근하는 편리한 방법으로 request.user
만 호출하면 된다.
3. 로깅, 분석 및 기타 기타 작업 수행
일부 중간부품은 실제로 요청/응답을 직접 수정하지 않고 그 안에 포함된 정보를 간단하게 이용한다.다시 말하면 이것들은 읽기 전용 중간부품이다.예를 들어 분석 중간부품이 데이터베이스에 시스템에 들어오는 모든 요청에 대한 상세한 정보를 저장한다고 가정합니다. 예를 들어 관련 사용자, URL, 타임 스탬프 등입니다. 나중에 이 데이터를 분석하여 유용한 정보나 추세를 확인할 것입니다.이러한 중간부품은 요청 내용을 읽고 데이터베이스에 관련 기록을 만들거나 업데이트한 후에 투명하게 통과할 수 있도록 합니다.또 다른 예는 사용 상황 모니터링 중간부품으로 사용자가 사용 할당량을 얼마나 소모했는지 추적하는 것이다.
Django의 중간부품
Django의 기본 중간부품의 구조는 다음과 같습니다.
class ExampleMiddleware:
def _init_(self, get_response):
self.get_response = get_response
def _call_(self, request):
# Code that is executed in each request before the view is called
response = self.get_response(request)
# Code that is executed in each request after the view is called
return response
def process_view(self, request, view_func, view_args, view_kwargs):
# This code is executed just before the view is called
def process_exception(self, request, exception):
# This code is executed if an exception is raised
def process_template_response(self, request, response):
# This code is executed if the response contains a render() method
return response
첫 번째 방법 __init__
은 Python 클래스의 구조 함수입니다.그것은 서버가 시작될 때만 한 번 호출됩니다.이곳은 우리가 초기화하거나 다른 일회성 임무를 수행하는 곳이다.
코드에서 알 수 있듯이 우리의 구조 함수는 get_response
함수이다.이 함수는 Django 프레임워크에서 다음 중간부품에 요청 대상을 전달하고 응답하는 값을 얻기 위한 것입니다.
두 번째 방법 __call__
은 함수처럼 우리 클래스의 대상을 호출할 수 있습니다!즉, 그것은 그것을 하나로 만들었다.이것이 바로 우리가 실제 중간부품의 논리를 놓는 곳이다.Django 프레임워크는 이 방법을 사용하여 중간부품을 호출합니다.
다른 세 가지는 특수한 갈고리 방법으로 특정한 조건에서 중간부품을 호출할 수 있습니다.이것들은 선택할 수 있으며, 그들이 제공하는 기능이 필요할 때만 실현할 수 있다는 것을 주의하십시오.Django 프레임워크는 앞의 두 가지 방법인 __init__
과 __call__
만 있으면 중간부품이 정상적으로 작동할 수 있습니다.
갈고리 방법을 좀 더 자세히 봅시다.
Django 중간부품 갈고리 방법
process\u 보기
이 메서드는 Django가 요청을 받고 뷰로 라우팅할 때마다 호출됩니다.그것은 __call__
의 방법과 어떤 차이가 있습니까?네, 여기 보기 함수에 접근할 수 있습니다. Django는 요청 루트를 이 함수에 전달하고 있으며, 다른 매개 변수 (args와 kwargs) 를 전달합니다.예를 들어 경로 파라미터와 그 값은 통상적으로 kwargs에서 전달되기 때문에 만약에 우리의 중간부품이 그것들에 접근해야 한다면 process_view
방법을 실현해야 한다.
이 방법은 None
을 되돌려야 합니다. 이 경우 Django는 요청을 계속 처리하거나 HttpResponse로 되돌려줍니다. 이 경우 이 응답을 즉시 되돌려줍니다.
process_이상
보기가 보기 자체에서 포착되지 않은 이상을 일으킬 때마다 이 방법을 사용합니다.따라서 요청이 도착하고 보기에서 되돌아오면 process_exception이 호출됩니다.
상술한 내용과 유사하다.process_exception
메서드는 None
또는 HttpResponse를 반환해야 합니다.
process\u template\u 응답
이 방법도 보기 실행이 끝난 후에 호출됩니다.결과 응답에 render()
방법이 포함되어 있을 때만 호출됩니다. 이 방법은 템플릿을 표시하고 있습니다.필요한 경우 이 방법을 사용하여 컨텍스트 데이터를 포함한 템플릿의 컨텐트를 변경할 수 있습니다.
중간부품 등록
사용자 정의 중간부품 클래스를 작성한 후 각 요청이 전달되는 중간부품 시퀀스에 추가할 수 있도록 Django 프로젝트에 이 클래스를 등록해야 합니다.따라서 주 MIDDLEWARE
파일의 settings.py
목록에 항목으로 추가하기만 하면 됩니다.
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
.
.
.
# Add your custom middleware to this list
]
항목은 중간부품 클래스의 전체 경로를 문자열 형식으로 포함해야 합니다.
이 목록에서 중간부품의 순서가 매우 중요합니다.일부 중간부품은 다른 중간부품에 의존하여 정상적으로 작업할 수 있고, 심지어는 다른 중간부품의 정상적인 작업을 방해할 수도 있기 때문이다.대부분의 안전과 관련된 중간부품은 목록의 시작에 있기 때문에 가능한 한 빨리 잠재적인 유해 요청을 포착하고 필터할 수 있다.경험에 따르면, 대부분의 사용자 정의 중간부품은 목록의 끝에 추가됩니다.그러나, 이것은 항상 정확하지 않다. 특히 위에서 말한 바와 같이, 사용자 정의 중간부품이 안전과 관련이 있을 때.특정 상황에 따라 중간부품 항목의 배치 위치를 결정해야 합니다.
실천을 통해 배우다
앞에서 본 세 가지 용례를 포함하는 세 가지 예시 중간부품 종류를 만듭니다.그 중 하나는 서버가 처리한 요청 수와 발생한 이상 수를 기록할 것이다.두 번째는 user agent 정보를 검출하여 요청에 주입합니다.마지막으로, 마지막으로 지원되지 않는 사용자 에이전트의 요청을 필터합니다.
💡 Note: we'll only be covering the middleware in this practical section, not the setup of the rest of the Django project. If you're unfamiliar with the basics of Django, the official tutorial is a great place to start.
CountRequestsMiddle 소프트웨어
우리의 CountRequestsMiddleware
은 보기에 이렇다.
class CountRequestsMiddleware:
def __init__(self, get_response):
self.get_response = get_response
self.count_requests = 0
self.count_exceptions = 0
def __call__(self, request, *args, **kwargs):
self.count_requests += 1
logger.info(f"Handled {self.count_requests} requests so far")
return self.get_response(request)
def process_exception(self, request, exception):
self.count_exceptions += 1
logger.error(f"Encountered {self.count_exceptions} exceptions so far")
구조 함수에서 우리는 두 변수, count_requests
과 count_exceptions
을 초기화하고 있다.요청된 모든 __call__
방법에서 count_requests
의 값을 증가하고 기록합니다.
우리는 또한 process_exception
방법을 정의했는데, 그 중에서 우리는 count_exceptions
의 값을 증가하고 기록했다.여기에서 우리는 이상적인 구체적인 유형에 관심이 없다. 비록 우리가 원한다면, 우리는 exception
파라미터의 값을 검사해서 각 유형을 단독으로 추적할 수 있다.
우리는 다른 갈고리 방법을 정의하지 않았다. 왜냐하면 우리는 실제로 그것들을 필요로 하지 않기 때문이다.
SetUserAgentMiddleware
HTTP에서 사용자 프록시 정보는 User-Agent
헤더에 존재합니다. user-agents
Python 패키지를 사용하여 이 헤더 문자열을 해석하고 의미 있는 정보를 추출합니다.
class SetUserAgentMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request, *args, **kwargs):
request.user_agent = user_agents.parse(request.META["HTTP_USER_AGENT"])
return self.get_response(request)
여기서 우리는 사용자 프록시 헤더(request.META["HTTP_USER_AGENT"]
)의 값을 얻고 라이브러리를 사용하여 분석합니다.그 다음에 결과를 같은 request
대상의 속성으로 설정하여 이후의 중간부품과 보기에 접근할 수 있도록 합니다.
💡 Note: this middleware is basically a reimplimentation of the middleware in the django-user-agents
package. While this is fine for learning purposes, in a real-world application always make use of readily available solutions. Don't reinvent the wheel!
BlockMobileMidware
예를 들어, 어떤 이유로, 우리는 데스크톱 브라우저와 호환되는 인터넷 응용 프로그램을 작성하고 있다. (마우스 지원이 필요한 온라인 게임일 수도 있다.)모바일 브라우저에서 요청을 감지하고 막는 방법이 필요합니다.SetUserAgentMiddleware
중간부품을 작성했기 때문에, request.user_agent
의 값을 검사하기 위해 다른 중간부품을 작성할 수 있습니다. 지원하지 않으면 바로 되돌아옵니다.이렇게 하면, 우리는 사용자 에이전트 검사로 보기 코드를 복잡하게 할 필요가 없다. 왜냐하면 우리는 우리의 it에 도달하는 모든 요청이 지원되는 브라우저에서 나온다는 것을 보장할 수 있기 때문이다.
class BlockMobileMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request, *args, **kwargs):
if request.user_agent.is_mobile:
return HttpResponse("Mobile devices are not supported", status=400)
return self.get_response(request)
여기에서 우리는 블로is_mobile
속성의 값을 검사하고 사실이라면 400(오류 요청) 응답을 즉시 되돌려주고 해당하는 오류 메시지를 되돌려줍니다.
이것은 request.user_agent
이 주입한 SetUserAgentMiddleware
의 속성에 달려 있습니다.따라서 설정 파일의 중간부품 목록에서 SetUserAgentMiddleware
은 항상 BlockMobileMiddleware
이전에 있어야 합니다.
결론
나는 네가 이 문장을 좋아하고 정보가 풍부하다는 것을 발견하기를 바란다.오류가 발견되거나 보충할 내용이 있으면 아래에 댓글을 남겨 주십시오.
이 예제의 전체 소스 코드는 GitHub here에서 확인할 수 있습니다.
Django 중간부품에 대한 정보를 더 알고 싶으시면 official documentation을 추천합니다!
표지 사진은 MustangJoe에서 Pixabay으로
Reference
이 문제에 관하여(Django 중간부품 종합 가이드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/bikramjeetsingh/a-comprehensive-guide-to-django-middleware-2fee
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
1. 필터링 요청
잘못된 요청이나 잠재적인 악의적인 요청을 필터링하고 바로 되돌려보낼 수 있도록 중간부품을 작성해서 더 이상 진행하지 못하게 할 수 있습니다.하나의 인위적인 예는 위에서 언급한 CSRF 중간부품으로 서로 다른 영역에서 요청을 필터합니다.또 다른 가능한 예는 RBAC(Role-Based Access Control) 중간부품으로 사용자가 접근할 수 없는 자원을 읽거나 수정하는 것을 막는다.또는 또 다른 예는 지리적 막힘 중간부품으로 특정한 지리적 위치에서 요청을 필터하는 것이다.
2. 데이터 주입 요청
중간부품은 요청에 추가 데이터를 주입하는 데 사용할 수 있으며, 이 데이터는 응용 프로그램 내부에서 더욱 사용할 수 있다.Django의 Authentication Middleware을 예로 들면,
user
대상을 모든 유효한 요청에 추가할 수 있습니다.이것은 보기와 기타 중간부품이 로그인한 사용자의 상세한 정보에 접근하는 편리한 방법으로 request.user
만 호출하면 된다.3. 로깅, 분석 및 기타 기타 작업 수행
일부 중간부품은 실제로 요청/응답을 직접 수정하지 않고 그 안에 포함된 정보를 간단하게 이용한다.다시 말하면 이것들은 읽기 전용 중간부품이다.예를 들어 분석 중간부품이 데이터베이스에 시스템에 들어오는 모든 요청에 대한 상세한 정보를 저장한다고 가정합니다. 예를 들어 관련 사용자, URL, 타임 스탬프 등입니다. 나중에 이 데이터를 분석하여 유용한 정보나 추세를 확인할 것입니다.이러한 중간부품은 요청 내용을 읽고 데이터베이스에 관련 기록을 만들거나 업데이트한 후에 투명하게 통과할 수 있도록 합니다.또 다른 예는 사용 상황 모니터링 중간부품으로 사용자가 사용 할당량을 얼마나 소모했는지 추적하는 것이다.
Django의 중간부품
Django의 기본 중간부품의 구조는 다음과 같습니다.
class ExampleMiddleware:
def _init_(self, get_response):
self.get_response = get_response
def _call_(self, request):
# Code that is executed in each request before the view is called
response = self.get_response(request)
# Code that is executed in each request after the view is called
return response
def process_view(self, request, view_func, view_args, view_kwargs):
# This code is executed just before the view is called
def process_exception(self, request, exception):
# This code is executed if an exception is raised
def process_template_response(self, request, response):
# This code is executed if the response contains a render() method
return response
첫 번째 방법 __init__
은 Python 클래스의 구조 함수입니다.그것은 서버가 시작될 때만 한 번 호출됩니다.이곳은 우리가 초기화하거나 다른 일회성 임무를 수행하는 곳이다.
코드에서 알 수 있듯이 우리의 구조 함수는 get_response
함수이다.이 함수는 Django 프레임워크에서 다음 중간부품에 요청 대상을 전달하고 응답하는 값을 얻기 위한 것입니다.
두 번째 방법 __call__
은 함수처럼 우리 클래스의 대상을 호출할 수 있습니다!즉, 그것은 그것을 하나로 만들었다.이것이 바로 우리가 실제 중간부품의 논리를 놓는 곳이다.Django 프레임워크는 이 방법을 사용하여 중간부품을 호출합니다.
다른 세 가지는 특수한 갈고리 방법으로 특정한 조건에서 중간부품을 호출할 수 있습니다.이것들은 선택할 수 있으며, 그들이 제공하는 기능이 필요할 때만 실현할 수 있다는 것을 주의하십시오.Django 프레임워크는 앞의 두 가지 방법인 __init__
과 __call__
만 있으면 중간부품이 정상적으로 작동할 수 있습니다.
갈고리 방법을 좀 더 자세히 봅시다.
Django 중간부품 갈고리 방법
process\u 보기
이 메서드는 Django가 요청을 받고 뷰로 라우팅할 때마다 호출됩니다.그것은 __call__
의 방법과 어떤 차이가 있습니까?네, 여기 보기 함수에 접근할 수 있습니다. Django는 요청 루트를 이 함수에 전달하고 있으며, 다른 매개 변수 (args와 kwargs) 를 전달합니다.예를 들어 경로 파라미터와 그 값은 통상적으로 kwargs에서 전달되기 때문에 만약에 우리의 중간부품이 그것들에 접근해야 한다면 process_view
방법을 실현해야 한다.
이 방법은 None
을 되돌려야 합니다. 이 경우 Django는 요청을 계속 처리하거나 HttpResponse로 되돌려줍니다. 이 경우 이 응답을 즉시 되돌려줍니다.
process_이상
보기가 보기 자체에서 포착되지 않은 이상을 일으킬 때마다 이 방법을 사용합니다.따라서 요청이 도착하고 보기에서 되돌아오면 process_exception이 호출됩니다.
상술한 내용과 유사하다.process_exception
메서드는 None
또는 HttpResponse를 반환해야 합니다.
process\u template\u 응답
이 방법도 보기 실행이 끝난 후에 호출됩니다.결과 응답에 render()
방법이 포함되어 있을 때만 호출됩니다. 이 방법은 템플릿을 표시하고 있습니다.필요한 경우 이 방법을 사용하여 컨텍스트 데이터를 포함한 템플릿의 컨텐트를 변경할 수 있습니다.
중간부품 등록
사용자 정의 중간부품 클래스를 작성한 후 각 요청이 전달되는 중간부품 시퀀스에 추가할 수 있도록 Django 프로젝트에 이 클래스를 등록해야 합니다.따라서 주 MIDDLEWARE
파일의 settings.py
목록에 항목으로 추가하기만 하면 됩니다.
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
.
.
.
# Add your custom middleware to this list
]
항목은 중간부품 클래스의 전체 경로를 문자열 형식으로 포함해야 합니다.
이 목록에서 중간부품의 순서가 매우 중요합니다.일부 중간부품은 다른 중간부품에 의존하여 정상적으로 작업할 수 있고, 심지어는 다른 중간부품의 정상적인 작업을 방해할 수도 있기 때문이다.대부분의 안전과 관련된 중간부품은 목록의 시작에 있기 때문에 가능한 한 빨리 잠재적인 유해 요청을 포착하고 필터할 수 있다.경험에 따르면, 대부분의 사용자 정의 중간부품은 목록의 끝에 추가됩니다.그러나, 이것은 항상 정확하지 않다. 특히 위에서 말한 바와 같이, 사용자 정의 중간부품이 안전과 관련이 있을 때.특정 상황에 따라 중간부품 항목의 배치 위치를 결정해야 합니다.
실천을 통해 배우다
앞에서 본 세 가지 용례를 포함하는 세 가지 예시 중간부품 종류를 만듭니다.그 중 하나는 서버가 처리한 요청 수와 발생한 이상 수를 기록할 것이다.두 번째는 user agent 정보를 검출하여 요청에 주입합니다.마지막으로, 마지막으로 지원되지 않는 사용자 에이전트의 요청을 필터합니다.
💡 Note: we'll only be covering the middleware in this practical section, not the setup of the rest of the Django project. If you're unfamiliar with the basics of Django, the official tutorial is a great place to start.
CountRequestsMiddle 소프트웨어
우리의 CountRequestsMiddleware
은 보기에 이렇다.
class CountRequestsMiddleware:
def __init__(self, get_response):
self.get_response = get_response
self.count_requests = 0
self.count_exceptions = 0
def __call__(self, request, *args, **kwargs):
self.count_requests += 1
logger.info(f"Handled {self.count_requests} requests so far")
return self.get_response(request)
def process_exception(self, request, exception):
self.count_exceptions += 1
logger.error(f"Encountered {self.count_exceptions} exceptions so far")
구조 함수에서 우리는 두 변수, count_requests
과 count_exceptions
을 초기화하고 있다.요청된 모든 __call__
방법에서 count_requests
의 값을 증가하고 기록합니다.
우리는 또한 process_exception
방법을 정의했는데, 그 중에서 우리는 count_exceptions
의 값을 증가하고 기록했다.여기에서 우리는 이상적인 구체적인 유형에 관심이 없다. 비록 우리가 원한다면, 우리는 exception
파라미터의 값을 검사해서 각 유형을 단독으로 추적할 수 있다.
우리는 다른 갈고리 방법을 정의하지 않았다. 왜냐하면 우리는 실제로 그것들을 필요로 하지 않기 때문이다.
SetUserAgentMiddleware
HTTP에서 사용자 프록시 정보는 User-Agent
헤더에 존재합니다. user-agents
Python 패키지를 사용하여 이 헤더 문자열을 해석하고 의미 있는 정보를 추출합니다.
class SetUserAgentMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request, *args, **kwargs):
request.user_agent = user_agents.parse(request.META["HTTP_USER_AGENT"])
return self.get_response(request)
여기서 우리는 사용자 프록시 헤더(request.META["HTTP_USER_AGENT"]
)의 값을 얻고 라이브러리를 사용하여 분석합니다.그 다음에 결과를 같은 request
대상의 속성으로 설정하여 이후의 중간부품과 보기에 접근할 수 있도록 합니다.
💡 Note: this middleware is basically a reimplimentation of the middleware in the django-user-agents
package. While this is fine for learning purposes, in a real-world application always make use of readily available solutions. Don't reinvent the wheel!
BlockMobileMidware
예를 들어, 어떤 이유로, 우리는 데스크톱 브라우저와 호환되는 인터넷 응용 프로그램을 작성하고 있다. (마우스 지원이 필요한 온라인 게임일 수도 있다.)모바일 브라우저에서 요청을 감지하고 막는 방법이 필요합니다.SetUserAgentMiddleware
중간부품을 작성했기 때문에, request.user_agent
의 값을 검사하기 위해 다른 중간부품을 작성할 수 있습니다. 지원하지 않으면 바로 되돌아옵니다.이렇게 하면, 우리는 사용자 에이전트 검사로 보기 코드를 복잡하게 할 필요가 없다. 왜냐하면 우리는 우리의 it에 도달하는 모든 요청이 지원되는 브라우저에서 나온다는 것을 보장할 수 있기 때문이다.
class BlockMobileMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request, *args, **kwargs):
if request.user_agent.is_mobile:
return HttpResponse("Mobile devices are not supported", status=400)
return self.get_response(request)
여기에서 우리는 블로is_mobile
속성의 값을 검사하고 사실이라면 400(오류 요청) 응답을 즉시 되돌려주고 해당하는 오류 메시지를 되돌려줍니다.
이것은 request.user_agent
이 주입한 SetUserAgentMiddleware
의 속성에 달려 있습니다.따라서 설정 파일의 중간부품 목록에서 SetUserAgentMiddleware
은 항상 BlockMobileMiddleware
이전에 있어야 합니다.
결론
나는 네가 이 문장을 좋아하고 정보가 풍부하다는 것을 발견하기를 바란다.오류가 발견되거나 보충할 내용이 있으면 아래에 댓글을 남겨 주십시오.
이 예제의 전체 소스 코드는 GitHub here에서 확인할 수 있습니다.
Django 중간부품에 대한 정보를 더 알고 싶으시면 official documentation을 추천합니다!
표지 사진은 MustangJoe에서 Pixabay으로
Reference
이 문제에 관하여(Django 중간부품 종합 가이드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/bikramjeetsingh/a-comprehensive-guide-to-django-middleware-2fee
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class ExampleMiddleware:
def _init_(self, get_response):
self.get_response = get_response
def _call_(self, request):
# Code that is executed in each request before the view is called
response = self.get_response(request)
# Code that is executed in each request after the view is called
return response
def process_view(self, request, view_func, view_args, view_kwargs):
# This code is executed just before the view is called
def process_exception(self, request, exception):
# This code is executed if an exception is raised
def process_template_response(self, request, response):
# This code is executed if the response contains a render() method
return response
process\u 보기
이 메서드는 Django가 요청을 받고 뷰로 라우팅할 때마다 호출됩니다.그것은
__call__
의 방법과 어떤 차이가 있습니까?네, 여기 보기 함수에 접근할 수 있습니다. Django는 요청 루트를 이 함수에 전달하고 있으며, 다른 매개 변수 (args와 kwargs) 를 전달합니다.예를 들어 경로 파라미터와 그 값은 통상적으로 kwargs에서 전달되기 때문에 만약에 우리의 중간부품이 그것들에 접근해야 한다면 process_view
방법을 실현해야 한다.이 방법은
None
을 되돌려야 합니다. 이 경우 Django는 요청을 계속 처리하거나 HttpResponse로 되돌려줍니다. 이 경우 이 응답을 즉시 되돌려줍니다.process_이상
보기가 보기 자체에서 포착되지 않은 이상을 일으킬 때마다 이 방법을 사용합니다.따라서 요청이 도착하고 보기에서 되돌아오면 process_exception이 호출됩니다.
상술한 내용과 유사하다.
process_exception
메서드는 None
또는 HttpResponse를 반환해야 합니다.process\u template\u 응답
이 방법도 보기 실행이 끝난 후에 호출됩니다.결과 응답에
render()
방법이 포함되어 있을 때만 호출됩니다. 이 방법은 템플릿을 표시하고 있습니다.필요한 경우 이 방법을 사용하여 컨텍스트 데이터를 포함한 템플릿의 컨텐트를 변경할 수 있습니다.중간부품 등록
사용자 정의 중간부품 클래스를 작성한 후 각 요청이 전달되는 중간부품 시퀀스에 추가할 수 있도록 Django 프로젝트에 이 클래스를 등록해야 합니다.따라서 주 MIDDLEWARE
파일의 settings.py
목록에 항목으로 추가하기만 하면 됩니다.
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
.
.
.
# Add your custom middleware to this list
]
항목은 중간부품 클래스의 전체 경로를 문자열 형식으로 포함해야 합니다.
이 목록에서 중간부품의 순서가 매우 중요합니다.일부 중간부품은 다른 중간부품에 의존하여 정상적으로 작업할 수 있고, 심지어는 다른 중간부품의 정상적인 작업을 방해할 수도 있기 때문이다.대부분의 안전과 관련된 중간부품은 목록의 시작에 있기 때문에 가능한 한 빨리 잠재적인 유해 요청을 포착하고 필터할 수 있다.경험에 따르면, 대부분의 사용자 정의 중간부품은 목록의 끝에 추가됩니다.그러나, 이것은 항상 정확하지 않다. 특히 위에서 말한 바와 같이, 사용자 정의 중간부품이 안전과 관련이 있을 때.특정 상황에 따라 중간부품 항목의 배치 위치를 결정해야 합니다.
실천을 통해 배우다
앞에서 본 세 가지 용례를 포함하는 세 가지 예시 중간부품 종류를 만듭니다.그 중 하나는 서버가 처리한 요청 수와 발생한 이상 수를 기록할 것이다.두 번째는 user agent 정보를 검출하여 요청에 주입합니다.마지막으로, 마지막으로 지원되지 않는 사용자 에이전트의 요청을 필터합니다.
💡 Note: we'll only be covering the middleware in this practical section, not the setup of the rest of the Django project. If you're unfamiliar with the basics of Django, the official tutorial is a great place to start.
CountRequestsMiddle 소프트웨어
우리의 CountRequestsMiddleware
은 보기에 이렇다.
class CountRequestsMiddleware:
def __init__(self, get_response):
self.get_response = get_response
self.count_requests = 0
self.count_exceptions = 0
def __call__(self, request, *args, **kwargs):
self.count_requests += 1
logger.info(f"Handled {self.count_requests} requests so far")
return self.get_response(request)
def process_exception(self, request, exception):
self.count_exceptions += 1
logger.error(f"Encountered {self.count_exceptions} exceptions so far")
구조 함수에서 우리는 두 변수, count_requests
과 count_exceptions
을 초기화하고 있다.요청된 모든 __call__
방법에서 count_requests
의 값을 증가하고 기록합니다.
우리는 또한 process_exception
방법을 정의했는데, 그 중에서 우리는 count_exceptions
의 값을 증가하고 기록했다.여기에서 우리는 이상적인 구체적인 유형에 관심이 없다. 비록 우리가 원한다면, 우리는 exception
파라미터의 값을 검사해서 각 유형을 단독으로 추적할 수 있다.
우리는 다른 갈고리 방법을 정의하지 않았다. 왜냐하면 우리는 실제로 그것들을 필요로 하지 않기 때문이다.
SetUserAgentMiddleware
HTTP에서 사용자 프록시 정보는 User-Agent
헤더에 존재합니다. user-agents
Python 패키지를 사용하여 이 헤더 문자열을 해석하고 의미 있는 정보를 추출합니다.
class SetUserAgentMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request, *args, **kwargs):
request.user_agent = user_agents.parse(request.META["HTTP_USER_AGENT"])
return self.get_response(request)
여기서 우리는 사용자 프록시 헤더(request.META["HTTP_USER_AGENT"]
)의 값을 얻고 라이브러리를 사용하여 분석합니다.그 다음에 결과를 같은 request
대상의 속성으로 설정하여 이후의 중간부품과 보기에 접근할 수 있도록 합니다.
💡 Note: this middleware is basically a reimplimentation of the middleware in the django-user-agents
package. While this is fine for learning purposes, in a real-world application always make use of readily available solutions. Don't reinvent the wheel!
BlockMobileMidware
예를 들어, 어떤 이유로, 우리는 데스크톱 브라우저와 호환되는 인터넷 응용 프로그램을 작성하고 있다. (마우스 지원이 필요한 온라인 게임일 수도 있다.)모바일 브라우저에서 요청을 감지하고 막는 방법이 필요합니다.SetUserAgentMiddleware
중간부품을 작성했기 때문에, request.user_agent
의 값을 검사하기 위해 다른 중간부품을 작성할 수 있습니다. 지원하지 않으면 바로 되돌아옵니다.이렇게 하면, 우리는 사용자 에이전트 검사로 보기 코드를 복잡하게 할 필요가 없다. 왜냐하면 우리는 우리의 it에 도달하는 모든 요청이 지원되는 브라우저에서 나온다는 것을 보장할 수 있기 때문이다.
class BlockMobileMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request, *args, **kwargs):
if request.user_agent.is_mobile:
return HttpResponse("Mobile devices are not supported", status=400)
return self.get_response(request)
여기에서 우리는 블로is_mobile
속성의 값을 검사하고 사실이라면 400(오류 요청) 응답을 즉시 되돌려주고 해당하는 오류 메시지를 되돌려줍니다.
이것은 request.user_agent
이 주입한 SetUserAgentMiddleware
의 속성에 달려 있습니다.따라서 설정 파일의 중간부품 목록에서 SetUserAgentMiddleware
은 항상 BlockMobileMiddleware
이전에 있어야 합니다.
결론
나는 네가 이 문장을 좋아하고 정보가 풍부하다는 것을 발견하기를 바란다.오류가 발견되거나 보충할 내용이 있으면 아래에 댓글을 남겨 주십시오.
이 예제의 전체 소스 코드는 GitHub here에서 확인할 수 있습니다.
Django 중간부품에 대한 정보를 더 알고 싶으시면 official documentation을 추천합니다!
표지 사진은 MustangJoe에서 Pixabay으로
Reference
이 문제에 관하여(Django 중간부품 종합 가이드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/bikramjeetsingh/a-comprehensive-guide-to-django-middleware-2fee
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
.
.
.
# Add your custom middleware to this list
]
앞에서 본 세 가지 용례를 포함하는 세 가지 예시 중간부품 종류를 만듭니다.그 중 하나는 서버가 처리한 요청 수와 발생한 이상 수를 기록할 것이다.두 번째는 user agent 정보를 검출하여 요청에 주입합니다.마지막으로, 마지막으로 지원되지 않는 사용자 에이전트의 요청을 필터합니다.
💡 Note: we'll only be covering the middleware in this practical section, not the setup of the rest of the Django project. If you're unfamiliar with the basics of Django, the official tutorial is a great place to start.
CountRequestsMiddle 소프트웨어
우리의
CountRequestsMiddleware
은 보기에 이렇다.class CountRequestsMiddleware:
def __init__(self, get_response):
self.get_response = get_response
self.count_requests = 0
self.count_exceptions = 0
def __call__(self, request, *args, **kwargs):
self.count_requests += 1
logger.info(f"Handled {self.count_requests} requests so far")
return self.get_response(request)
def process_exception(self, request, exception):
self.count_exceptions += 1
logger.error(f"Encountered {self.count_exceptions} exceptions so far")
구조 함수에서 우리는 두 변수, count_requests
과 count_exceptions
을 초기화하고 있다.요청된 모든 __call__
방법에서 count_requests
의 값을 증가하고 기록합니다.우리는 또한
process_exception
방법을 정의했는데, 그 중에서 우리는 count_exceptions
의 값을 증가하고 기록했다.여기에서 우리는 이상적인 구체적인 유형에 관심이 없다. 비록 우리가 원한다면, 우리는 exception
파라미터의 값을 검사해서 각 유형을 단독으로 추적할 수 있다.우리는 다른 갈고리 방법을 정의하지 않았다. 왜냐하면 우리는 실제로 그것들을 필요로 하지 않기 때문이다.
SetUserAgentMiddleware
HTTP에서 사용자 프록시 정보는
User-Agent
헤더에 존재합니다. user-agents
Python 패키지를 사용하여 이 헤더 문자열을 해석하고 의미 있는 정보를 추출합니다.class SetUserAgentMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request, *args, **kwargs):
request.user_agent = user_agents.parse(request.META["HTTP_USER_AGENT"])
return self.get_response(request)
여기서 우리는 사용자 프록시 헤더(request.META["HTTP_USER_AGENT"]
)의 값을 얻고 라이브러리를 사용하여 분석합니다.그 다음에 결과를 같은 request
대상의 속성으로 설정하여 이후의 중간부품과 보기에 접근할 수 있도록 합니다.💡 Note: this middleware is basically a reimplimentation of the middleware in the
django-user-agents
package. While this is fine for learning purposes, in a real-world application always make use of readily available solutions. Don't reinvent the wheel!
BlockMobileMidware
예를 들어, 어떤 이유로, 우리는 데스크톱 브라우저와 호환되는 인터넷 응용 프로그램을 작성하고 있다. (마우스 지원이 필요한 온라인 게임일 수도 있다.)모바일 브라우저에서 요청을 감지하고 막는 방법이 필요합니다.
SetUserAgentMiddleware
중간부품을 작성했기 때문에, request.user_agent
의 값을 검사하기 위해 다른 중간부품을 작성할 수 있습니다. 지원하지 않으면 바로 되돌아옵니다.이렇게 하면, 우리는 사용자 에이전트 검사로 보기 코드를 복잡하게 할 필요가 없다. 왜냐하면 우리는 우리의 it에 도달하는 모든 요청이 지원되는 브라우저에서 나온다는 것을 보장할 수 있기 때문이다.class BlockMobileMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request, *args, **kwargs):
if request.user_agent.is_mobile:
return HttpResponse("Mobile devices are not supported", status=400)
return self.get_response(request)
여기에서 우리는 블로is_mobile
속성의 값을 검사하고 사실이라면 400(오류 요청) 응답을 즉시 되돌려주고 해당하는 오류 메시지를 되돌려줍니다.이것은
request.user_agent
이 주입한 SetUserAgentMiddleware
의 속성에 달려 있습니다.따라서 설정 파일의 중간부품 목록에서 SetUserAgentMiddleware
은 항상 BlockMobileMiddleware
이전에 있어야 합니다.결론
나는 네가 이 문장을 좋아하고 정보가 풍부하다는 것을 발견하기를 바란다.오류가 발견되거나 보충할 내용이 있으면 아래에 댓글을 남겨 주십시오.
이 예제의 전체 소스 코드는 GitHub here에서 확인할 수 있습니다.
Django 중간부품에 대한 정보를 더 알고 싶으시면 official documentation을 추천합니다!
표지 사진은 MustangJoe에서 Pixabay으로
Reference
이 문제에 관하여(Django 중간부품 종합 가이드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/bikramjeetsingh/a-comprehensive-guide-to-django-middleware-2fee
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Django 중간부품 종합 가이드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bikramjeetsingh/a-comprehensive-guide-to-django-middleware-2fee텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)