根据Javascript数据呈现页面的正确方法

根据Javascript数据呈现页面的正确方法,javascript,python,google-app-engine,jinja2,Javascript,Python,Google App Engine,Jinja2,我正在使用谷歌应用程序引擎创建一个测试应用程序 我有一个处理程序来呈现初始网页,其中包括一个按钮。当我单击按钮时,我想发回一些信息,因此我使用如下请求: var request = { "myData": { "key1": value, "key2": value } }; $.ajax({ url: '/my_handler', type: 'GET', data: JSON.stringify(request),

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

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

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)
现在,我希望根据该数据呈现不同的页面。 但是,如果我尝试调用
self.response.write(“某物”)
inside
MyHandler
它(逻辑上)不会在网页中呈现,而是在
successFunc(response)
中返回它

如何将控制权交还给python来呈现模板

从Python和Javascript控制我的网页的外观感觉有点奇怪。

我的方法完全错了吗?

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

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

在执行
编写之前

如果希望Python呈现新页面,为什么要使用ajax呢。如果在没有ajax的情况下发布数据,则不必处理ajax响应,即可收到新页面

但是,如果希望使用ajax发送数据,可以在浏览器中处理ajax响应后获得新的呈现页面。一种重定向。
可以是ajax响应的一部分:

使用以下命令更新您的成功函数:

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

window.location.href=”“;

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

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

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

  • 客户端方法,即使用静态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(如
      ),在AJAX响应中返回,并让jQuery将其插入页面中


    谢谢。所以,当我调用self.response.write时,我需要传递JSON数据吗?理想情况下,我希望在我的处理程序中执行类似
    template=JINJA\u ENVIRONMENT.get\u template('page\u to\u render\u based\u on\u js\u data.html')self.response.write(template.render())
    。这可能吗?我根据您的问题假设您希望传递JSON数据,因此如果您将内容类型设置为application/JSON,那么是的,将一个序列化的JSON对象传递给
    write
    。您可以从模板构造JSON数据,但这是一种不必要的困难方法。但是如果你想这样做,我建议你用
    .json
    扩展名来命名你的模板,只是为了让你自己更容易。谢谢你,这正是我想要的。因此,一开始就用python呈现模板,然后用javascript操作模板,这不是“不受欢迎”的做法吗?在你的情况下,我认为你不需要任何javascript。一个简单的HTML表单,带有key1和key2以及按钮,可以发布数据,生成一个新页面。这里的例子:@voscausa是的,你是对的,我在这里使用了一个简化的例子。实际使用类似于通过javascript获取地理位置并将数据传回。这并不是不赞成的,但在关注点分离方面有点奇怪:对于给定区域,如果您的页面,HTML将由python和javascript代码生成,这会使开发更困难。谢谢,我也会尝试不使用ajax。我对Web开发非常陌生,我看到每个人都在使用Ajax,并且告诉你们实话,我甚至没有考虑用不同的方式来做这个请求。
    window.location.href = "<url_to_get>";