WSGI閱讀筆記二

WSGI源碼中能夠看到,第一個函數是get_current_url,源碼以下,仔細分析一下這段代碼的做用:html

def get_current_url(environ, root_only=False, strip_querystring=False, host_only=False, trusted_hosts=None):
    
    tmp = [environ['wsgi.url_scheme'], '://', get_host(environ, trusted_hosts)]
    cat = tmp.append
    if host_only:
        return uri_to_iri(''.join(tmp) + '/') 

    cat(url_quote(wsgi_get_bytes(environ.get('SCRIPT_NAME', ''))).rstrip('/'))
    cat('/')              
    if not root_only:
        cat(url_quote(wsgi_get_bytes(environ.get('PATH_INFO', '')).lstrip(b'/')))
        if not strip_querystring:
            qs = get_query_string(environ)
            if qs:
                cat('?' + qs)
    return uri_to_iri(''.join(tmp))

get_current_url接受5個參數,其中後四個是默認參數都設置爲False或者是None
第一句list中,索引爲0的值獲取environ字典中keywsgi.url_scheme的值,scheme有兩種:http或者是https。索引爲2的值是一個地址,其中函數get_hosttrusted_host的做用咱們會在下面的源碼中看到。  app

cat是一個函數,至關於list1.append(i)。  
接下來若是host_onlyTrue,那麼直接返回字符串,格式如:https://www.xxxxx.xxxx/ 。注意這個uri_to_iri函數位於urls模塊中,它的做用是: 將URI轉換成用Unicode編碼的IRI,IRI的介紹能夠查看w3ide

cat(url_quote(wsgi_get_bytes(environ.get('SCRIPT_NAME', ''))).rstrip('/'))中首先get環境字典元素中的script_name,接着wsgi_get_bytes方法將編碼方式改爲爲latin1,在_compat模塊中wsgi_get_bytes=operator.methoncaller('encode','latin1')url_quote傳入要轉換的編碼格式的字符串和須要轉成的編碼格式,將字符串的編碼方式改變成給定的形式,默認參數是utf-8。  函數

methodcaller的做用以下:

url_quote源碼中有一個bytearray方法是一個內建函數:使用方法編碼

>>>d1 = b"12345"
>>>print(type(d1))
>>>d2 = bytearray(d1)
>>>print(type(d2))
>>>for i in d2:
>>>    print d2

由輸出結果可知d2是一個"bytearry"類型,且d2是一個可迭代對象。url

下一個條件語句,針對URL中pathquerying進行格式化,並將pathquery加到URL路徑中。
相似get_query_string函數,在WSGI中有不少,主要獲得的是特定的字符串,get_query_string的理解以下:
裏面有一個方法:try_coerce_native其做用是:將字符Unicode字符格式轉換成默認的編碼格式。  
 
函數最後返回一個通過url_parse處理過的tupleurl_parse返回通過is_test_basedURL或者BytesURL修飾過的字符串。而URLBytesURL兩個類從BaseURL中繼承。最中仍是返回URL中各個信息段組成的tuplecode

因此get_current_url最後獲得一個由URL各信息段組成的tuple

相關文章
相關標籤/搜索