【问题标题】:Can Django/Javascript handle conditional "Ajax" responses to HTTP POST requests?Django/Javascript 可以处理对 HTTP POST 请求的条件“Ajax”响应吗?
【发布时间】:2010-12-03 10:05:58
【问题描述】:

如何设计一个 Django/Javascript 应用程序来提供对常规 HTTP 请求的条件 Ajax 响应?

在服务器上,我有一个定制的 Form 对象。当浏览器 POST 表单的数据时,服务器会根据现有数据和规则检查提交的数据(例如,如果表单将某个实体添加到数据库中,该实体是否已经存在于数据库中?)。如果数据通过,服务器保存,生成一个 ID 号并将其添加到表单的数据中,并将表单和数据传递回浏览器。

if request.method == 'POST':
    formClass = form_code.getCustomForm()
    thisForm = formClass(data=request.POST)
    if thisForm.isvalid():
        saveCheck = thisForm.saveData()
        t = loader.get_template("CustomerForm.html")
        c = Context({ 'expectedFormObj': thisForm })

(请注意,我的自定义逻辑检查在 saveData() 中,与 isvalid() 完成的 html 验证是分开的。)

到目前为止,标准 Django(我希望如此)。但是如果数据没有通过,我想向浏览器发送一条消息。我想 saveData() 可以将消息放入表单的属性中,并且模板可以检查该属性,将其数据嵌入为 javascript 变量并包含一个 javascript 函数来显示消息。但是将所有表单 html 传回来,只是为了添加一条消息,似乎不优雅(标准 Django 表单提交过程也是如此,但没关系)。在这种情况下,我只想回传消息。

现在我想我可以将 Javascript 函数绑定到 html 表单的 onsubmit 事件,并让该问题发出一个 XMLHttpRequest,并让服务器根据 saveData() 调用的输出来响应它。但随后浏览器对服务器有两个未完成的请求(POST 和 XHR)。也许成功的 saveData() 会重写整个页面并消除任何潜在的冲突。但我还必须让服务器对其对 XHR 的响应进行排序,以遵循对 POST 的响应,并弄清楚如何将 saveData 结果传递给对 XHR 的响应。我想这是可行的,即使没有我不知道的线程编程,但它看起来很乱。

我推测我可能会使用 javascript 使浏览器的响应以响应 POST 请求中的某些内容为条件(要么重写整个页面,要么只显示一条消息)。但我怀疑页面的 javascript 会通过 POST 请求控制浏览器,并且对 POST 的任何响应只会重写页面。

那么我是否可以设计一个流程以仅在服务器端 saveData() 有效时才传回整个表单,并且如果 saveData() 无效则显示一条消息而不重写整个表单?如果有,怎么做?

【问题讨论】:

    标签: javascript python ajax django


    【解决方案1】:

    虽然您可以安排您的视图检查请求数据以确定响应应该是 AJAXish 还是纯 HTML,但我并不推荐这样做。将 AJAX 请求处理程序放在一个单独的 URL 结构中,例如,所有常规 html 视图都有像 /foo/bar 这样的 URL,而对相同信息的相应 api 调用将是 /ajax/foo/bar。

    由于大多数视图会检查请求数据,然后进行一些处理,然后创建一个 Python 字典并将其传递给模板引擎,因此您可以将通用部分分解出来以使这更容易一些。前几个步骤可能是一种仅返回 python 字典的通用函数,然后通过将处理函数包装在模板渲染器或 json 编码器中来组成实际响应。

    我通常的工作流程是最初假设客户端没有 javascript(这仍然是一个有效的假设;许多移动浏览器没有 JS)并将应用程序实现为静态 GETPOST 处理程序。从那里我开始寻找我的应用程序可以从一些客户端脚本中受益的地方。例如,我通常会重新设计表单以通过 AJAX 类型调用提交而无需重新加载页面。这些不会将它们的请求发送到与纯 html 表单版本相同的 URL/django 视图,因为响应需要是纯文本或 html 片段中的简单成功消息。

    同样,从服务器获取数据也被重新设计为响应一个简洁的 JSoN 文档,该文档被处理到客户端的页面中。这也将是一个单独的 URL/django 视图,作为该资源的相应纯 html。

    【讨论】:

    • 谢谢——正如我发布的那样,整个事情听起来是个坏主意。两个问题。 1)我只是一个鸡蛋,不要去摸索“API调用”。这是否指的是 Ajax 函数的调用? 2)据我了解,第二段,服务器将重新发送表单的所有 html,并酌情附加一些位。是吗?
    【解决方案2】:

    在处理 AJAX 时,我使用这个:

    from django.utils import simplejson
    ...
    status = simplejson.dumps({'status': "success"})
    return HttpResponse(status, mimetype="application/json")
    

    那么,AJAX(jQuery)就可以根据'status'的返回值做自己想做的事了。

    关于表单,我不确定您到底想要什么。如果您想要更轻松、更好的表单体验,我建议您查看uni-formPinax 在他们的投票应用程序中很好地实现了这一点。

    【讨论】:

      【解决方案3】:

      仅供参考,这不是答案...但它可能会帮助您以不同的方式思考它

      这是我遇到的问题...Google App Engine + jQuery Ajax = 405 Method Not Allowed

      所以基本上我可以使用概述的代码来工作,然后我无法发出 AJAX 请求:(。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-19
        • 2012-11-01
        • 2010-12-08
        • 2011-02-23
        • 2011-03-16
        • 2020-11-17
        • 2014-03-25
        • 1970-01-01
        相关资源
        最近更新 更多