Python 在post处理程序中呈现新页面在某些情况下有效,而在其他情况下无效
我之前已经问过一个问题- 但这个问题对我来说仍然没有解决。现在,它变得比以往任何时候都更令人困惑,因为它似乎在某些情况下有效,但在其他情况下无效 几周前,我决定从头开始读这本书- 在第2章(第13页)中,有一个poemmaker.py,它在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('
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控制台日志会说什么?