簡體   English   中英

如何將數據從 python 客戶端發送到 Django web 服務器?

[英]How to send data from python client to Django web server?

我希望 python3 程序將 JSON 數據發送到 Django web 服務器並在 Z2567A58EC9705EB7189DZ 頁面上打印它們。 這就是我在 Views.py 中的內容:

def receive_json(request):
    if request.method == 'POST':
        received_data = json.loads(request.body.decode("utf-8"))
        return StreamingHttpResponse('it was post request: ' + str(received_data))
    return StreamingHttpResponse('it was get request')

和 python 代碼:

import requests
import json
url = "http://127.0.0.1:8000/"
data = {"data": [{'key1':'val1'}, {'key2':'val2'}]}
headers = {'content-type':'application/json'}
r = requests.post(url, data=json.dumps(data), headers=headers)
r.text

但是,它顯示此消息:

Forbidden (CSRF cookie not set.): /
[28/May/2021 16:51:31] "POST / HTTP/1.1" 403 2864
import requests
import json
url = "http://127.0.0.1:8000/"
data = {"data": [{'key1':'val1'}, {'key2':'val2'}]}
headers = {'content-type':'application/json','Cookie':'csrftoken=axXsa39e5hq8gqlTjJFHAbUWtg2FQgnSd3cxxkx9khatqgersthtSryDxtF0cVCk'}
r = requests.post(url, data=json.dumps(data), headers=headers)
r.text

我認為這些可以通過添加 Cookie 來工作,但如果你通過這些方式在 receive_json function 中使用 @csrf_exempt 裝飾器會更好

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def receive_json(request):
    if request.method == 'POST':
        received_data = json.loads(request.body.decode("utf-8"))
        return StreamingHttpResponse('it was post request: ' + str(received_data))
    return StreamingHttpResponse('it was get request')

本質上,您首先需要執行 GET 請求以獲取 csrftoken,然后將其與數據一起發布。 有幾種方法可以做到這一點。 這是一個(但未經測試):

import requests
import json
url = "http://127.0.0.1:8000/"


s = requests.Session()
s.get(url)
headers = {
  'content-type':'application/json',
  'X-CSRFToken': s.cookies["csrftoken"],
}
data = {"data": [{'key1':'val1'}, {'key2':'val2'}]}
r = s.post(url, data=json.dumps(data), headers=headers)
r.text

您可以在Django 的 CSRF 文檔中找到更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM