【问题标题】:django redirecting an ajax request but keeping it an "is_ajax"django 重定向 ajax 请求但将其保留为“is_ajax”
【发布时间】:2012-06-20 00:58:51
【问题描述】:

问题:我如何重定向到 django 中的页面,但将其“伪造”为 ajax 请求?

所以我有一个发布数据请求 - 通过 ajax (jQuery) 完成。这会发送到我的 django 服务器,它会添加数据(或删除数据!),然后以“干得好,您添加了一些数据”页面作为响应。

这个成功页面的开头是:

{% extends request.is_ajax|yesno:"base_ajax.htm,base.htm" %}

如果请求不是 ajax 请求,这是添加各种标头的好方法,如果是则忽略标头。我添加了这个,以便该网站在使用和不使用 javascript 的情况下都可以工作(我们还需要这样做吗?)

然后我添加了一个post-redirect-get(即视图的post部分不是return render_to_response而是return redirect('url here')

现在的问题是重定向忘记了初始请求是一个 ajax 请求。所以我总是最终将整个页面 - 标题和所有 - 加载到一个 div 中,这不是我想要的。

所以,我希望能够告诉重定向它应该伪装成一个 ajax 请求

我该怎么做?

更新:对于在“未来(使用喷气背包!)”中阅读此内容的任何人,重定向不会携带标头信息 - 请参阅 https://www.rfc-editor.org/rfc/rfc2616#section-7.1

最后,我做到了:

return redirect(self.success_redirect + '/' + str(int(request.is_ajax()))) 

然后,对于我重定向到的视图,我有:

url(r'^editStorySuccess/(?P<ajax>\d+)$',
    showAfterCheckingAjax,
    {
        'template':'stories/editStorySuccess.html'
    },
    'editStorySuccess'
),

在 showAfterCheckingAjax 视图中我刚刚拥有:

if int(ajax):
    request.META['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
return render_to_response(template, {'user':request.user}, 
    context_instance=RequestContext(request))

这对我有用!

【问题讨论】:

  • ajax 请求只是一个普通的 http 请求,加上浏览器插入的任何额外的标头以将其标记为 ajax。没有根本区别。添加这些标题,然后繁荣,它是“ajax”。
  • 如果您打算使用 Ajax 提交数据,使用 PRG 模式并不是很有用,因此您可能希望返回实际响应而不是重定向。

标签: python ajax django redirect


【解决方案1】:

从请求的回调方法中获取重定向 url 作为 json 数据,然后使用 JavaScript 从页面重定向。

【讨论】:

  • 这是一种非常的特殊方式。这意味着在某些情况下,我的 jQuery 代码现在正在检查其请求的响应并在其上调用重定向??这似乎是一种非常冗长的做事方式...... django 本身没有提供这样的工具?
  • +1 特别而不是我这样做的方式,但仍然是一个解决方案。甚至可能涉及更少的代码!
  • 实际上,我认为我错了。我认为不可能在 jQuery 中“捕获”正在处理的重定向...
  • @bharal 你没有得到它。你需要将 url 作为 JSON 数据发送,然后使用 JS/JQuery 解析它
  • ?所以jQuery发布数据,并接收一些json,然后根据json的内容从那里启动重定向?
【解决方案2】:

创建一个不同的 URL,该 URL 呈现与您现在重定向到的 URL 相同的视图,但带有一个额外的 GET 参数。您可以使用此 GET 参数来修改用于提供视图的模板。无论哪种方式,重定向都被视为一个新请求,因此您必须执行一些操作才能将此附加信息传递给此请求。

【讨论】:

    猜你喜欢
    • 2019-10-06
    • 2019-12-16
    • 2020-10-19
    • 2011-12-07
    • 2012-12-02
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多