国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

Java_oldboy / 3455人閱讀

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

在使用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)這種問題是因為Angular默認發(fā)送的數(shù)據(jù)格式是JSON而不是urlencode,而Django的request.POST無法解析JSON,所以才會出現(xiàn)上面的結(jié)果。

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

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

我們可以把這類操作提取出來,寫成Middlerware,在request請求到達視圖函數(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

因為有的request請求當中沒有CONTENT-TYPE這個Header,所以我們需要判斷一下,之所以不簡單的轉(zhuǎn)化成Dict而是QueryDict是因為遵循一致性的原則,我們想要將結(jié)果綁定在request.GET或者request.POST上面,而它們都是QueryDict類型。QueryDictDict最大的區(qū)別是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

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

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

相關文章

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

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

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

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

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

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

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

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

    chnmagnus 評論0 收藏0

發(fā)表評論

0條評論

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