http요청이 들어오면 middleware를 거치고 view로 들어간 뒤 다시 middleware를 거치면서 http응답으로 들어온다
미들웨어는 하나의 계층으로 이루어져서 순서대로 작동이 된다
Custom Middleware 구현
#middleware.py
class JSONMiddleware:
def __init__(self, get_response):
self.get_response = get_response
self.my_json_object = {
"name" : "Doge",
"age" : 5
}
def __call__(self, request):
response = self.get_response(request)
return response
def process_template_response(self, _, response):
response.context_data['my_json_object'] = self.my_json_object
return response
JsonMiddelware
이름의 class를 만들었다my_json_object
이름으로 딕셔너리를 만들었다__call__
함수를 이용하여 get_response를 리턴하였다process_template_response
함수에 my_json_object를 response에 넣어서 리턴하였다process_template_response
함수는 middleware hookget_response
함수는 view나 middleware에서 호출하고 넘겨주기 위해 쓰이는 함수이다 #setting.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'demo.middleware.JSONMiddleware',
#추가된 middleware
]
setting.py안에 추가된 middleware를 넣어준다
#view.py
from django.template.response import TemplateResponse
from django.http import HttpResponse
def index(request):
context = {
"name" : "neo"
}
return TemplateResponse(request, 'demo/index.html', context=context)
👇 결과
Django가 request로 여러 단계의 middleware를 지나가면서 여러가지 기능을 사용할 수 있도록 자동적으로 만들어주었다
```python
#setting.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware',
]
Django는 request 및 response를 이용하여 시스템에 상태를 전달한다
django.http
를 이용하여서 request와 response 객체를 불러올 수 있다
#view.py
import json
from django.http import JsonResponse, HttpResponse
from django.views import View
class IndexView(View)
def get(self, requset)
data = {
'coin' : 'doge',
'price' : 600,
'value' : 'trash',
}
return JsonResponse(data)
def post(self, request)
data = json.loads(request.body)
return HttpResponse('SUCCESS')
Django에서 제공하는 HttpResponse로 많은 속성값을 사용할 수 있다
1. HttpRequest.body
바이트 문자열로 데이터를 처리할 때 사용한다 python에서 그대로 사용할 수 없으므로 json 모듈을 이용하여 파이썬이 읽을 수 있는 객체로 바꾸어서 사용이 가능하다
2. HttpRequest.path
해당 페이지의 경로를 확인이 가능하다
3. HttpRequest.method
get인지 post인지 http의 method를 문자열로 보여준다
4. HttpRequest.POST
딕셔너리 형태
5. HttpRequest.GET
딕셔너리 형태
6. HttpReques.headers
Http의 헤더를 대소문자를 구분하지 않고 딕셔너리같은 객체로 보내준다