Django - 从 POST 请求中获取值,JavaScript fetch API

Abh*_*ngh 9 python django django-forms fetch-api django-3.0

抱歉,如果这是一个菜鸟问题,我正在创建一个Django 应用程序,为此我正在尝试使用 JavaScript fetch API 访问从 POST 请求接收的数据,但它显示为空。我不明白我的错误是什么。我试图删除所有不必要的部分进行调试。错误在这一部分:

我的代码 views.py

def checkdb(request):
    if request.method == "POST":
        a = request.POST.get('tag', 'default')
        print("printing", a)
        print(request.POST)
    return HttpResponse("Hello")

def check(request):
    return render(request, 'shop/new.html')
Run Code Online (Sandbox Code Playgroud)

代码 URLS.py

urlpatterns = [
    path('', views.index, name="shop"),
    path('checkdb/', views.checkdb, name="checkdb"),
    path('check/', views.check, name="check"),
]
Run Code Online (Sandbox Code Playgroud)

的代码new.html,它只有脚本标签来获取请求只是为了测试目的。

<script>

data = JSON.stringify({
    headline: "Testing",
    tag: "Testing",
    background_image: "Testing",
    content: "Testing",
    user: 1
})

let csrftoken = getCookie('csrftoken');
let response = fetch("/shop/checkdb/", {
    method: 'POST',
    body: data,
    headers: { 'Accept': 'application/json, text/plain, */*',
        'Content-Type': 'application/json',
        "X-CSRFToken": csrftoken },
})


function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i].trim();
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

</script>
Run Code Online (Sandbox Code Playgroud)

当我去端点商店/检查 然后它的脚本标签执行并且控制台中没有错误但是当我尝试打印在终端中收到的数据时它总是打印默认选项我没有得到什么错误我想打印数据对应于键“标签”,它是“测试”,但它给出了默认选项请帮我找出我的错误。

终端输出

Quit the server with CTRL-BREAK.
[01/May/2020 19:09:02] "GET /shop/check/ HTTP/1.1" 200 1091
printing default
<QueryDict: {}>
[01/May/2020 19:09:02] "POST /shop/checkdb/ HTTP/1.1" 200 5
Run Code Online (Sandbox Code Playgroud)

我正在使用 Django 3.0.4。

如果有任何愚蠢的错误,谢谢和抱歉,我是 Django 的新手

Olf*_*os6 9

根据我的经验,使用 fetch 发送的数据不在内部request.POST而是在request.body. 在某些情况下,接收到的数据是以字节为单位的,因此您需要先对其进行解码。我建议你先这样做:

if request.method == "POST":
    import json
    post_data = json.loads(request.body.decode("utf-8"))
Run Code Online (Sandbox Code Playgroud)

然后尝试post_data像普通的python字典一样访问内容以获取tagas in的值post_data.get("tag")


Abh*_*ngh 3

根据我的研究要求。POST 不起作用,它仅在存在表单数据时才起作用,我通过使用解决了访问数据的问题

 data = json.loads(request.body.decode("utf-8"))
 tag = data['tag']
 print(data)
 print(tag)

Run Code Online (Sandbox Code Playgroud)

要使用 json.loads() 首先你必须import json模块。