Django解析Angular的POST數據

高洛峰
發布: 2017-02-18 10:36:09
原創
1363 人瀏覽過

在使用Django和Angular的過程中,遇到一個Angular向Django POST資料的問題。

// Angular
$http({
    url: "myviews",
    method: "POST",
    data: {'text': 'hello world', 'date': '2017-01-04'}
})
登入後複製
# Django
def myviews(request):
    print request.POST
    print request.body
登入後複製

以上將會列印出

<QueryDict: {}>
u"{'text': 'hello world', 'date': '2017-01-04'}"
登入後複製

而我們期望是這樣的結果

<QueryDict: {u&#39;text&#39;: u&#39;hello world&#39;, u&#39;date&#39;: u&#39;2017-01-04&#39;}>
u"{'text': 'hello world', 'date': '2017-01-04'}"
登入後複製

出現這種問題是因為Angular預設發送的資料格式是JSON而不是urlencodes 無法解析JSON,所以才會出現上面的結果。 解決的方法有很多,最簡單粗暴的辦法就是在每個視圖函數裡面都將

request.body

進行解析<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">def myviews(request):     data = urlencode(json.loads(request.body))     q_data = QueryDict(data)</pre><div class="contentsignin">登入後複製</div></div>我們可以把這類操作提取出來,寫成

Middlerware

,在requestrequestrequestrequest

request

requestrequestrequestrequestrequestrequestrequestrequestrequestrequestrequestrequestrequest請求到達視圖函數之前就給統一處理好<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">class JSONMiddleware(object):     &quot;&quot;&quot;     Process application/json requests data from GET and POST requests.     &quot;&quot;&quot;     def process_request(self, request):         if 'application/json' in request.META['CONTENT_TYPE']:             data = json.loads(request.body)             q_data = QueryDict('', mutable=True)             for key, value in data.iteritems():                 if isinstance(value, list):                     for x in value:                         q_data.update({key: x})                 else:                     q_data.update({key: value})             if request.method == 'GET':                 request.GET = q_data             if request.method == 'POST':                 request.POST = q_data         return None</pre><div class="contentsignin">登入後複製</div></div>因為有的request請求當中沒有CONTENT-TYPE這個Header,所以我們需要判斷一下,之所以不簡單的轉換成Dict而是QueryDict是因為遵循一致性的原則,我們想要將結果綁定在request.GETrequest.POST上面,而它們都是QueryDict類型。

QueryDict

Dict

最大的區別是
QueryDict

將每個

value

存在列表當中,並且

QueryDict
是不可修改類型。所以當

value

是列表時我們也必須做一下判斷,否則整個列表將作為一個元素存入

QueryDict🎜的列表當中。 🎜
a = {"a": [123, 456, 444], "b": 456}
# 不做判断
data = QueryDict('', mutable=True)
for k, v in a.iteritems():
    data.update({k: v})
print data

# 做判断
data = QueryDict('' mutable=True)
for k, v in a.iteritems():
    if isinstance(v, list):
        for x in value:
            data.update({k: x})
    else:
        data.update({k: v})
print data
登入後複製
<QueryDict: {u&#39;a&#39;: [[123, 456, 444]], u&#39;b&#39;: [456]}>
<QueryDict: {u&#39;a&#39;: [123, 456, 444], u&#39;b&#39;: [456]}>
登入後複製
🎜                                               🎜🎜🎜🎜🎜更多Django解析Angular的POST資料相關文章請追蹤PHP中文網! 🎜🎜🎜🎜🎜🎜
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板