0

我是 python web 框架的新手。我使用 web.py 因为我喜欢它的原始性。不过,我想知道,当被限制通过return关键字发送输出时,如何有效地生成页面和脚本?似乎对于任何 python 模块,您只能向浏览器发送一件事,即使它是一个大字符串。我对服务器端脚本的 python 方式缺少什么?如果有帮助,我来自 PHP 的角度。我习惯了可以说 print "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 中调用的“模板”吗?谢谢您的帮助。

4

2 回答 2

1

是的,这就是模板的用途:有效地将逻辑与表示分离。

您必须查询控制器类中的所有数据,然后将其传递给将输出 html 的模板。

这似乎与常见的 php 做法不同,但我敢肯定,即使是 php 开发人员也在选择这种方法。

关于 web.py,流式内容输出的另一个选项是使用yield,请参阅http://webpy.org/cookbook/streaming_large_files

于 2012-12-29T08:58:30.453 回答
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)

这会将您添加到“输出”列表中的所有文本连同 HTML 换行符一起返回给浏览器/客户端。

尽管如此,模板几乎总是一种更好的工作方式。

为什么模板和单个“返回”更好?

在 PHP 中,将内容“打印”到输出非常容易,而且很方便。但是,想象一下:

<?php
    include('foobar.php');
    header('Content-Type: Application/JSON');
    print ('{"message": "Hello World!"}');
?>

太好了,对吧?问题是说您尝试包含的文件中有错误(foobar)。现在 PHP 错误信息将在 HTTP 标头之前返回给客户端,这将导致另一个 PHP 错误,以及一个混乱的页面。

或者,

foob​​ar.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 中,有一个非常有用的“日志记录”模块(http://docs.python.org/2/howto/logging.html,或 google 获取更多教程),它允许您将所有错误消息记录到文件中,或者多个文件。然后,您可以在测试时“tail -f”该文件,并在发生时观察所有错误或调试信息,而不是在浏览器中等待它,因为它可能会被 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 的文件,其中包含所有错误和调试消息,例如:

appname:DEBUG:This is a debug message
appname:ERROR:Oh no! This should not happen!

要停止显示调试消息,您只需将级别从 logging.DEBUG 更改为 logging.ERROR,或您想要的任何其他级别,您只会得到错误。链接的教程有更多信息。

我希望这个对你有用!

于 2013-01-13T05:30:09.247 回答