33

我知道各种框架都有它们的好处,但我个人希望我在 python 中的 Web 开发尽可能简单:少写框架,多写python

到目前为止,我发现的唯一可以让我以最明显的方式做到这一点的是web.py,但我对它的性能有点担心。

对于那些使用 nginx(或其他风格)+mod_wsgi+web.py 的人...性能如何?可以进一步改进吗?

对于那些使用过 web.py、喜欢这个想法并继续写出更好的东西或找到更好的东西的人来说......介意给我指出源吗?

我想听听所有引人注目的、最小化但强大的方法。

4

10 回答 10

39

要走的路是wsgi

WSGI 是Web 服务器网关接口。它是 Web 服务器和应用程序服务器与 Web 应用程序通信的规范(尽管它也可以用于更多用途)。它是一个 Python 标准,在PEP 333中有详细描述。

当前所有的框架都支持 wsgi。许多网络服务器也支持它(包括 apache,通过mod_wsgi)。如果您想编写自己的框架,这是要走的路。

这里是hello world,直接写到wsgi:

def application(environ, start_response):
    status = '200 OK'
    response_headers = [('Content-type','text/plain')]
    start_response(status, response_headers)
    return ['Hello world!\n']

把它放在 a 中file.py,将你的mod_wsgiapache 配置指向它,它就会运行。纯蟒蛇。没有进口。只是一个python函数。

如果你真的在编写自己的框架,你可以检查werkzeug。它不是一个框架,而是 WSGI 应用程序的各种实用程序的简单集合,并已成为最先进的 WSGI 实用程序模块之一。它包括一个强大的调试器、功能齐全的请求和响应对象、处理实体标签的 HTTP 实用程序、缓存控制标头、HTTP 日期、cookie 处理、文件上传、强大的 URL 路由系统和一堆社区贡献的插件模块。把无聊的部分从你手中拿走。

于 2009-02-27T21:45:58.097 回答
19

有趣的是,即使有人提出一个问题,询问如何在没有框架的情况下编写代码,每个人仍然涌入推销他们最喜欢的框架。OP 抱怨不想要一个“重量级框架”,回复提到Twisted,最重要的是?!来吧,真的。

是的,完全有可能编写直接的 WSGI 应用程序,并从独立模块中获取一些想要的功能,而不是让您的代码适应特定框架的世界观。

要走这条路,您通常需要熟悉 HTTP 和 CGI​​ 的基础知识(因为 WSGI 从早期的规范中继承了很多东西)。这不一定是向初学者推荐的方法,但它非常可行。

我想听听所有引人注目的、最小但强大的方法

你不会听说它们,因为没有人有兴趣将“自己动手”作为一种方法论来推广。我,我使用一个特定的独立模板包、一个特定的独立表单阅读包、一个特定的数据访问层和一些自制实用程序模块。我写的不是一种我可以传教的特定哲学,它们都只是无聊的工具,可以换掉并用其他同样好的东西代替。

于 2009-02-27T22:11:40.703 回答
9

你也可以检查cherrypy。cherrypy 的重点是成为一个让你编写 python 的框架。Cherrypy 有自己非常好的网络服务器,但它与 wsgi 兼容,因此您可以通过 mod_wsgi 在 apache 中运行cherrypy 应用程序。这是cherrypy中的hello world:

import cherrypy

class HelloWorld(object):
    def index(self):
        return "Hello World!"
    index.exposed = True

cherrypy.quickstart(HelloWorld())
于 2009-02-27T21:46:50.670 回答
8

+1 对 WSGI 的所有答案。

Eric Florenzo 最近写了一篇很棒的博客文章,你应该阅读:编写 Blazing Fast, Infinitely Scalable, Pure-WSGI Utilities。这将使您更好地了解 Hello World 之外的纯 WSGI。还要注意评论,尤其是 Kevin Dangoor 的第一条评论,他建议至少将WebOb添加到您的工具集中。

于 2009-02-27T22:23:49.847 回答
3

