Python Django:使用Fetch/Post将JSON保存到数据库

Python Django:使用Fetch/Post将JSON保存到数据库,python,json,django,python-3.x,fetch,Python,Json,Django,Python 3.x,Fetch,在Django应用程序中,我想使用fetch/postapi将JSON保存到数据库中。两个问题:(1)我有CSRF验证问题,(2)我不确定是否使用POST来修改数据库 我有一个模型“Job”,其中一个字段应该包含JSON class Job(models.Model): job_id = models.IntegerField() setup_json = models.CharField(max_length=100000, blank=True, null=True) JS

在Django应用程序中,我想使用fetch/postapi将JSON保存到数据库中。两个问题:(1)我有CSRF验证问题,(2)我不确定是否使用POST来修改数据库

我有一个模型“Job”,其中一个字段应该包含JSON

class Job(models.Model):
    job_id = models.IntegerField()
    setup_json = models.CharField(max_length=100000, blank=True, null=True)
JSON是通过页面上的用户交互生成的。当按下“保存”按钮时,我想将JSON写入正确作业的
setup\u JSON
字段

我不想使用表单,因为JSON存储在JavaScript中,而不是写在页面的任何地方。所以我直接使用CSRF令牌,如下所示:

{% csrf_token %}
<script type="text/javascript">
  const csrftoken = document.getElementsByName("csrfmiddlewaretoken")[0].value;
</script>
function onPressSave() {
  fetch(`webapp/api/save-json/${jobId}`, {
    method: "POST",
    headers: {
      "X-Requested-With": "XMLHttpRequest",
      "X-CSRF-Token": csrftoken,
      "Content-Type": "application/json; charset=utf-8",
      Accept: "application/json"
    },
    credentials: "same-origin",
    body: JSON.stringify("test json")
  });
}
def save_json(request, id):
    j = Job.objects.get(job_id=id)
    j.setup_json = json.dumps(dict(name="testing"))
    return HttpResponse("OK")
我在控制台中得到一个“POST 403(禁止)”错误。在此方面的任何帮助都将不胜感激

我也有点不确定接收函数应该是什么样子。现在看起来就像这样:

{% csrf_token %}
<script type="text/javascript">
  const csrftoken = document.getElementsByName("csrfmiddlewaretoken")[0].value;
</script>
function onPressSave() {
  fetch(`webapp/api/save-json/${jobId}`, {
    method: "POST",
    headers: {
      "X-Requested-With": "XMLHttpRequest",
      "X-CSRF-Token": csrftoken,
      "Content-Type": "application/json; charset=utf-8",
      Accept: "application/json"
    },
    credentials: "same-origin",
    body: JSON.stringify("test json")
  });
}
def save_json(request, id):
    j = Job.objects.get(job_id=id)
    j.setup_json = json.dumps(dict(name="testing"))
    return HttpResponse("OK")

我最终希望从POST请求中检索到正确的JSON,但我使用此功能的方向是否正确?

Django ORM支持各种数据库的JSonfield,例如,如果您使用的是mySQL后端,您可以:

来自django_mysql.models导入JSONField的

setup_json=JSONField(null=True)
或使用PostGreSQL:

从django.contrib.postgres.fields导入JSONField
setup_json=JSONField(null=True)
然后使用保存功能,您可以:

def save_json(请求,id):
#您想要保存的json,通常是python dict{},或dict[{},{},…]列表
json_to_be_saved={}
j=Job.objects.get(Job\u id=id)
j、 setup\u json=json\u要保存
j、 保存()
返回HttpResponse(“确定”)
关于403,可能是您的设置文件中没有:

CORS\u ORIGIN\u ALLOW\u ALL=True
中间件=[

“corsheaders.middleware.corsmidleware”,#Django ORM支持各种数据库的JSonfield,例如,如果您使用的是mySQL后端,您可以:

来自django_mysql.models导入JSONField的

setup_json=JSONField(null=True)
或使用PostGreSQL:

从django.contrib.postgres.fields导入JSONField
setup_json=JSONField(null=True)
然后使用保存功能,您可以:

def save_json(请求,id):
#您想要保存的json,通常是python dict{},或dict[{},{},…]列表
json_to_be_saved={}
j=Job.objects.get(Job\u id=id)
j、 setup\u json=json\u要保存
j、 保存()
返回HttpResponse(“确定”)
关于403,可能是您的设置文件中没有:

CORS\u ORIGIN\u ALLOW\u ALL=True
中间件=[

“corsheaders.middleware.corsmidleware”,这是我很久以前做的事情:

$.ajax({
   type: 'POST',
   data: JSON.stringify(data),
   contentType: 'application/json',
   url: "{% url 'login_verification_view' %}",
   headers: {
       'X-CSRFToken': '{{ csrf_token }}'
   },
   success: function(j) {
       ...
       your code
   }

这是我很久以前做的事情:

$.ajax({
   type: 'POST',
   data: JSON.stringify(data),
   contentType: 'application/json',
   url: "{% url 'login_verification_view' %}",
   headers: {
       'X-CSRFToken': '{{ csrf_token }}'
   },
   success: function(j) {
       ...
       your code
   }

谢谢你的回复!我确实安装了django cors头文件。有了这样一个函数,是否有必要执行POST请求?或者GET也可以?除了使用几乎需要使用POST的rest框架之外,我从未使用过django,因为你可以通过
request.data.GET(“key”)直接获取字典/json,无)
。唯一的其他方法是在url中设置一个字符串,并使用
请求获取它。query_params.get(“key”,None)
,这将公开所有数据,因为url不安全,而数据是安全的,只要您使用https。希望这有帮助。我使用react(+axios)对于前端的东西,向drf发出请求似乎比您当前的代码简单得多,因此无法在js部分提供帮助。谢谢您的回复!我确实安装了django cors头文件。有了这样的功能,是否需要执行POST请求?或者GET也可以?除了u在几乎需要使用POST的地方使用它的rest框架,因为您可以通过
request.data.get(“key”,None)
直接获取字典/json。唯一的其他方法是在url中设置一个字符串,然后通过
request.query\u params.get(“key”,None)获取它
,这将公开所有数据,因为url不安全,而如果您使用https,则数据是安全的。希望有帮助。我使用react(+axios)对于前端,向drf发出请求似乎比您当前的代码简单得多,因此无法在js部分提供帮助。这对我来说似乎是可行的。我宁愿使用fetch,所以不必加载JQuery。知道如何适应这种技术吗?我没有使用fetch,您的代码似乎也可以,请检查变量csrf令牌-是否为空字符串?同时打印请求-打印(请求)的输出通过临时设置csrf_emption以供查看并查找CSRFToken,我发现了问题。我使用的是标题
X-csrf-Token
,而不是
X-CSRFToken
。感谢您的帮助!啊,我明白了,快乐编程这似乎对我有用。我宁愿使用fetch,所以我不必加载JQuery。知道如何适应这种技术吗?我还没有使用fetch,您的代码似乎也可以,检查变量csrftoken-是否为空字符串?,同时打印request-print(request)的输出通过临时设置csrf_emption以供查看并查找CSRFToken,我发现了问题。我使用的是标题
X-csrf-Token
,而不是
X-CSRFToken
。感谢您的帮助!啊,我明白了,编程愉快