成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Django解析Angular的POST數(shù)據(jù)

Java_oldboy / 3501人閱讀

摘要:在使用和的過程中,遇到過一個向數(shù)據(jù)的問題。以上將會打印出而我們期望是這樣的結(jié)果出現(xiàn)這種問題是因?yàn)槟J(rèn)發(fā)送的數(shù)據(jù)格式是而不是,而的無法解析,所以才會出現(xiàn)上面的結(jié)果。和最大的區(qū)別是將每個存在列表當(dāng)中,并且是不可修改類型。

在使用Django和Angular的過程中,遇到過一個Angular向Django POST數(shù)據(jù)的問題。

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

以上將會打印出


u"{"text": "hello world", "date": "2017-01-04"}"

而我們期望是這樣的結(jié)果


u"{"text": "hello world", "date": "2017-01-04"}"

出現(xiàn)這種問題是因?yàn)锳ngular默認(rèn)發(fā)送的數(shù)據(jù)格式是JSON而不是urlencode,而Django的request.POST無法解析JSON,所以才會出現(xiàn)上面的結(jié)果。

解決的辦法有很多,最簡單粗暴的辦法就是在每個視圖函數(shù)里面都將request.body進(jìn)行解析

def myviews(request):
    data = urlencode(json.loads(request.body))
    q_data = QueryDict(data)

我們可以把這類操作提取出來,寫成Middlerware,在request請求到達(dá)視圖函數(shù)之前就給統(tǒng)一處理好

class JSONMiddleware(object):
    """
    Process application/json requests data from GET and POST requests.
    """
    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

因?yàn)橛械?b>request請求當(dāng)中沒有CONTENT-TYPE這個Header,所以我們需要判斷一下,之所以不簡單的轉(zhuǎn)化成Dict而是QueryDict是因?yàn)樽裱恢滦缘脑瓌t,我們想要將結(jié)果綁定在request.GET或者request.POST上面,而它們都是QueryDict類型。QueryDictDict最大的區(qū)別是QueryDict將每個value存在列表當(dāng)中,并且QueryDict是不可修改類型。所以當(dāng)value是列表時我們也必須做一下判斷,否則整個列表將作為一個元素存入QueryDict的列表當(dāng)中。

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/38308.html

相關(guān)文章

  • Django搭建個人博客:使用Form表單類發(fā)表新文章

    摘要:一些表單界面元素文本框或復(fù)選框非常簡單并內(nèi)置在中,而其他會復(fù)雜些像彈出日期選擇等操作控件。和標(biāo)簽中的屬性指定了當(dāng)前文本框提交的數(shù)據(jù)的名稱,它必須與表單類中的字段名稱對應(yīng),否則服務(wù)器無法將字段和數(shù)據(jù)正確的對應(yīng)起來。 前面我們已經(jīng)學(xué)會如何用Markdown語法書寫文章了。 但是還有問題呀。之前寫文章都是在后臺中進(jìn)行的,萬一有別的普通用戶也要發(fā)表文章怎么辦?萬一我想拓展些后臺中沒有的提交驗(yàn)證...

    Java3y 評論0 收藏0
  • Django 博客開發(fā)教程 8 - 博客文章詳情頁

    摘要:對文章詳情視圖而言,每篇文章對應(yīng)著不同的。在博客文章詳情頁追夢人物的博客的評論區(qū)留言。將問題的詳細(xì)描述通過郵件發(fā)送到,一般會在小時內(nèi)回復(fù)。更多教程,請?jiān)L問追夢人物的博客。 首頁展示的是所有文章的列表,當(dāng)用戶看到感興趣的文章時,他點(diǎn)擊文章的標(biāo)題或者繼續(xù)閱讀的按鈕,應(yīng)該跳轉(zhuǎn)到文章的詳情頁面來閱讀文章的詳細(xì)內(nèi)容?,F(xiàn)在讓我們來開發(fā)博客的詳情頁面,有了前面的基礎(chǔ),開發(fā)流程都是一樣的了:首先配置 ...

    pkwenda 評論0 收藏0
  • FCC 成都社區(qū)·技術(shù)周刊 第 13 期

    摘要:前端支持同域才能發(fā)送本月初,瀏覽器發(fā)布。所謂攻擊,就是使用真實(shí)的進(jìn)行惡意行為。鏈接發(fā)布此次發(fā)布亮點(diǎn)包括類型以及對和映射對象類型中的符號和數(shù)字文字的支持。但直到看到了,總算覺得社區(qū)又進(jìn)了一步。微信已將對弈源碼和訓(xùn)練好的模型開源。 【前端】 1、Firefox 60 支持同域才能發(fā)送 Cookie 本月初,F(xiàn)irefox 60 瀏覽器發(fā)布。它有一個很大的亮點(diǎn),就是它解決了 CSRF 攻擊。...

    Seay 評論0 收藏0
  • FCC 成都社區(qū)·技術(shù)周刊 第 13 期

    摘要:前端支持同域才能發(fā)送本月初,瀏覽器發(fā)布。所謂攻擊,就是使用真實(shí)的進(jìn)行惡意行為。鏈接發(fā)布此次發(fā)布亮點(diǎn)包括類型以及對和映射對象類型中的符號和數(shù)字文字的支持。但直到看到了,總算覺得社區(qū)又進(jìn)了一步。微信已將對弈源碼和訓(xùn)練好的模型開源。 【前端】 1、Firefox 60 支持同域才能發(fā)送 Cookie 本月初,F(xiàn)irefox 60 瀏覽器發(fā)布。它有一個很大的亮點(diǎn),就是它解決了 CSRF 攻擊。...

    chnmagnus 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<