濮阳杆衣贸易有限公司

主頁 > 知識庫 > Django request.META.get()獲取不到header頭的原因分析

Django request.META.get()獲取不到header頭的原因分析

熱門標簽:南京銷售外呼系統(tǒng)軟件 房產(chǎn)電銷外呼系統(tǒng) 蓋州市地圖標注 地圖標注微信發(fā)送位置不顯示 上海機器人外呼系統(tǒng)哪家好 315電話機器人廣告 浙江電銷卡外呼系統(tǒng)好用嗎 地圖標注的意義點 地圖制圖標注位置改變是移位嗎

在使用Django過程中需要開發(fā)一些API給其他系統(tǒng)使用,為了安全把Token等驗證信息放在header頭中。

如何獲?。?/h2>

使用request.META.get("headerkey")來獲取

注意:

如果headerkey為auth-token,即headers={'auth-token':'1234'}

應(yīng)該使用request.META.get("HTTP_AUTH_TOKEN")獲取

headerkey中的小寫轉(zhuǎn)為大寫,橫線“-”轉(zhuǎn)為下劃線“_”,并且加上前綴HTTP

尤其注意headerkey中不應(yīng)該包含 HTTP前綴,以及符號"_",否則會取不到對應(yīng)的值

補充:Django中獲取參數(shù)(路徑,查詢,請求頭,請求體)

一、通常HTTP協(xié)議向服務(wù)器傳參有幾種途徑

提取URL的特定部分,如/weather/shanghai/2018,可以在服務(wù)器端的路由中用正則表達式截?。?/p>

查詢字符串(query string),形如key1=value1key2=value2;

請求體(body)中發(fā)送的數(shù)據(jù),比如表單數(shù)據(jù)、json、xml;

在http報文的頭(header)中。

1.URL中參數(shù)的獲取

在定義路由URL時,可以使用正則表達式提取參數(shù)的方法從URL中獲取請求參數(shù),Django會將提取的參數(shù)直接傳遞到視圖的傳入?yún)?shù)中。

1. 1未命名參數(shù)按定義順序傳遞

注意:參數(shù)獲取的順序與url中參數(shù)的位置一一對應(yīng),不能互換

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

1.2 命名參數(shù)按名字傳遞

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

url(r'^users/(?Pname>[a-z]+)/(?Pid>\d{4})/$', views.users),  
def weather(request, name, id):
    print('name=%s' % name)
    print('id=%s' % id)
    return HttpResponse('OK')

2.獲取請求路徑中的查詢字符串參數(shù)

(形如?k1=v1k2=v2),可以通過request.GET屬性獲取,返回QueryDict對象。

什么是QueryDict對象?

定義在django.http.QueryDict

HttpRequest對象的屬性GET、POST都是QueryDict類型的對象

與python字典不同,QueryDict類型的對象用來處理同一個鍵帶有多個值的情況

2.1方法get():根據(jù)鍵獲取值

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

如果鍵不存在則返回None值,可以設(shè)置默認值進行后續(xù)處理

dict.get('key',value)==>可簡寫為: dict['key']

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

如果鍵不存在則返回空列表[],可以設(shè)置默認值進行后續(xù)處理

dict.getlist('鍵',默認值)   

2.3獲取參數(shù)實例

訪問路徑:/user/qs/?a=1b=2a=3

注意:查詢字符串不區(qū)分請求方式,客戶端GET,POST方式的請求,都可以通過request.GET獲取請求中的查詢字符串數(shù)據(jù)。

url(r'^qs/$',views.get_value,name='g_v'),  
def get_value(request):
    a = request.GET.get('a')  #3
    b = request.GET.get('b')  #2
    num_list = request.GET.getlist('a') #['1','3']
    print(a)
    print(b)
    print(num_list)  
    return HttpResponse(reverse('user:get_value'))

3.請求體中的參數(shù)  

3.1表單數(shù)據(jù)獲取   

通過request.POST來獲取

注意:Django默認開啟了CSRF防護,會對上述請求方式進行CSRF防護驗證,在開發(fā)測試時可以關(guān)閉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非表單數(shù)據(jù)獲取

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

import json  
url(r'^getjson/$',views.get_body_json),  
def get_body_json(request):
    # 得到的是一個二進制數(shù)據(jù)
    json_str = request.body
    print(json_str)                     # b'{\n    "f":200,\n    "d":300\n    \n}'\

    # 對二進制數(shù)據(jù)進行解碼,解碼得到j(luò)son數(shù)據(jù)
    json_str = json_str.decode()
    print(json_str)                     # {"f":200,"d":300}
    # 將json數(shù)據(jù)轉(zhuǎn)化成字典形式
    json_data = json.loads(json_str)
    print(json_data)                    # {'f': 200, 'd': 300}
    # 獲取json數(shù)據(jù),使用字典方式取值
    print(json_data['d'])               # 300
    print(json_data['f'])               # 200
    return HttpResponse('ok')

4.例如:Django獲取http請求頭內(nèi)容  

通過view函數(shù)傳遞過來的 reuqest,使用request.META.get("header key")來獲取

  注意:

header key必須大寫,前綴必須是"HTTP",后面如果連接符是橫線“-”,要改成下劃線“_”。例如你的header的key為api_auth,那在Django中應(yīng)該使用request.META.get("HTTP_API_AUTH")來獲取請求頭的數(shù)據(jù)。

5.其他常用HttpRequest對象屬性

request.method 請求方式

request.path 請求路徑

request.user 請求的用戶對象

request.FILES 一個類似于字典的對象,包含所有的上傳文件

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

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

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Django接收自定義http header過程詳解
  • DRF跨域后端解決之django-cors-headers的使用
  • Django Python 獲取請求頭信息Content-Range的方法

標簽:臨汾 日照 陽泉 雙鴨山 赤峰 克拉瑪依 貴州 金華

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Django request.META.get()獲取不到header頭的原因分析》,本文關(guān)鍵詞  Django,request.META.get,獲取,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Django request.META.get()獲取不到header頭的原因分析》相關(guān)的同類信息!
  • 本頁收集關(guān)于Django request.META.get()獲取不到header頭的原因分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    广元市| 永川市| 射洪县| 昌图县| 泊头市| 页游| 郴州市| 宜良县| 富平县| 当涂县| 专栏| 乳山市| 会东县| 永城市| 杨浦区| 永新县| 綦江县| 交口县| 乌拉特中旗| 安多县| 旬邑县| 通化市| 霸州市| 利辛县| 满洲里市| 巴彦淖尔市| 溧水县| 顺昌县| 皮山县| 天柱县| 通许县| 长治县| 乃东县| 剑阁县| 东乌珠穆沁旗| 娱乐| 泰顺县| 甘孜县| 达日县| 雷山县| 桃园市|