我知道各种框架都有它们的好处,但我个人希望我在 python 中的 Web 开发尽可能简单:少写框架,多写python。
到目前为止,我发现的唯一可以让我以最明显的方式做到这一点的是web.py,但我对它的性能有点担心。
对于那些使用 nginx(或其他风格)+mod_wsgi+web.py 的人...性能如何?可以进一步改进吗?
对于那些使用过 web.py、喜欢这个想法并继续写出更好的东西或找到更好的东西的人来说......介意给我指出源吗?
我想听听所有引人注目的、最小化但强大的方法。
我知道各种框架都有它们的好处,但我个人希望我在 python 中的 Web 开发尽可能简单:少写框架,多写python。
到目前为止,我发现的唯一可以让我以最明显的方式做到这一点的是web.py,但我对它的性能有点担心。
对于那些使用 nginx(或其他风格)+mod_wsgi+web.py 的人...性能如何?可以进一步改进吗?
对于那些使用过 web.py、喜欢这个想法并继续写出更好的东西或找到更好的东西的人来说......介意给我指出源吗?
我想听听所有引人注目的、最小化但强大的方法。
要走的路是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 路由系统和一堆社区贡献的插件模块。把无聊的部分从你手中拿走。
有趣的是,即使有人提出一个问题,询问如何在没有框架的情况下编写代码,每个人仍然涌入推销他们最喜欢的框架。OP 抱怨不想要一个“重量级框架”,回复提到Twisted,最重要的是?!来吧,真的。
是的,完全有可能编写直接的 WSGI 应用程序,并从独立模块中获取一些想要的功能,而不是让您的代码适应特定框架的世界观。
要走这条路,您通常需要熟悉 HTTP 和 CGI 的基础知识(因为 WSGI 从早期的规范中继承了很多东西)。这不一定是向初学者推荐的方法,但它非常可行。
我想听听所有引人注目的、最小但强大的方法
你不会听说它们,因为没有人有兴趣将“自己动手”作为一种方法论来推广。我,我使用一个特定的独立模板包、一个特定的独立表单阅读包、一个特定的数据访问层和一些自制实用程序模块。我写的不是一种我可以传教的特定哲学,它们都只是无聊的工具,可以换掉并用其他同样好的东西代替。
你也可以检查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())
+1 对 WSGI 的所有答案。
Eric Florenzo 最近写了一篇很棒的博客文章,你应该阅读:编写 Blazing Fast, Infinitely Scalable, Pure-WSGI Utilities。这将使您更好地了解 Hello World 之外的纯 WSGI。还要注意评论,尤其是 Kevin Dangoor 的第一条评论,他建议至少将WebOb添加到您的工具集中。
对于它的价值,我在 mod_python 中编写了我的网站,没有任何像 Django 这样的干预框架。我真的没有理由抱怨。(好吧,也许有一点,mod_python 在某些方面有点古怪,但在常见的用例中却不是)有一件事是肯定的,它肯定会让你编写 Python ;-)
为什么你担心 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 可能会为您工作。
我已经使用 mod-python 和PSP编写了一些小型 Web 应用程序——mod -python 相当于 php。
在一个案例中,我编写了一个网页,通过检查我们的源代码存储库来生成发行说明。我将它重写为 PHP,并惊讶地发现 PSP 版本快了大约 20%,并且代码行数减少了大约一半。
所以,至少对于小问题,psp 对我来说效果很好。
我认为这取决于框架是什么以及它应该为您做什么的定义。
正如所指出的,一个非常小的“框架”将是 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 相关的任务也非常有用。
姜戈怎么了?它不会强迫您使用它的 ORM,控制器只是普通的 Python 函数,而不是类似 Rails 的类方法。此外,url 路由是使用正则表达式而不是其他框架发明的语法完成的。如果 django 对你来说似乎太多了,我建议你看看Werkzeug
我非常喜欢 Google AppEngine。我使用 ORM 和模板系统,但在其他方面遵循 REST 模式设计,只为相应的 HTTP 实现 Python 方法。它使原始 HTTP 交互成为中心,并且可以选择为您提供其他使用的东西。此外,无需再配置和管理您的部署环境!