django - D3v5 和 Django Rest 框架
问题描述
我在使以下 AJAX 调用正常工作时遇到了一些麻烦。我正在使用 D3 版本 5 向 Django REST Framework (DRF) ModelViewSet(版本 3.x)视图发出以下 POST 请求。DRF 提供路径下的任务列表,/gander/tasks/
并允许通过 POST 到同一路径创建新任务。我相信我正在正确检索 CSRF 令牌,但我不确定我是否正确地制定了 POST。
d3.json("/gander/tasks/?format=json",
{method:"POST",
headers:{
"Content-type": "application/json; charset=UTF-8",
"X-CSRFToken" : Cookies.get('csrftoken') },
body:JSON.stringify({
"parent": null,
"name" : "",
"time" : null}),
})
.then(json => {console.log(json);})
.catch(error => {console.log(error);});
我浏览了 Django AJAX 文档、D3 示例和一堆 SO Questions,但它们都引用了 D3-Request 接口,我找不到使用上述较新的 D3-Fetch API 的任何示例。
解决方案
感谢@dkarchmer,我想我需要更多关于服务器端的信息。下面的 mixin 对于显示接收和传输的数据非常有用。
class AjaxLoggingMixin(object):
def finalize_response(self, request, response, *args, **kwargs):
print(request.data)
print(response.data)
return super().finalize_response(request, response, *args, **kwargs)
事实证明,请求是正确通过的,但格式不正确,Django 拒绝它们返回 4XX 错误代码。尤其是
当用户未通过身份验证或未正确设置用户身份验证时,将出现 403 错误。
数据格式错误时会产生 400 个结果。
推荐阅读
- facebook - Firebase Facebook 身份验证:格式错误或过期的身份验证凭据
- php - 无法从会话设置电子邮件变量,因此 mail() 函数正常工作
- java - 如何使用 IF 条件比较 Flutter (dart) 中的两个 DateTime 值?
- amazon-web-services - 如何使用 terraform 向现有 EC2 实例添加新的安全规则
- android - 以编程方式在 SD 卡中的 Android 锁定文件夹
- angular - Angular 7 组件交互设计
- django - 响应 django 的前端,无需任何其他 api 调用
- codeigniter - Codeigniter - 多个数据库前缀
- image-processing - ImageMagick:用白色替换 RGB 通道,保留 Alpha
- reactjs - 在 React Redux 中与容器组件等效的 Hooks