代码之家  ›  专栏  ›  技术社区  ›  Dustin Michels

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

  •  0
  • Dustin Michels  · 技术社区  · 7 年前

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

    我有一个模型“Job”,它的字段应该包含JSON。

    class Job(models.Model):
        job_id = models.IntegerField()
        setup_json = models.CharField(max_length=100000, blank=True, null=True)
    

    JSON是通过页面上的用户交互生成的。当按下“save”按钮时,我想将JSON写入 setup_json 合适工作的领域。

    我不想使用表单,因为JSON存储在JavaScript中,而不是写在页面的任何地方。所以我拿到了CSRF代币 from the template 直接使用,如:

    {% csrf_token %}
    <script type="text/javascript">
      const csrftoken = document.getElementsByName("csrfmiddlewaretoken")[0].value;
    </script>
    

    CSRF_USE_SESSIONS = True 为了使用这种技术。)

    然后我让save按钮调用这样的函数:

    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")
      });
    }
    

    控制台出现“POST 403(禁止)”错误。如果您能帮忙,我们将不胜感激!

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

    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,但是看起来我使用这个函数的方向正确吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   jupiar    7 年前

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

    from django_mysql.models import JSONField
    setup_json = JSONField(null=True)
    

    或者使用PostGreSQL:

    from django.contrib.postgres.fields import JSONField
    setup_json = JSONField(null=True)
    

    然后使用保存功能,您可以:

    def save_json(request, id):
        # The json you want to save, litterally a python dict {}, or list of dicts [{},{},...]
        json_to_be_saved = {}
        j = Job.objects.get(job_id=id)
        j.setup_json = json_to_be_saved
        j.save()
        return HttpResponse("OK")
    

    关于403,可能是您的设置文件中没有:

    CORS_ORIGIN_ALLOW_ALL = True
    
    MIDDLEWARE = [
        'corsheaders.middleware.CorsMiddleware', # <- Added in manually, must be at the top of this list
    

    这将需要您pip安装: pip3 install django-cors-headers

        2
  •  1
  •   Sanchit    7 年前

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

    $.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
       }