Django request.META.get()獲取不到header頭的原因分析
在使用Django過(guò)程中需要開(kāi)發(fā)一些API給其他系統(tǒng)使用,為了安全把Token等驗(yàn)證信息放在header頭中。
如何獲?。?/h2>
使用request.META.get("headerkey")來(lái)獲取
注意:
如果headerkey為auth-token,即headers={'auth-token':'1234'}
應(yīng)該使用request.META.get("HTTP_AUTH_TOKEN")獲取
headerkey中的小寫(xiě)轉(zhuǎn)為大寫(xiě),橫線“-”轉(zhuǎn)為下劃線“_”,并且加上前綴HTTP
尤其注意headerkey中不應(yīng)該包含 HTTP前綴,以及符號(hào)"_",否則會(huì)取不到對(duì)應(yīng)的值
補(bǔ)充:Django中獲取參數(shù)(路徑,查詢(xún),請(qǐng)求頭,請(qǐng)求體)
一、通常HTTP協(xié)議向服務(wù)器傳參有幾種途徑
提取URL的特定部分,如/weather/shanghai/2018,可以在服務(wù)器端的路由中用正則表達(dá)式截??;
查詢(xún)字符串(query string),形如key1=value1&key2=value2;
請(qǐng)求體(body)中發(fā)送的數(shù)據(jù),比如表單數(shù)據(jù)、json、xml;
在http報(bào)文的頭(header)中。
1.URL中參數(shù)的獲取
在定義路由URL時(shí),可以使用正則表達(dá)式提取參數(shù)的方法從URL中獲取請(qǐng)求參數(shù),Django會(huì)將提取的參數(shù)直接傳遞到視圖的傳入?yún)?shù)中。
1. 1未命名參數(shù)按定義順序傳遞
注意:參數(shù)獲取的順序與url中參數(shù)的位置一一對(duì)應(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ù)名稱(chēng),不能換成其他名字,此時(shí),兩個(gè)參數(shù)位置可以互換。
url(r'^users/(?P<name>[a-z]+)/(?P<id>\d{4})/$', views.users),
def weather(request, name, id):
print('name=%s' % name)
print('id=%s' % id)
return HttpResponse('OK')
2.獲取請(qǐng)求路徑中的查詢(xún)字符串參數(shù)
(形如?k1=v1&k2=v2),可以通過(guò)request.GET屬性獲取,返回QueryDict對(duì)象。
什么是QueryDict對(duì)象?
定義在django.http.QueryDict
HttpRequest對(duì)象的屬性GET、POST都是QueryDict類(lèi)型的對(duì)象
與python字典不同,QueryDict類(lèi)型的對(duì)象用來(lái)處理同一個(gè)鍵帶有多個(gè)值的情況
2.1方法get():根據(jù)鍵獲取值
如果一個(gè)鍵同時(shí)擁有多個(gè)值將獲取最后一個(gè)值
如果鍵不存在則返回None值,可以設(shè)置默認(rèn)值進(jìn)行后續(xù)處理
dict.get('key',value)==>可簡(jiǎn)寫(xiě)為: dict['key']
2.2方法getlist():根據(jù)鍵獲取值,值以列表返回,可以獲取指定鍵的所有值
如果鍵不存在則返回空列表[],可以設(shè)置默認(rèn)值進(jìn)行后續(xù)處理
dict.getlist('鍵',默認(rèn)值)
2.3獲取參數(shù)實(shí)例
訪問(wèn)路徑:/user/qs/?a=1&b=2&a=3
注意:查詢(xún)字符串不區(qū)分請(qǐng)求方式,客戶端GET,POST方式的請(qǐng)求,都可以通過(guò)request.GET獲取請(qǐng)求中的查詢(xún)字符串?dāng)?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.請(qǐng)求體中的參數(shù)
3.1表單數(shù)據(jù)獲取
通過(guò)request.POST來(lái)獲取
注意:Django默認(rèn)開(kāi)啟了CSRF防護(hù),會(huì)對(duì)上述請(qǐng)求方式進(jìn)行CSRF防護(hù)驗(yàn)證,在開(kāi)發(fā)測(cè)試時(shí)可以關(guān)閉CSRF防護(hù)機(jī)制,方法為在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ù)獲取
非表單類(lèi)型的請(qǐng)求體數(shù)據(jù),Django無(wú)法自動(dòng)解析,可以通過(guò)request.body屬性獲取最原始的請(qǐng)求體數(shù)據(jù),自己按照請(qǐng)求體格式(JSON、XML等)進(jìn)行解析。request.body返回bytes類(lèi)型
import json
url(r'^getjson/$',views.get_body_json),
def get_body_json(request):
# 得到的是一個(gè)二進(jìn)制數(shù)據(jù)
json_str = request.body
print(json_str) # b'{\n "f":200,\n "d":300\n \n}'\
# 對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行解碼,解碼得到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請(qǐng)求頭內(nèi)容
通過(guò)view函數(shù)傳遞過(guò)來(lái)的 reuqest,使用request.META.get("header key")來(lái)獲取
注意:
header key必須大寫(xiě),前綴必須是"HTTP",后面如果連接符是橫線“-”,要改成下劃線“_”。例如你的header的key為api_auth,那在Django中應(yīng)該使用request.META.get("HTTP_API_AUTH")來(lái)獲取請(qǐng)求頭的數(shù)據(jù)。
5.其他常用HttpRequest對(duì)象屬性
request.method 請(qǐng)求方式
request.path 請(qǐng)求路徑
request.user 請(qǐng)求的用戶對(duì)象
request.FILES 一個(gè)類(lèi)似于字典的對(duì)象,包含所有的上傳文件
request.encoding 一個(gè)字符串,表示請(qǐng)求的頁(yè)面的完整路徑,不包含域名和參數(shù)部分。
url(r'^otherattr/$', views.other_attr),
def other_attr(request):
print(request.method) # POST
print(request.path) # /user/otherattr/
print(request.encoding) # None:表示使用瀏覽器的默認(rèn)設(shè)置,一般為utf-8,這個(gè)屬性是可寫(xiě)的,
# 可以通過(guò)修改它來(lái)修改訪問(wèn)表單數(shù)據(jù)使用的編碼,接下來(lái)對(duì)屬性的任何訪問(wèn)將使用新的encoding值。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
python數(shù)字圖像處理環(huán)境安裝與配置過(guò)程示例
這篇文章主要為大家介紹了python數(shù)字圖像處理環(huán)境安裝與配置過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
解決Python selenium get頁(yè)面很慢時(shí)的問(wèn)題
今天小編就為大家分享一篇解決Python selenium get頁(yè)面很慢時(shí)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Python實(shí)現(xiàn)圖片與視頻互轉(zhuǎn)代碼實(shí)戰(zhàn)(親測(cè)有效)
圖片轉(zhuǎn)視頻,視頻轉(zhuǎn)圖片手機(jī)一操作,立馬轉(zhuǎn)換過(guò)來(lái),那么基于代碼是如何操作的呢?下面小編給大家?guī)?lái)了Python實(shí)現(xiàn)圖片與視頻互轉(zhuǎn)代碼實(shí)戰(zhàn),感興趣的朋友跟隨小編一起看看吧2021-12-12
Idea安裝python顯示無(wú)SDK問(wèn)題解決方案
這篇文章主要介紹了Idea安裝python顯示無(wú)SDK問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
對(duì)python append 與淺拷貝的實(shí)例講解
今天小編就為大家分享一篇對(duì)python append 與淺拷貝的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
django框架model orM使用字典作為參數(shù),保存數(shù)據(jù)的方法分析
這篇文章主要介紹了django框架model orM使用字典作為參數(shù),保存數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了字典參數(shù)結(jié)合django model實(shí)現(xiàn)保存數(shù)據(jù)相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
可視化pytorch 模型中不同BN層的running mean曲線實(shí)例
這篇文章主要介紹了可視化pytorch 模型中不同BN層的running mean曲線實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06

