如何在Pylons中制作“AJAX模板”?

时间:2010-08-02 05:15:06

标签: javascript python ajax pylons

我最近一直在进入Pylons,并想知道如何轻松地将AJAX功能集成到我的网站中。

基本上,假设我有一个登录表单,通常可以通过site.com/user/login访问。现在,一般来说,这将通过以下方式处理:

class UserController(BaseController):
   def login(self):
      render('/login.html')

login.html将是一个继承基础的模板,具有页眉,页脚和导航侧边栏。一个简洁的网站。

我怎么能AJAX化这个?我需要创建两个login.html模板,对吗?处理控制器的login()方法有什么好办法?我应该设置类似&ajax=true之类的GET变量,然后在发出render()时检查它吗?

我想要一个漂亮而干净的方式来选择我的控制器如何呈现内容而不是一些丑陋的黑客(如上面的GET方法)。

思想?

3 个答案:

答案 0 :(得分:3)

所有现代Javascript库在其AJAX包装器中设置“X-Requested-With:XMLHttpRequest”标头。为方便起见,如果Pylons找到此标题,则设置request.is_xhr布尔值。

由于how <%inherit> is handled,有条件的继承在Mako中有点棘手,但这就是你所做的:

  1. 将控制器中的render()调用更改为render('/login.html', {'ajax': request.is_xhr})

  2. 在您的模板中,使用template inheritance将您不想要的任何内容分离到AJAX模板中。

  3. 使用&lt;%inherit&gt;这样的事情: <%inherit file="${None if context.get('ajax') else 'login_base.html'}"/>

  4. (注意:使用的render()语法没有什么特别之处。您可以轻松使用c.ajax = request.is_xhrcontext.get('c').ajax来代替

答案 1 :(得分:2)

我不确定为什么你的AJAX代码想要GET页面上做login - GET只是为了获取信息,以及会有什么信息JS代码客户端想从登录表单中获取?

无论如何,假设页面,您希望AJAX代码能够获取以获取有用信息,我建议使用?format=json之类的查询字符串来允许此类请求明确要求“只有有用的JSON格式信息,请不要装饰”。

这种方法不仅允许您的应用知道这是一个自动请求(AJAX或其他,谁在乎?点是,没有化妆品将作为响应发送,只是有用的信息!)但具体而言,请求的格式是JSON(因此,如果您想要提供XML或其他任何替代方案,那么就会有明显的增长路径 - ?format=xml等)。 / p>

没有什么特别针对Python的,更不用说特定于Pylons了 - 这是我建议的任何“混合”网站的方法(能够,至少在某些页面中,能够以多种格式进行响应,例如,无论客户选择使用哪种服务器端语言,都可以选择带有装饰或JSON的HTML。

如果您的渲染始终采用somefunction(sometemplate, somecontext)之类的形式,那么您可以调整一些内容以确保somefunction也获得关于请求格式的关键位 - 如果请求的格式是JSON (或者,谁知道,将来可能是XML或其他什么)然后somefunction知道它可以忽略模板(毕竟它是或应该是纯粹的视图相关功能,因此应该只有演示文稿内容),然后继续将上下文中的信息呈现为JSON或其他。

答案 2 :(得分:1)

Mako的作者自己写了一篇你可能感兴趣的blog post 重点是渲染模板的单个“def”的函数:

def render_def(template_name, name, **kwargs):
    from pylons.templating import pylons_globals
    globs = pylons_globals()

    if kwargs:
        globs = globs.copy()
        globs.update(kwargs)

    template = globs['app_globals'].mako_lookup.get_template(template_name).get_def(name)
    return template.render(**globs)