簡介:我正在撰寫一個 Django 應用程式,它需要將一些資料從前端發送到后端的 views.py 檔案。為此,我有一個在單擊時執行事務的按鈕。這是它的樣子:
<button id="submit_transaction" type="button" class="btn btn-outline-info" onclick="transaction()">Transaction</button>
問題:單擊時,按鈕會觸發一個呼叫的函式,該函式transaction()執行異步操作,如下所示:
<script>
async function transaction(){
// Perform some task
// Submit transaction
$.ajax({
type: 'POST',
data : {
'public_key': public_key,
},
success: function(res){
console.log(res);
}
});
}
</script>
在這個異步函式內部有一個 ajax 呼叫,它將一些資料收集到一個變數中,然后通過一個 post 請求將其發送到后端(如這里建議的鏈接)。
但是,當我單擊按鈕時,會彈出以下錯誤:
未捕獲(承諾中)TypeError:非法呼叫
問題:你知道我做錯了什么嗎?或者您能否提出一個聰明而優雅的解決方案來將一些資料從前端發送到后端?
uj5u.com熱心網友回復:
您需要提供一個網址
<script>
body = {
'csrfmiddlewaretoken': crsfToken,
'public_key': ...
}
async function transaction(){
// Perform some task
// Submit transaction
$.ajax({
url: 'https://mysite',
type: 'POST',
data : body,
success: function(res){
console.log(res);
}
});
}
</script>
如果您希望您的 django 視圖接受請求,您還必須提供 csrf_token(或使用不太安全的 csrf_exempt)
我確實建議在 Ajax 上使用 Request 標準 JS 庫,因為 Request 是本機的。您可以在此處找到更多檔案:https ://developer.mozilla.org/en-US/docs/Web/API/Request/Request
這是我如何使用 Request 的示例:
/**
* Send some data to create an object in my db.
* @param data what's created.
* @returns {*} what was created server-side.
*/
async create(data) {
let res = await fetch(new Request('https://my.create.url', {
method: 'POST',
body: data,
headers: {
'X-CSRFToken': this.csrfToken,
'Content-Type': "application/x-www-form-urlencoded" // required if you want to use request.POST in django
}
}));
if (res.status === 201) {
return res.text(); // Status (because I return HttpResponse(status=201) )
}
if (res.status === 400) {
throw new InvalidFormError("form invalid", await res.text());
}
throw new Error(await res.text()); // You have to handle it afterward
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/521586.html
標籤:javascriptPythonjQuerydjango阿贾克斯
上一篇:csrf令牌不匹配甚至令牌存在
