为 Django POST 请求获取 API
Fetch API for Django POST requests
我正在尝试从 React/Redux/Django 网络应用程序中删除 jQuery,并将 $.ajax
方法替换为 Fetch API。我的所有 GET 请求都或多或少地工作正常,而且我似乎能够达到我的 POST 请求,但我似乎无法以实际获得我的 POST 的方式格式化我的请求] 数据到 Django request.POST
对象。每次我点击 /sign_in 视图时, request.POST
对象都是空的。我的整个应用程序的后端是围绕使用 Django 表单构建的(没有 Django 模板,只有 React 控制的组件),我真的不想重写我所有的视图来使用 request.body
或 request.data
.
这是我认为相关的所有代码,如果还有更多有用的代码,请告诉我:
这是我用来构建完整 POST 数据并附加 CSRF 令牌的柯里化函数:
const setUpCsrfToken = () => {
const csrftoken = Cookies.get('csrftoken')
return function post (url, options) {
const defaults = {
'method': 'POST',
'credentials': 'include',
'headers': {
'X-CSRFToken': csrftoken,
'Content-Type': 'application/x-www-form-urlencoded'
}
}
const merged = merge(options, defaults)
return fetch(url, merged)
}
}
export const post = setUpCsrfToken()
这是我在 React 应用程序中使用的 API 方法:
export const signIn = data => {
return post('/api/account/sign_in/', data)
}
最初打包在 React 应用程序本身中的数据就像一个具有字符串值的对象一样简单:
{
email: 'email@email.com',
password: 'password
}
我查看了这些问题并发现它们名义上有用,但我无法想出为自己综合一个答案,考虑到我认为是 Django 的一些复杂性:
- Change a jquery ajax POST request into a fetch api POST
- Convert JavaScript object into URI-encoded string
- Is there a better way to convert a JSON packet into a query string?
谢谢!
您必须设置适当的 X-Requested-With
header。 jQuery 这样做 under the hood。
X-Requested-With: XMLHttpRequest
所以,在你的例子中,你会想要这样的东西:
const setUpCsrfToken = () => {
const csrftoken = Cookies.get('csrftoken')
return function post (url, options) {
const defaults = {
'method': 'POST',
'credentials': 'include',
'headers': new Headers({
'X-CSRFToken': csrftoken,
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
})
}
const merged = merge(options, defaults)
return fetch(url, merged)
}
}
我正在尝试从 React/Redux/Django 网络应用程序中删除 jQuery,并将 $.ajax
方法替换为 Fetch API。我的所有 GET 请求都或多或少地工作正常,而且我似乎能够达到我的 POST 请求,但我似乎无法以实际获得我的 POST 的方式格式化我的请求] 数据到 Django request.POST
对象。每次我点击 /sign_in 视图时, request.POST
对象都是空的。我的整个应用程序的后端是围绕使用 Django 表单构建的(没有 Django 模板,只有 React 控制的组件),我真的不想重写我所有的视图来使用 request.body
或 request.data
.
这是我认为相关的所有代码,如果还有更多有用的代码,请告诉我:
这是我用来构建完整 POST 数据并附加 CSRF 令牌的柯里化函数:
const setUpCsrfToken = () => {
const csrftoken = Cookies.get('csrftoken')
return function post (url, options) {
const defaults = {
'method': 'POST',
'credentials': 'include',
'headers': {
'X-CSRFToken': csrftoken,
'Content-Type': 'application/x-www-form-urlencoded'
}
}
const merged = merge(options, defaults)
return fetch(url, merged)
}
}
export const post = setUpCsrfToken()
这是我在 React 应用程序中使用的 API 方法:
export const signIn = data => {
return post('/api/account/sign_in/', data)
}
最初打包在 React 应用程序本身中的数据就像一个具有字符串值的对象一样简单:
{
email: 'email@email.com',
password: 'password
}
我查看了这些问题并发现它们名义上有用,但我无法想出为自己综合一个答案,考虑到我认为是 Django 的一些复杂性:
- Change a jquery ajax POST request into a fetch api POST
- Convert JavaScript object into URI-encoded string
- Is there a better way to convert a JSON packet into a query string?
谢谢!
您必须设置适当的 X-Requested-With
header。 jQuery 这样做 under the hood。
X-Requested-With: XMLHttpRequest
所以,在你的例子中,你会想要这样的东西:
const setUpCsrfToken = () => {
const csrftoken = Cookies.get('csrftoken')
return function post (url, options) {
const defaults = {
'method': 'POST',
'credentials': 'include',
'headers': new Headers({
'X-CSRFToken': csrftoken,
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
})
}
const merged = merge(options, defaults)
return fetch(url, merged)
}
}