TIL 19 | Django Request
Query Parameter
QueryDict
- HttpRequest에서 오는 request.GET, request.POST는 Django에서 request가 왔을 때 만들어주는 불변의 객체(Dictionay)형태이다
- 클라이언트부터의 모든 요청 내용을 담고 있으며, 매 요청 시마다 뷰 함 수의 첫번째 인자로 request를 받는다
- 이것을 수정할 수 없으므로 우리는 해당 객체의 method를 이용하여 원하는 형태로 읽을 수 밖에 없다
QueryDict.__init__
(query_string=None, mutable=False, encoding=None)
Query Parameter
- request 객체는
query_string
에 기반으로 만들어진다
- Query parameter는 ?으로 시작이 되고 key와 value는
=
으로 구분이 된다
- key와 key는 &으로 구분이 된다
- key 값이 같은 경우 한 리스트에 묶이게 된다
QueryDict.__init__
(query_string=None, mutable=False, encoding=None)
query_string
에 기반으로 만들어진다- Query parameter는 ?으로 시작이 되고 key와 value는
=
으로 구분이 된다 - key와 key는 &으로 구분이 된다
- key 값이 같은 경우 한 리스트에 묶이게 된다
👇 예시
URL
127.0.0.1:8000/?sort=123&filters=23&sort=53
request.GET
<QueryDict: {'sort': ['123', '53']}, {'filters':['23']>
만약에 Query parameter에 string이 없으면 빈 객체로 전달이 된다
dir(QueryDict)
__class__
,__class_getitem__
,__contains__
,__copy__
,__deepcopy__
,__delattr__
,__delitem__
,__dict__
,__dir__
,__doc__
,__eq__
,__format__
,__ge__
,__getattribute__
,__getitem__
,__getstate__
,__gt__
,__hash__
,__init__
,__init_subclass__
,__ior__
,__iter__
,__le__
,__len__
,__lt__
,__module__
,__ne__
,__new__
,__or__
,__reduce__
,__reduce_ex__
,__repr__
,__reversed__
,__ror__
,__setattr__
,__setitem__
,__setstate__
,__sizeof__
,__str__
,__subclasshook__
,__weakref__
,_assert_mutable
,_encoding
,_getlist
,_mutable
,appendlist
,clear
,copy
,dict
,encoding
,fromkeys
,get
,getlist
,items
,keys
,lists
,pop
,popitem
,setdefault
,setlist
,setlistdefault
,update
,urlencode
,values
URL
127.0.0.1:8000/?sort=123&filters=23&sort=53
QueryDict.fromkeys(iterable, vlaue=", mutable=False, encoding=None)
request.GET.fromkeys(['sort', 'filters'], value='hello')
>>><QueryDict: {'sort': ['hello'], 'filters': ['hello']}>
QueryDict.__getitem__(key)
지정된 키에 대해 값을 돌려준다.
하나의 키에 복수의 값이 존재하는 경우,__getitem__()
은 리스트의 끝에 값을 돌려준다.
키에 대응하는 값이 없으면django.utils.datastructure.MutivalueDictKeyError
에러가 보여진다. (이러한 예외는 KeyError의 서브클래스이므로, 유심히 보면 KeyError를 포착할 수 있을 것이다.)
request.GET.__getitem__('sort')
>>53
QueryDict.__setitem__(key, value)
iterable의 키와 각 값이 value와 같은 새로운 QueryDict를 생성한다.
request.GET.__setitem__('sort',53)
>> AttributeError: This QueryDict instance is immutable
QueryDict.get(key, default = None)
__getitem__()
와 같은 로직이지만 키에 대응하는 값이 없을 때 기본값을 돌려주는 후크가 있다.
request.GET.get('sort')
>> 53
QueryDict.items()
dict.items()
메소드와 같지만,__getitem()__
와 같이 마지막 값을 돌려주는 로직을 사용한다.QueryDict.update(other_dict)
QueryDict 혹은 표준 사전형을 인수로 취한다. 표준 사전형의 update()메소드와 동일하지만, 현재의 값을 대체하지 않고 현재 값을 리스트에 추가한다.
q = q = QueryDict('a=1', mutable=True)
q.update({'a': '2'}) >>> q.getlist('a') ['1', '2']
q['a']
>> '2'
QueryDict.copy()
Python 표준 라이브러리의copy.deepcopy()
를 사용하여 객체의 복제를 생성하여 리턴한다. 복제는 변경가능하므로 값을 변경할 수 있다.QueryDitct.getlist(key, defalut=None)
요청된 키에 대해 Python의 리스트형으로 리턴해준다. 키에 대응하는 값을 없으면 공백의 리스트가 반환된다. 이 메소드는 확실히 어떠한 리스트든 리턴해준다고 할 수 있다.QueryDict.setlist(key, list_)
키에 대해list_
를 대응 시켜준다 (__setitem__()
과 다르다).QueryDict.appendlist(key, item)
키와 연관되어 있는 내부 리스트를 요소에 추가해준다.QueryDict.setlistdefault(key, default_list=None)
setdefault와 닮았지만, 단일 값이 아닌 값의 리스트를 인수로 취한다.QueryDict.lists()
items()와 비슷하지만, 모든 값을 리스트로 돌려준다
q = QueryDict('a=1&a=2&a=3')
q.lists()
>>[('a', ['1', '2', '3'])]
QueryDict.pop(key)
주어진 키에 대한 값의 리스트를 리턴하고 사전에서 삭제한다. 만약 키가 존재하지 않으면 KeyError가 발생한다.
q = QueryDict('a=1&a=2&a=3', mutable=True)
q.pop('a')
>> ['1', '2', '3']
QueryDict.popitem()
사전에서 임의의 구성원을 삭제한다. 그리고 키와 키의 모든 값의 리스트를 포함하는 두 개의 값을 튜플형식으로 반환한다. 빈 사전형을 호출하면 KeyError가 발생한다.
q = QueryDict('a=1&a=2&a=3', mutable=True)
q.popitem()
>>('a', ['1', '2', '3'])
QueryDict.dict()
QueryDict의 사전형 표현을 리턴한다. QueryDict의 모든 (key,list)쌍에 대해 dict은 (key, item)을 가지고 있다. 여기서 리스트의 요소 중 하나인 item은 QueryDict.getitem()과 동일한 로직을 가지고 있다.QueryDict.urlencode(safe=None)
데이터를 쿼리문자열 형식으로 바꾼 문자열을 리턴한다. 예를 들어 "a=2&b=3&b=5"와 같이 리턴한다.
q = QueryDict('a=2&b=3&b=5')
q.urlencode()
>> 'a=2&b=3&b=5'
safe에 encoding에 포함시키지 않을 문자를 지정할 수 있다.
q = QueryDict(mutable=True)
q['next'] = '/a&b/'
q.urlencode(safe='/') '
>> next=/a%26b/'
QueryDict Custom
from django.http.request import QueryDict
class MyQueryDict(QueryDict):
def __init__(self, query_string=None, mutable=True, encoding=None):
super(MyQueryDict, self).__init__(query_string=query_string,
mutable=mutable,
encoding=encoding)
super()
를 이용해 자식 클래스가 부모의 클래스의 __init__
를 사용
👇 URL Encoded Characters
backspace %08
tab %09
linefeed %0A
creturn %0D
space %20
! %21
" %22
# %23
$ %24
% %25
& %26
' %27
( %28
) %29
* %2A
+ %2B
, %2C
- %2D
. %2E
/ %2F
: %3A
; %3B
< %3C
= %3D
> %3E
? %3F
@ %40
[ %5B
\ %5C
] %5D
^ %5E
_ %5F
` %60
{ %7B
| %7C
} %7D
RESTful API
REST(Representational state transfer)
REST 아키텍쳐(규칙, 셜계도)를 기반으로 이루어진 어플리케이션 인터페이스이다
URI(Uniform Resource Identifier)
👇 URI 구조
https://127.0.0.1:5000/product/table-lamps/?sort=123&filters=1234
- protocol : https
- host(domain) : 127.0.0.1
- port : 5000
- path : product/table-lamps
- query string : sort=123&filters=1234
Http Massage
request
- start line : http method와 protocol, version
- body : data가 들어가는 자리(payload)
Architecture
- resource는 명사형태
- URI에 Http method, 동사형태가 존재하지 않는다
- resousce 사이에서 연관 관계가 있는경우
- /resource/unique_id/relative_resouce
GET /user/{user_id}/profille
- /resource/unique_id/relative_resouce
/
구분자를 통하여 계층관계를 나타낸다- 대문자를 사용하는 것을 지양한다
Author And Source
이 문제에 관하여(TIL 19 | Django Request), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@action2thefuture/TIL-18-Django저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)