Backend/Django
[Django] HttpRequest와 HttpResponse
keyhong-DE
2023. 12. 29. 01:20
HttpRequest 객체
클라이언트로부터의 모든 요청 내용을 담고 있으며
함수 기반 뷰(FBV) : 매 요청 시마다 뷰 함수의 첫번째 인자 request 전달
클래스 기반 뷰(CBV) : 매 요청 시마다 self.request를 통해 접근
Form 처리 관련 속성들
.method : 요청의 종류 "GET" 또는 "POST" 로서 모두 대문자
.GET : GET 인자 목록 (QueryDict 타입)
.POST : POST 인자 목록 (QueryDict 타입)
.FILES : POST 인자 중에서 파일 목록 (MultiValueDict 타입)
MultiValueDict (1)
dict을 상속받은 클래스
동일 key의 다수 value를 지원하는 사전
http 요청에서의 하나의 key에 대해서 여러 값을 전달 받을 수 있어야만 합니다.
URL의 QueryString은 같은 Key로 다수 Value 지정을 지원 ex) name=Tom&name=Steve&name=Tomi
MultiValueDict (2)
동일 key의 다수 Value를 지원하는 사전
>>> from django.utils.datastructures import MultiValueDict
>>> d = MultiValueDict({"name": ["Adrian", "Simon"], "position": ["Developer"]})
>>> d["name"] # dict와 동일하게 동작. 단일값을 획득
'Simon'
>>> d.getlist("name")
['Adrian', 'Simon']
>>> d.getlist("doesnotexist")
[]
>>> d["name"] = "changed"
>>> d
<MultiValueDict: {'name': ['changed'], 'position': ['Developer']}
QueryDict (1)
수정 불가능한 (Immutable) 특성
# 아래 코드 Django Shell을 통해서 실행이 가능
>>> from django.http import QueryDict
>>> qd = QueryDict('name=Adrian&name=Simon&position=Developer', encoding='utf8')
>>> qd["name"]
'Simon'
>>> qd.getlist("name")
['Adrian', 'Simon']
>>> qd["name"] = "changed"
AttributeError: This QueryDict instance is immutable
class QueryDict(MultiValueDict):
_mutable = True
_encoding = None
def __init__(self, query_string=None, mutable=False, encoding=None):
# ...
self.mutable = mutable
def _assert_mutable(self):
if not self._mutable:
raise AttributeErrorr("This QueryDict instance is immutable")
def __setitem__(self, key, value):
self._assert_mutable()
# ...
def __delitem__(self, key):
self._assert_mutable()
# ...