我是python web框架的新手。我正在使用web.py,因为我喜欢它的原始状态。我想知道,当被限制为通过return
关键字发送输出时,如何有效地生成页面和脚本?对于任何python模块,你似乎只能向浏览器发送一个东西,即使它是一个大字符串。我对服务器端脚本的python方式有什么看法?如果有帮助,我将从PHP的角度出发。我习惯于说“foo”和foo会出现。现在我只允许每个模块打印一次。如果你可以指出我在python方法的脚本与php方法的方向,我非常感谢它!在这一点上我非常困惑如何在如此有限的情况下如何有效地使用python。
例如,这是我写的基本程序:
import web
urls = ('/','index')
class index:
def GET(self):
return "foo" ///Where this is the only place on the file I can output anything
(and the rest of the file you should be familiar with)
关键在于,在我看来,你能输出任何东西的唯一地方是在一条回程线上吗?现在我明白,如果URI参数发生变化,你可以映射到不同的类,从而输出不同的东西,但即便如此,这似乎也有限?
或者最终,Web框架使用“模板”是否重要,因为它们在web.py中被调用? 谢谢你的帮助。
答案 0 :(得分:1)
是的,这就是模板的用途:有效地将逻辑与表示分开。
您必须查询控制器类中的所有数据,然后将其传递给将输出html的模板。
这可能与普通的PHP实践有所不同,但我确信即使是php开发人员也在选择这种方法。
关于web.py,流内容输出的另一个选项是使用yield
,请参阅http://webpy.org/cookbook/streaming_large_files
答案 1 :(得分:1)
Andrey Kuzmin的回答是正确的,模板是正确的工作方式。
但是,如果你想生成你在php' print中返回的文本(" blah");'有点像,你可以像这样工作:
class index:
def GET(self):
output = []
# do stuff...
output.append('Some text.')
# do more stuff...
output.append('And more text...')
# ok, now we're at the end:
return '<br/>'.join(output)
这会将您已附加到&#39;输出中的所有文字返回给浏览器/客户端。列表,与HTML换行符连接在一起。
同样,模板几乎总是更好的工作方式。
为什么模板和单个&#39;返回&#39;更好吗
在PHP中,它非常容易打印&#39;东西到输出,它可以很方便。但是,想象一下:
<?php
include('foobar.php');
header('Content-Type: Application/JSON');
print ('{"message": "Hello World!"}');
?>
很好,对吗? 麻烦的是,你在尝试包含的文件中有错误(foobar)。现在,在 HTTP标头之前,PHP错误消息将返回到客户端,这将导致另一个PHP错误,以及混乱的页面。
或,
foobar.php文件中包含一些打印语句。同样,您现在在标题之前打印了错误,或者即使您没有执行自定义标题,您仍然会收到无效文档。所以在PHP中,解决方案就是:
<?php
ob_start(); // start caching all output, so it doesn't interfere.
include('foobar.php');
do_other_stuff();
ob_end_flush(); // print the cached output.
?>
虽然有点笨重,但却阻止了这个问题。 现在你遇到了这种情况 - 如果你的一个包含文件也正在使用ob_start()或其他输出缓存呢?只要代码中没有错误,你应该没问题。但是如果有错误,并且在进入同花顺之前php崩溃了,你就会丢失这些信息。
使用单个端点(如在Python中)意味着您可以更好地控制返回的内容。在一些旧的遗留PHP代码中,我不得不维护一些东西(可能是错误消息),我必须搜索整个代码库以尝试查找它的打印位置。
如何打印调试信息?
在Python中,有一个非常有用的&#39;日志记录&#39;模块(http://docs.python.org/2/howto/logging.html或谷歌更多教程),它允许您将所有错误消息记录到文件或多个文件。然后你就可以'-f&#39;该文件,在测试时,并在发生时观察所有错误或调试信息,而不是在浏览器中等待它,它可能会被CSS或HTML格式搞乱或混淆。
这也意味着您不小心将调试消息(可能包含敏感信息)发送到浏览器的可能性更小,并且您可以在站点仍然保留的情况下在日志记录级别(调试信息的加载,仅错误等)之间切换最终的制作外观。
import logging
logging.basicConfig(filename='my_application.log', level=logging.DEBUG)
log = logging.getLogger(__name__)
# do stuff....
log.debug('This is a debug message')
# do more stuff
log.error('Oh no! This should not happen!')
# ...
现在,您将获得一个名为my_application.log的文件,该文件包含所有错误&amp;调试消息,如:
appname:DEBUG:This is a debug message
appname:ERROR:Oh no! This should not happen!
要停止显示调试消息,只需将级别从logging.DEBUG更改为logging.ERROR,或者您想要的任何其他级别,并且您只会获得ERROR。链接教程有更多信息。
我希望你觉得这很有用!