【问题标题】:Getting a JSON Response from the Django从 Django 获取 JSON 响应
【发布时间】:2017-06-18 14:47:57
【问题描述】:

编辑: 如所问,我想要获得的东西如下:

使用模板中的文件进行POST --> 视图中的文件处理,生成一个id --> id 显示在模板中

我是 Django 新手,我正在尝试让服务器向同一页面发送具有特定编号的响应。它当前以 ValueError 响应,并且模板没有得到响应。这是我的代码。

views.py

def index(request):
dB = LegacyDatabase()
ints = None
if request.POST:
    form = UploadFileForm(request.POST, request.FILES)
    if form.is_valid():
        files = Upload(model=request.FILES['file_upload'])
        try:
            ints = dBconnection(dB, request.FILES['file_upload'].name)
        except IntegrityError:
            ints = dBGetExistingValue(dB, request.FILES['file_upload'].name)
        files.save()
        a = []
        a.append(["sessionid", ints])
        sess= dict(a)

        return JsonResponse(sess)
return render(request, "main/index.html")

urls.py 从 django.conf.urls 导入 url

from phast.views import index

urlpatterns = [
  url(r'^$', index, name='main'),
]

index.html

   <form method="post" class = "sessionid">
    <input type="text" id = "demo" readonly>
  </form>
  <script>

    var xhttp = new XMLHttpRequest();
      xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
      console.log(JSON.parse(xhttp.responseText));
      }
    };
  </script>

 <form class="dropzone" id="mydropzone" enctype="multipart/form-data">  {% csrf_token %} </form>

创建拖放区

var myDropzone = new Dropzone("#mydropzone", {
  url : '{% url phast.views.index %}'
});

你能帮帮我吗?

编辑: 如题,这是开发服务器返回的错误。

Internal Server Error: /
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/rubinhus/Development/django/phastload/phast/views.py", line 66, in index
    return render(request, "main/index.html", JsonResponse(sess))
  File "/usr/local/lib/python2.7/dist-packages/django/shortcuts.py", line 30, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/usr/local/lib/python2.7/dist-packages/django/template/loader.py", line 68, in render_to_string
    return template.render(context, request)
  File "/usr/local/lib/python2.7/dist-packages/django/template/backends/django.py", line 64, in render
    context = make_context(context, request, autoescape=self.backend.engine.autoescape)
  File "/usr/local/lib/python2.7/dist-packages/django/template/context.py", line 267, in make_context
    context.push(original_context)
  File "/usr/local/lib/python2.7/dist-packages/django/template/context.py", line 59, in push
    return ContextDict(self, *dicts, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/template/context.py", line 18, in __init__
    super(ContextDict, self).__init__(*args, **kwargs)
ValueError: dictionary update sequence element #0 has length 19; 2 is required

【问题讨论】:

  • 如果您遇到错误,您应该发布它以及完整的回溯。
  • 不过我很想知道您为什么认为 POST 数据中会有一个名为“file_upload”的字段。
  • 这是模板中 Dropzone 的名称。我的想法是POST数据引用了上传的文件,如果这不正确,你能解释一下吗?无论哪种方式都发布了回溯
  • 什么“Dropzone”?这是你第一次提到它。另请注意,回溯的第 10 行显示错误发生在 不同 代码中,而不是您发布的代码。如果您不显示实际代码,我们将无法帮助您。
  • webapp 应该从 dropzone 获取文件,将其上传到服务器,然后视图将处理文件名,在数据库中输入文件名和 id,它应该以json 响应 id。现在错误是正确的。感谢您在问题结构中的输入,我是新手。

标签: python json django dropzone.js


【解决方案1】:

就我所见:

在views.py的第66行回溯说:

return render(request, "main/index.html", JsonResponse(sess))

这是你代码的最后一行,其余的都是 django 内置的。所以你应该专注于这条线。

我的方法是检查 views.py 的第 66 行并调试那里发生的事情。如果您在views.py 的第66 行中没有看到类似的代码,我敢打赌您还没有重新启动您的django 进程。你是如何运行服务器的?如果有任何进程正在监督它重新启动该进程。

编辑

Template Context Django docs

如果提供了上下文,它必须是一个字典。如果未提供,引擎将使用空上下文渲染模板。

您向它提供了JsonResponse。它是一个响应,其中将包含请求的状态代码,headers d body。

所以用render(request, "main/index.html", context=sess) 替换return JsonResponse(sess) 应该可以工作。

【讨论】:

  • 谢谢。我已经根据其他评论的反馈编辑了代码。现在是正确的,但是模板没有收到响应
  • 我不明白您在模板的哪个部分没有收到回复。也许你应该重组你的问题以增加更多的特异性。您是否尝试实现以下目标:GET 请求 --> 模板 --> 显示空表单 POST 请求 --> 模板 --> 显示发布的数据
  • 我已经编辑了帖子,请看看现在是否清楚。
  • 然后将if request.POST 替换为if request.method == 'POST'。然后在 if 循环内的 return 中用 return render(request, "main/index.html", context=sess) 替换 return JsonResponse(sess)。检查我编辑的答案。
猜你喜欢
  • 2022-06-28
  • 2019-04-04
  • 1970-01-01
  • 2018-05-31
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2011-06-15
相关资源
最近更新 更多