gpt4 book ai didi

python - Pyramid 和变色龙中的 ajax 小部件

转载 作者:太空宇宙 更新时间:2023-11-03 13:04:38 25 4
gpt4 key购买 nike

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

Pyramid 是否提供任何使编写小部件变得容易的管道代码?

我目前的方法是我有一个主视图,它使用 home.pt 作为渲染器。 home.pt 使用宏 base.pt 来定义页面结构并为 home.pt 提供一个插槽来填充。 base.pt 还使用我编写的登录“小部件”宏(请参阅下面的 account_login_widget.pt)。

从理论上讲,这听起来不错...我有一个可重复使用的登录小部件,我可以在许多页面中使用它,但我目前的方法效果不佳。我的登录小部件在其渲染器(服务器需要定义)中使用类似 ${username} 的变量。我希望登录小部件及其呈现尽可能独立。但是按照我目前的做法,主页 View 代码需要了解登录小部件的需求,并在字典中提供用户名、表单渲染和其他变量。绝对不好...

我觉得我接近正确的想法,但遗漏了一些东西......

有什么想法吗?

基础.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>

主页.pt:

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

account_login_widget.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>

最佳答案

处理此问题的一个好方法是将您的 account_login_widget 与其自己的 View 相关联,例如:

@view_config(name='login_widget',
renderer='templates/account_login_widget.pt')
def login_widget(request):
return {'username': ...}

然后您应该能够访问 http://yourapp/login_widget并仅返回小部件的 HTML。

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

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

你会想要这样的东西:

<span tal:replace="structure render_view('login_widget')"></span>

render_view 但是在模板中不存在;你必须自己提供。最好为此使用“渲染前事件”:http://docs.pylonsproject.org/projects/pyramid/dev/narr/hooks.html#beforerender-event

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

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

关于python - Pyramid 和变色龙中的 ajax 小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8063012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com