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에 기반으로 만들어진다
    1. Query parameter는 ?으로 시작이 되고 key와 value는 =으로 구분이 된다
    2. key와 key는 &으로 구분이 된다
    3. 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 Method


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

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

  1. resource는 명사형태
  2. URI에 Http method, 동사형태가 존재하지 않는다
  3. resousce 사이에서 연관 관계가 있는경우
    • /resource/unique_id/relative_resouce
      GET /user/{user_id}/profille
  4. /구분자를 통하여 계층관계를 나타낸다
  5. 대문자를 사용하는 것을 지양한다

좋은 웹페이지 즐겨찾기