Python 在post处理程序中呈现新页面在某些情况下有效,而在其他情况下无效

Python 在post处理程序中呈现新页面在某些情况下有效,而在其他情况下无效,python,post,render,tornado,Python,Post,Render,Tornado,我之前已经问过一个问题- 但这个问题对我来说仍然没有解决。现在,它变得比以往任何时候都更令人困惑,因为它似乎在某些情况下有效,但在其他情况下无效 几周前,我决定从头开始读这本书- 在第2章(第13页)中,有一个poemmaker.py,它在POST处理程序中有一个重定向,并且工作得很好 class PoemPageHandler(tornado.web.RequestHandler): def post(self): noun1 = self.get_argument('

我之前已经问过一个问题- 但这个问题对我来说仍然没有解决。现在,它变得比以往任何时候都更令人困惑,因为它似乎在某些情况下有效,但在其他情况下无效

几周前,我决定从头开始读这本书-

在第2章(第13页)中,有一个poemmaker.py,它在POST处理程序中有一个重定向,并且工作得很好

class PoemPageHandler(tornado.web.RequestHandler):
    def post(self):
        noun1 = self.get_argument('noun1')
        noun2 = self.get_argument('noun2')
        verb = self.get_argument('verb')
        noun3 = self.get_argument('noun3')
        self.render('poem.html', roads=noun1, wood=noun2, made=verb, difference=noun3)
然后在第5章(第84页)中,您将shopping_cart.py作为长轮询的一个示例。这段代码有一个非常相似的post处理程序-

class CartHandler(tornado.web.RequestHandler):
    def post(self):
        action = self.get_argument('action')
        session = self.get_argument('session')

        if not session:
            self.set_status(400)
            return
        if action == 'add':
            self.application.shoppingCart.moveItemToCart(session)
        elif action == 'remove':
            self.application.shoppingCart.removeItemFromCart(session)
        else:
            self.set_status(400)
        #self.render('test.html')
现在,self.render不起作用(我用poemmaker.py尝试了相同的html文件,它在这里起作用,它只是停留在同一页面上,浏览器变得没有响应)。在我看来,同一个处理者在这两种情况下的行为非常不同。渲染在一种情况下工作而在另一种情况下不工作的原因是什么

编辑: 我发现这两个案例的主要方法有所不同:

对于poemhandler(渲染工作的地方),其定义为——

if __name__ == '__main__':
    tornado.options.parse_command_line()
    app = tornado.web.Application(
    handlers=[(r'/', IndexHandler), (r'/poem', PoemPageHandler)],
    template_path=os.path.join(os.path.dirname(__file__), "templates")
        )
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()
if __name__ == '__main__':
    tornado.options.parse_command_line()
    app = Application()
    server = tornado.httpserver.HTTPServer(app)
    server.listen(8000)
    tornado.ioloop.IOLoop.instance().start()
而对于购物车,其定义为——

if __name__ == '__main__':
    tornado.options.parse_command_line()
    app = tornado.web.Application(
    handlers=[(r'/', IndexHandler), (r'/poem', PoemPageHandler)],
    template_path=os.path.join(os.path.dirname(__file__), "templates")
        )
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()
if __name__ == '__main__':
    tornado.options.parse_command_line()
    app = Application()
    server = tornado.httpserver.HTTPServer(app)
    server.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

区别似乎在于应用程序对象的定义方式,它告诉tornado在哪里可以找到模板。但是,在第二种情况下,当我试图定义templates目录的位置时,整个页面都没有显示。

今天,我也遇到了同样的问题。解决方案很简单,如下所示:

在shopping_cart.py文件中

settings = {
    'template_path': 'templates',
    'static_path': 'static'
}
应修改为

import os.path
    ...
settings={
    'template_path':os.path.join(os.path.dirname(__file__),'templates'),
    'static_path':os.path.join(os.path.dirname(__file__),'static')
}

你能更好地解释一下“self.render不起作用”是什么意思吗?你是如何测试这些页面的?你在使用诸如Chrome海报之类的工具吗?当您发布一些数据时,tornado控制台日志会说什么?