如何使用ajax调用金字塔视图

时间:2014-06-12 21:41:42

标签: jquery pyramid

我有一些金字塔代码在锚标记的'href ='部分使用'request.route_path()'在我的网页上打开一个幻灯片。在视图处理程序中,我检查了'request.is_xhr',它调用了'render_to_response()',因此我可以适当地更改我的渲染器。通过request.route_path()访问视图时,这可以正常工作。

我现在需要稍微改变功能,所以我可以先通过jQuery检查用户是否在移动设备上。所以'href ='现在调用一个javascript函数,然后使用Ajax访问视图处理程序。基本上,我有request.route_path('slide_in',arg1 = data,arg2 = data2),现在有一个ajax调用,其中url是'/ slide_in / data / data2'。这看起来像调用视图处理程序并且request.is_xhr检查设置为True,因为它应该是。我遇到的问题是对render_to_response()的调用不会失败,但似乎也没有做任何事情,因为我在使用Ajax时最终得到一个空白页面。它适用于原始的'request.route_path()'。

有没有人知道为什么会这样?标头和所有内容在两种情况下都是相同的,并且请求对象是有效的,但Ajax发起的调用会导致空白页。感谢您的任何想法,因为我是新手,并尝试了很多不同的想法,但我很困惑。

1 个答案:

答案 0 :(得分:0)

看一下我的almost rant-like answer to this question。 Point is - 您的应用程序生成一个文本blob,其中包含request.route_path()的输出,它只是一个字符串。 JavaScript无法判断该字符串是否是由某个函数生成的。

网址由request.route_path()生成或只是手动输入的事实绝对不会对该网址调用的金字塔视图的行为产生任何影响 - 除非URL实际上是不同的。通过比较这些URL可以轻松检查。

一些建议:

  • Pyramid有一个xhr view predicate,可以让您避免进行手动检查和render_to_response - 相反,您可以使用不同的渲染器创建两个独立的函数。

    @view_config(..., xhr=True, renderer='json')
    def serve_json(...):
        ...
        return {"hello": "world"}
    
    @view_config(..., xhr=False, renderer='mytemplate.mak')
    def serve_html(...):
        ...
        return {"hello": "world"}
    
  • 有一个很好的user-agents Python库可以让你在Python中进行检查,所以也许你根本不需要那个Ajax。您甚至可以使用该库创建自定义视图谓词。