1. 程式人生 > >Django的QueryDict(基於Python)

Django的QueryDict(基於Python)

QueryDict:本身繼承dict,特性就是跟列表的一些屬性封裝起來了

初始化方法(__init__()):

    def __init__(self, query_string=None, mutable=False, encoding=None):
        super(QueryDict, self).__init__()
        if not encoding:
            encoding = settings.DEFAULT_CHARSET
        self.encoding = encoding
        query_string = query_string or ''
        parse_qsl_kwargs = {
            'keep_blank_values': True,
            'fields_limit': settings.DATA_UPLOAD_MAX_NUMBER_FIELDS,
            'encoding': encoding,
        }
        if six.PY3:
            if isinstance(query_string, bytes):
                # query_string normally contains URL-encoded data, a subset of ASCII.
                try:
                    query_string = query_string.decode(encoding)
                except UnicodeDecodeError:
                    # ... but some user agents are misbehaving :-(
                    query_string = query_string.decode('iso-8859-1')
            for key, value in limited_parse_qsl(query_string, **parse_qsl_kwargs):
                self.appendlist(key, value)
        else:
            for key, value in limited_parse_qsl(query_string, **parse_qsl_kwargs):
                try:
                    value = value.decode(encoding)
                except UnicodeDecodeError:
                    value = value.decode('iso-8859-1')
                self.appendlist(force_text(key, encoding, errors='replace'),
                                value)
        self._mutable = mutable

引數:

  • query_string=None:建立QueryDict物件時,如果傳了一個QueryDict(字串),會有兩種特殊情況:
# 1.有&的符的情況,把&前後兩個值當做key
q = QueryDict('query&8',mutable=True)

# 結果:
<QueryDict: {'query': [''], '8': ['']}>
# 2.中間有'='的時候,會把等號左右的值,做key和value:
q = QueryDict('query=8&next=/9',mutable=True)
print(q)

# 輸出:
<QueryDict: {'query': ['8'], 'next': ['/9']}>
  • mutable=True:(英文:易變的)
  •  _mutable = True
     _encoding = None
     def __init__(self, query_string=None, mutable=False, encoding=None):
         self._mutable = mutable
    
    '''
    這是django的原始碼,_mutable本身是True,這個屬性是當你定義一個QueryDict物件,
    你可以對它做修改;
    但是初始化中,可以看到mutable預設值為False,然後又重新賦值給了_mutable,
    所以你要想對QueryDict物件做增刪改時,就將它設為True;
    '''

在web開發中用的一個方法:

  • QueryDict().urlencode:
  • ''' 
    q.urlencode()會把你物件中的所有key和value用=拼接起來
    然後值與值之間用&連線
    '''
    
    q = QueryDict(mutable=True)
    q['query'] = '8'
    q['page'] = 2
    print(q.urlencode())
    
    # 結果
    query=8&page=2
    '''
    QueryDict會對你的特殊符號進行轉義;
    所以可以利用這個,在web開發,獲取當前的路徑,傳給你要跳轉的頁面
    '''
    
    q = QueryDict(mutable=True)
    q['next'] = '/crm/customer/?query=8&page=2'
    print(q.urlencode())
    
    # 結果:
    next=%2Fcrm%2Fcustomer%2F%3Fquery%3D8%26page%3D2