1. 程式人生 > >Django中獲取引數的方法

Django中獲取引數的方法

通常HTTP協議向伺服器傳參有幾種途徑 :

  • 提取URL的特定部分,如/weather/shanghai/2018,可以在伺服器端的路由中用正則表示式擷取;

  • 查詢字串(query string),形如key1=value1&key2=value2;

  • 請求體(body)中傳送的資料,比如表單資料、json、xml;

  • 在http報文的頭(header)中。

    1.URL中引數的獲取

    在定義路由URL時,可以使用正則表示式提取引數的方法從URL中獲取請求引數,Django會將提取的引數直接傳遞到檢視的傳入引數中。

    一、未命名引數按定義順序傳遞

    注意:引數獲取的順序與url中引數的位置一一對應,不能互換

    url(r'^weather/([a-z]+)/(\d{4})/$', views.weather),
    
    def weather(request, city, year):
        print('city=%s' % city)
        print('year=%s' % year)
        return HttpResponse('OK')

    二、命名引數按名字傳遞

    注意:如果在路由中指定了引數的名字,name接收引數時,必須要使用路由中指定的引數名稱,不能換成其他名字,此時,兩個引數位置可以互換。

    url(r'^weather/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.weather),
    
    def weather(request, year, city):
        print('city=%s' % city)
        print('year=%s' % year)
        return HttpResponse('OK')

    2.獲取請求路徑中的查詢字串引數

    (形如?k1=v1&k2=v2),可以通過request.GET屬性獲取,返回QueryDict物件。

    什麼是QueryDict物件?

    定義在django.http.QueryDict

    HttpRequest物件的屬性GET、POST都是QueryDict型別的物件

    與python字典不同,QueryDict型別的物件用來處理同一個鍵帶有多個值的情況

    【1】方法get():根據鍵獲取值

    如果一個鍵同時擁有多個值將獲取最後一個值

    如果鍵不存在則返回None值,可以設定預設值進行後續處理

    dict.get('鍵',預設值)
    可簡寫為: dict['鍵']

    【2】方法getlist():根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值

    如果鍵不存在則返回空列表[],可以設定預設值進行後續處理

    dict.getlist('鍵',預設值)

    獲取引數例項

    訪問路徑:/user/qs/?a=10&b=20&a=30

    url(r'^qs/$',views.qs,name='qs'),
    
    def qs(request):
        a = request.GET.get('a')  #30
        b = request.GET.get('b')  #20
        num_list = request.GET.getlist('a') #['10','30']
        print(a)
        print(b)
        print(num_list)
    
        return HttpResponse(reverse('user:qs'))

    重要:查詢字串不區分請求方式,即假使客戶端進行POST方式的請求,依然可以通過request.GET獲取請求中的查詢字串資料。

    3.請求體中的引數

    3.1表單資料獲取

    通過request.POST來獲取

    注意:Django預設開啟了CSRF防護,會對上述請求方式進行CSRF防護驗證,在測試時可以關閉CSRF防護機制,方法為在settings.py檔案中註釋掉CSRF中介軟體

    url(r'^getbody/$',views.get_body),
    
    def get_body(request):
        form_data = request.POST.get('c')
        print(form_data)
        return HttpResponse(form_data)
    3.2非表單資料獲取

    非表單型別的請求體資料,Django無法自動解析,可以通過request.body屬性獲取最原始的請求體資料,自己按照請求體格式(JSON、XML等)進行解析。request.body返回bytes型別

    import json
    
    url(r'^getjson/$',views.get_body_json),
    
    def get_body_json(request):
        # 得到的是一個二進位制資料
        json_str = request.body
        print(json_str)                     # b'{\n    "f":200,\n    "d":300\n    \n}'\
        # 對二進位制資料進行解碼,解碼得到json資料
        json_str = json_str.decode()
        print(json_str)                     # {"f":200,"d":300}
        # 將json資料轉化成字典形式
        json_data = json.loads(json_str)
        print(json_data)                    # {'f': 200, 'd': 300}
        # 獲取json資料,使用字典方式取值
        print(json_data['d'])               # 300
        print(json_data['f'])               # 200
        return HttpResponse('ok')

    4.其他常用HttpRequest物件屬性

    request.method 請求方式

    request.path 請求路徑

    request.user 請求的使用者物件

    request.FILES 一個類似於字典的物件,包含所有的上傳檔案

    request.encoding 一個字串,表示請求的頁面的完整路徑,不包含域名和引數部分。

    url(r'^otherattr/$', views.other_attr),
    
    def other_attr(request):
        print(request.method)    # POST
        print(request.path)      # /user/otherattr/
        print(request.encoding)  # None:表示使用瀏覽器的預設設定,一般為utf-8,這個屬性是可寫的,
        # 可以通過修改它來修改訪問表單資料使用的編碼,接下來對屬性的任何訪問將使用新的encoding值。
        return HttpResponse('success')