【问题标题】:Correct approach of rendering page depending on Javascript data根据 Javascript 数据呈现页面的正确方法
【发布时间】:2014-07-20 21:26:34
【问题描述】:

我正在使用谷歌应用引擎来创建一个测试应用。

我有一个呈现初始网页的处理程序,其中包括一个按钮。当我点击按钮时,我想发回一些信息,所以我使用如下请求:

var request = { "myData": {
        "key1": value,
        "key2": value
        } };
$.ajax({
    url: '/my_handler',
    type: 'GET',
    data: JSON.stringify(request),
    contentType: 'application/json',
    success: successFunc,
    error: errorFunc  
});

然后我像这样在myHandler 中获取数据:

class MyHandler(webapp2.RequestHandler):
    def get(self):
        logging.info(self.request)

现在我希望根据该数据呈现不同的页面。 但是,如果我尝试在MyHandler 中调用self.response.write("something"),它(逻辑上)不会在网页中呈现它,而是在successFunc(response) 中返回它。

如何将控制权交还给 python 以呈现我的模板?

用 Python 和 Javascript 控制我的网页的外观感觉有点奇怪。
我的方法完全错误吗?

【问题讨论】:

    标签: javascript python google-app-engine jinja2


    【解决方案1】:

    通常有两种方法可以控制页面的呈现方式:

    1. 旧的、传统的服务器端方法是将 URL 与每个视图相关联,并让服务器在将 HTML 发送到浏览器之前计算 HTML。这就是 Python 可以提供帮助的地方。在这种情况下,对 HTML 的任何更改都需要更改或刷新页面。

    2. 客户端方式,即使用静态 HTML 和 JS 文件,然后向服务器发送 AJAX 请求以获取信息或执行客户端无法完成的计算。在这种情况下,Python 代码只提供 AJAX 请求的答案(通常以 JSON 格式),然后 Javascript 决定如何处理该答案,例如添加按钮、删除图像等。

    当然,这两种方法可以同时使用,例如使用 Python 代码预渲染页面,然后使用一些 javascript+AJAX 使页面更具动态性。

    在你的情况下,你有这两种选择:

    • 将逻辑保存在服务器上,使用 Python。这意味着您必须放弃 AJAX,而是将用户重定向到 Python 能够为其生成正确 HTML 代码的新页面。您可以使用以下代码在 javascript 中执行此操作:

      window.location.href = "/mypage?myparams=myvalues";

    • 保留 AJAX,因为您希望用户停留在当前页面中。在这种情况下,请查看 jQuery 等 javascript 框架如何帮助您操作页面以更新您想要的任何内容。作为中间步骤,您可以在 Python 中生成一些部分 html(如 <div>),在 AJAX 响应中返回它,然后让 jQuery 将其插入页面中。 Here is a documentation on how you can use jQuery to update the page.

    【讨论】:

    • 谢谢,这正是我想要的。那么,先用python渲染一个模板,然后用javascript来操作,这不是“皱眉头”吗?
    • 在您的情况下,我认为您不需要任何 javascript。一个带有 key1 和 key2 的简单 HTML 表单以及按钮将用于发布数据,从而生成一个新页面。此处示例:developers.google.com/appengine/docs/python/…
    • @voscausa 是的,你是对的,我在这里使用了一个简化的例子。实际使用类似于通过 javascript 获取地理定位并将该数据传回。
    • 这点倒是不挑剔,但在关注点分离方面有点奇怪:对于给定的区域,如果你的页面,HTML会由python和JavaScript代码生成,这可以使开发更难。
    【解决方案2】:

    如果你想让 Python 渲染一个新页面,为什么要使用 ajax。如果您在没有 ajax 的情况下发布数据,则不必处理 ajax 响应并收到新页面。

    但是如果你想使用ajax发送数据,你可以在浏览器中处理完ajax响应后得到新渲染的页面。一种重定向。 <url_to_get> 可以是 ajax 响应的一部分:

    使用以下方法更新您的 succesFunc:

    top.location.href="<url_to_get>";
    

    window.location.href = "<url_to_get>";
    

    如果你想更新页面的状态,Ajax 是有意义的。

    【讨论】:

    • 谢谢,我也会尝试不使用 ajax。我对 Web 开发非常陌生,我看到每个人都使用 ajax,说实话,我什至没有考虑过以不同的方式执行请求。
    【解决方案3】:

    要从应用程序可靠地获取 JSON 负载到浏览器,您需要设置内容类型。尝试添加

    self.response.headers['Content-Type'] = 'application/json'
    

    在你做write之前。

    【讨论】:

    • 谢谢。那么当我调用self.response.write时,需要传递JSON数据吗?理想情况下,我想在我的处理程序中做类似template = JINJA_ENVIRONMENT.get_template('page_to_render_based_on_js_data.html') self.response.write(template.render()) 的事情。这可能吗?
    • 我从你的问题中假设你想传递 JSON 数据,所以如果你将 Content-Type 设置为 application/json,那么是的,将一个序列化的 JSON 对象传递给write。您可以从模板构造 JSON 数据,但这是一种不必要的困难方式。但如果你想这样做,我建议使用 .json 扩展名命名你的模板,只是为了让你自己更轻松。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多