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()
        # ...