对于它的价值,我在 mod_python 中编写了我的网站,没有任何像 Django 这样的干预框架。我真的没有理由抱怨。(好吧,也许有一点,mod_python 在某些方面有点古怪,但在常见的用例中却不是)有一件事是肯定的,它肯定会让你编写 Python ;-)

于 2009-02-27T21:33:33.150 回答
2

为什么你担心 web.py 的性能?正如我在这里提到的,我们在nginx后面使用CherryPy(“内置”web.py 的 Web 服务器)来提供 Oyster.com 上的大部分 HTML —— nginx 将流量拆分到 2 或 3 个 Web 服务器上,每个服务器运行 4 个 Python 进程,我们可以轻松地每秒处理 100 个请求。

Oyster.com 是一个大容量网站,平均每天有 200,000 次动态生成的网页浏览量,并且达到的峰值要高得多。但是,我们确实为我们的静态资源(如图像和 CSS)使用了内容交付网络 (CDN)。

我们绝对关心性能(我们的大多数页面在 25 毫秒内呈现),但 web.py 不是瓶颈。我们的瓶颈是模板渲染(我们使用Cheetah,它足够快,但速度不够快)和数据库查询(我们大量缓存并将每页的数据库查询数量保持在 0 或 1)以及访问我们的 3rd-party 酒店定价提供者(当您使用我们尚未缓存的日期进行搜索时访问这些提供者)。

请记住,过早的优化是万恶之源——除非您服务于 google.com,否则 web.py 可能会为您工作。

于 2011-11-01T15:09:09.773 回答
1

我已经使用 mod-python 和PSP编写了一些小型 Web 应用程序——mod -python 相当于 php。

在一个案例中,我编写了一个网页,通过检查我们的源代码存储库来生成发行说明。我将它重写为 PHP,并惊讶地发现 PSP 版本快了大约 20%,并且代码行数减少了大约一半。

所以,至少对于小问题,psp 对我来说效果很好。

于 2009-02-27T22:16:44.590 回答
1

我认为这取决于框架是什么以及它应该为您做什么的定义。

正如所指出的,一个非常小的“框架”将是 WSGI,因为它只定义了一个用于与 Web 服务器交互的小接口。但这是一种强大的方法,因为您可以在应用程序和服务器之间放置中间件。

如果你想要更多一点,比如一些 URL 到函数的映射,那么你有一些选择,其中一些已经提到过。

如果你走得更远,你可能会来到 Pylons、Turbogears 或 Django,之后可能会是 Zope,但它会变得更大,可能会很痛苦,而且你总是会接受那个框架的意见。

我最近越来越多(来自 Zope/Plone)使用的是repoze.bfg。它非常小,没有捆绑 ORM(因此您可以使用 SQLAlchemy、Storm 或简单地转到像ZODB这样的对象数据库)。它所做的基本上是处理您如何从 URL 转到作为函数的视图。它支持 URL 映射(a la Routes)或对象遍历,恕我直言,这在某些情况下非常强大,尤其是。如果您的映射不那么严格。好消息是它直接带有一个基于 ACL 的安全框架,如果你想使用它,恕我直言非常实用。这样,您就不需要似乎主要用于此类事情的装饰器。

当然,它是基于 WSGI 的。还要寻找大量中间件的repoze subversion 存储库, Paste的东西对于 WSGI 相关的任务也非常有用。

于 2009-02-27T22:53:00.353 回答
0

姜戈怎么了?它不会强迫您使用它的 ORM,控制器只是普通的 Python 函数,而不是类似 Rails 的类方法。此外,url 路由是使用正则表达式而不是其他框架发明的语法完成的。如果 django 对你来说似乎太多了,我建议你看看Werkzeug

于 2009-02-27T21:56:26.043 回答
0

我非常喜欢 Google AppEngine。我使用 ORM 和模板系统,但在其他方面遵循 REST 模式设计,只为相应的 HTTP 实现 Python 方法。它使原始 HTTP 交互成为中心,并且可以选择为您提供其他使用的东西。此外,无需再配置和管理您的部署环境!

于 2009-02-27T22:14:37.060 回答