簡體   English   中英

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

[英]How can I make 'AJAX templates' in Pylons?

我最近進入Pylons,想知道如何才能輕松地將AJAX功能集成到我的網站中。

基本上,可以說我有一個登錄表單,通常可以通過site.com/user/login訪問。 現在,通常將通過以下方式處理:

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

login.html是繼承基礎的模板,具有頁眉,頁腳和導航側欄。 一個簡單的網站。

我該如何AJAXify? 我將需要創建兩個login.html模板,對嗎? 什么是處理控制器的login()方法的好方法? 我是否應該設置類似&ajax=true的GET變量,然后在發出render()時檢查該變量?

我想要一種不錯的方法來選擇控制器呈現內容的方式,而不是一些難看的技巧(例如上面的GET方法)。

思考?

所有現代Javascript庫在其AJAX包裝器中都設置了“ X-Requested-With:XMLHttpRequest”標頭。 為了方便起見,如果Pylons找到了此標頭,則將其設置為request.is_xhr布爾值。

由於<%inherit>是如何處理的 ,因此在Mako中,條件繼承有點棘手,但是您可以執行以下操作:

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

  2. 在模板中,使用模板繼承將AJAX模板中不需要的所有內容分離出來。

  3. 使用類似這樣的<%inherit>: <%inherit file="${None if context.get('ajax') else 'login_base.html'}"/>

(注意:所使用的render()語法沒有什么特別的。您可以輕松地使用c.ajax = request.is_xhrcontext.get('c').ajax

我不確定您的AJAX代碼為什么在該login頁面上執行GET - GET僅用於獲取信息,JS客戶端希望從登錄表單中獲取哪些信息?

無論如何,假設有一些頁面您希望AJAX代碼能夠獲取以便獲得有用的信息,我建議使用查詢字符串,例如?format=json以允許此類請求明確要求“僅有用的JSON格式的信息,請不要裝飾”。

這種方法不僅使您的應用程序知道這是一個自動請求(AJAX還是其他,誰在乎?要點是, 沒有化妝品會作為響應發送, 只是有用的信息!),而且特別是請求的格式為JSON(因此,如果您想提供XML或其他替代方法,則有一條明顯的增長之路- ?format=xml等)。

在這方面,沒有什么特別的Python特有的東西,更不用說Pylons了,這是我建議任何“混合”站點使用的方法(至少在某些頁面中,可以以多種格式響應,例如HTML和裝飾或JSON(由客戶選擇),無論它計划使用哪種服務器端語言。

但是,如果您的呈現始終是諸如somefunction(sometemplate, somecontext)之類的形式,則可以進行調整以確保somefunction也能獲得關於請求格式的關鍵信息-如果請求的格式是JSON(或者,誰知道,將來可能是XML或其他任何東西),則somefunction知道它可以忽略模板(畢竟是或應該是純視圖相關的功能,因此應該僅具有演示內容),然后繼續將上下文中的信息呈現為JSON等。

Mako的作者本人寫了一篇博客文章 ,您可能會覺得有趣。
要點是呈現模板的單個“ 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM