Python 金字塔和变色龙中的ajax小部件

Python 金字塔和变色龙中的ajax小部件,python,ajax,pyramid,chameleon,template-tal,Python,Ajax,Pyramid,Chameleon,Template Tal,我希望能够在服务器端轻松创建由变色龙和金字塔支持的ajax“小部件” 金字塔是否提供了任何管道代码,使编写小部件变得容易 我目前的方法是使用home.pt作为渲染器的主视图。home.pt使用宏base.pt,该宏定义页面结构并为home.pt提供要填充的插槽。base.pt还使用我编写的登录“widget”宏(请参阅下面的account\u login\u widget.pt) 从理论上讲,这一切听起来都很棒……我有一个可重用的登录小部件,可以在许多页面中使用,但我目前的方法效果不太好。“我的

我希望能够在服务器端轻松创建由变色龙和金字塔支持的ajax“小部件”

金字塔是否提供了任何管道代码,使编写小部件变得容易

我目前的方法是使用home.pt作为渲染器的主视图。home.pt使用宏base.pt,该宏定义页面结构并为home.pt提供要填充的插槽。base.pt还使用我编写的登录“widget”宏(请参阅下面的account\u login\u widget.pt)

从理论上讲,这一切听起来都很棒……我有一个可重用的登录小部件,可以在许多页面中使用,但我目前的方法效果不太好。“我的登录”小部件在其呈现程序(服务器需要定义)中使用类似${username}的变量。我希望登录小部件及其呈现尽可能独立。但是按照我目前的做法,home view代码需要了解登录小部件的需要,并在字典中提供用户名、formrender和其他变量。绝对不好

我觉得我接近正确的想法,但错过了一些东西

有什么想法吗

base.pt:

<html>
<head></head>
<body>
<div id="container">
    <div id="header">
        <span metal:use-macro="load: account_login_widget.pt"></span>     
    </div>
    <div id="middle">
        <span metal:define-slot="content"></span>
    </div>
    <div id="footer"></div>
</div>
</body>
</html>

home.pt:

<div metal:use-macro="load: base.pt">
<span metal:fill-slot="content">
    <div>my stuff</div>
</span>
</div>

我的东西
帐户\登录\小部件.pt:

<span metal:define-macro="account_login_widget">
<script type="text/javascript">
(function($) {
    $.fn.my_function = function() {
        $('#login_form').submit(function(e) {
            e.preventDefault();

            // ajax call
            $.post(some_url, some_data, function(response) {
                $('#account_login_widget').html(response);
            });
        };
        return this;
    };
})(jQuery);

// Define the entry point    
$(document).ready(function() {
    $(document).my_function();
});
</script>

<div id="account_login_widget">
<div id="login_bar" tal:condition="not username">
    ${form_renderer.begin(...)}
        ... my form ...
    ${form_renderer.end()}
    <span tal:condition="login_failed">Login failed</span>
    <div id="forgot_password_link"><a href="#">Forgot Password?</a></div>
    <div id="create_account_link"><a href="${signup_url}">Create Account</a></div>
</div>
<div tal:condition="username">
    Welcome <strong>${username}</strong>! <a href="${logout_url}">Logout</a>
</div>
</div>
</span>

(函数($){
$.fn.my_function=函数(){
$('login#u form')。提交(函数(e){
e、 预防默认值();
//ajax调用
$.post(一些url、一些数据、函数(响应){
$('#帐户_登录_小部件').html(响应);
});
};
归还这个;
};
})(jQuery);
//定义入口点
$(文档).ready(函数(){
$(文档).my_函数();
});
${form_renderer.begin(…)}
…我的表格。。。
${form_renderer.end()}
登录失败
欢迎${username}
处理此问题的一个好方法是将您的帐户登录小部件与其自己的视图相关联,如:

@view_config(name='login_widget',
             renderer='templates/account_login_widget.pt')
def login_widget(request):
    return {'username': ...}
然后,您应该能够访问并返回小部件的HTML

剩下要做的是调用视图并在模板中包含生成的HTML。也就是说,而不是:

<span metal:use-macro="load: account_login_widget.pt"></span>

完成。如果您需要,此方法也会有所帮助(重新)通过AJAX动态加载小部件。

我应该提到,我目前的想法是拥有一个所有视图都将扩展的BaseView类。在这个BaseView类中,我可以拥有一个add Widget方法,它将获取我的小部件视图对象,并将其所有变量依赖项添加到我的视图最终将返回的dict中。谢谢!这个策略听起来不错很好,让我走了很远。不过还有一两个问题。你的建议假设使用遍历吗?我正在使用url分派。我遇到的问题是,@view\u config'没有指定路由名称,因此找不到url:(这也意味着我的ajax帖子不起作用)。但是,当我在名称之外指定路由名称时,则调用render_view_to_response()无法解析为视图。似乎我只能在“@view\u config”中指定“name”或“route\u name”,但不能同时指定两者。这里出了什么问题?添加两个view\u配置似乎可以解决问题。组合谓词过于具体。但添加两个view\u配置似乎也很尴尬。@view\u config(name='account\u login\u widget',renderer='template/account\u login\u widget.pt')@view\u config(route\u name='account\u login\u widget',renderer='template/account\u login\u widget.pt')您是对的。我的答案的视图配置位(
@view\u config
)假设遍历。如果使用url分派,视图配置将有所不同。
<span tal:replace="structure render_view('login_widget')"></span>
from pyramid.events import subscriber
from pyramid.events import BeforeRender
from pyramid.view import render_view_to_response

@subscriber(BeforeRender)
def add_render_view_global(event):
    event['render_view'] = lambda name: render_view_to_response(context, request, name, secure).ubody