我知道各种框架都有其优点,但我个人希望我在python中的web开发尽可能直截了当:更少写入框架,更多写 python 。
到目前为止,我发现的唯一能让我以最明显的方式做到这一点的是web.py,但我对它的表现略有担忧。
对于那些使用nginx(或其他风味)+ mod_wsgi + web.py ...的性能如何?可以进一步改进吗?
对于那些使用过web.py的人来说,喜欢这个想法,然后继续写更好的东西或找到更好的东西......关心我的来源?
我想听听所有引人注目,极简但有力的方法。
答案 0 :(得分:37)
要走的路是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']
将其放在file.py
中,将mod_wsgi
apache配置指向它,它将会运行。纯蟒蛇。没有进口。只是一个python函数。
如果您真的在编写自己的框架,可以查看werkzeug。它不是一个框架,而是WSGI应用程序的各种实用程序的简单集合,并且已经成为最先进的WSGI实用程序模块之一。它包括一个功能强大的调试器,全功能请求和响应对象,处理实体标签的HTTP实用程序,缓存控制头,HTTP日期,cookie处理,文件上传,强大的URL路由系统和一堆社区贡献的插件模块。把无聊的部分从你手中夺走。
答案 1 :(得分:18)
这很有趣,甚至提出了一个问题,问如何在没有框架的情况下编写,每个人仍然都在努力推广自己喜欢的框架。 OP抱怨不想要“重量级框架”,回复中提到 Twisted ,所有的东西?!来吧,真的。
是的, 完全有可能编写直接的WSGI应用程序,并从独立模块中获取所需功能,而不是将代码放入一个特定框架的世界视图中。
要采用这种方法,您通常需要熟悉HTTP和CGI的基础知识(因为WSGI从早期的规范中继承了很多)。它不一定是向初学者推荐的方法,但它非常可行。
我想听听所有引人注目,极简但功能强大的方法
你不会听到关于他们,因为没有人对促进“自己动手”作为一种方法有部落兴趣。我,我使用一个特定的独立模板包,一个特定的独立表单阅读包,一个特定的数据访问层,以及一些家庭酿造实用程序模块。我不是在写一篇我可以改编的特定哲学,它们都是无聊的工具,可以换掉,换成别的东西一样好。
答案 2 :(得分: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())
答案 3 :(得分:8)
+1给WSGI的所有答案。
Eric Florenzo最近撰写了一篇很棒的博文,你应该阅读:Writing Blazing Fast, Infinitely Scalable, Pure-WSGI Utilities。这将使您更好地了解Hello World之外的纯WSGI。另请注意评论,特别是Kevin Dangoor的第一条评论,他建议至少将WebOb添加到您的工具集中。答案 4 :(得分:3)
为了它的价值,我在mod_python中编写了我的网站,没有任何像Django这样的干预框架。我没有任何理由抱怨。 (好吧也许有点,mod_python在某些方面有点古怪,但在常见用例中却没有)有一件事是肯定的,它一定会让你写Python; - )
答案 5 :(得分:2)
为什么您对web.py的性能有疑虑?正如我提到的here,我们在CherryPy后面使用nginx(网络服务器“内置于”web.py)来为Oyster.com提供大部分HTML服务 - nginx拆分流量跨2个或3个Web服务器,每个服务器运行4个Python进程,我们可以轻松处理每秒100个请求。
Oyster.com是一个高容量的网站,平均每天有200,000个动态生成的综合浏览量,并且数量远高于此数字。但是,我们确实使用内容传送网络(CDN)来处理静态资源,如图像和CSS。
我们非常关心性能(我们的大多数页面渲染时间不到25ms),但web.py不是瓶颈。我们的瓶颈是模板渲染(我们使用Cheetah,它足够快但不是其他世界的快速)和数据库查询(我们大量缓存并将每页数据库查询的数量保持为0或1)并访问我们的第3个 - 派对酒店定价提供商(当您使用我们尚未缓存的日期进行搜索时,可以访问这些提供商。)
请记住,过早优化是所有邪恶的根源 - 除非您为google.com服务,否则web.py可能适合您。
答案 6 :(得分:1)
我使用mod-python和PSP编写了一些小型Web应用程序 - mod-python相当于php。
在一个案例中,我编写了一个网页,通过检查我们的源代码库来生成发行说明。我把它改写成了PHP,并且惊讶地发现PSP版本的速度提高了大约20%,并且大约是代码行的一半。
所以,至少对于小问题,psp对我来说效果很好。
答案 7 :(得分:1)
我认为这取决于框架的定义以及它应该为您做些什么。
正如所指出的,一个非常小的“框架”将是WSGI,因为它只定义了一个用于与Web服务器连接的小型接口。但这是一种强大的方法,因为您可以在应用程序和服务器之间放置中间件。
如果你想要更多一点,比如功能映射的一些URL,那么你有一些选择,其中一些已经提到过了。
如果你走得更远,你可能会来到Pylons或Turbogears或Django,之后可能是Zope,但它变得更大,也许是痛苦以及你总是会接受该框架的意见。
我最近使用的越来越多(来自Zope / Plone)是repoze.bfg。它非常小,没有捆绑的ORM(因此您可以使用SQLAlchemy,Storm或只是转到像ZODB这样的对象数据库)。它的作用基本上是处理你如何从一个URL到一个函数的视图。它支持URL映射(路由)或对象遍历,在某些情况下恕我直言。如果你有一个不那么严格的映射。好处是它直接带有一个基于ACL的安全框架,如果你想要哪个恕我直言是非常实用的,它可以使用。这样你就不需要看起来主要用于此类事物的装饰器。
当然,它基于WSGI。同时查找repoze subversion repository相当多的中间件,Paste内容对WSGI相关任务也非常有用。
答案 8 :(得分:0)
Django有什么问题?它不会强迫您使用它的ORM,控制器只是简单的Python函数而不是类似Rails的类方法。此外,url路由是使用正则表达式而不是其他框架发明的语法完成的。如果django对你来说似乎太过分了,我建议你看看Werkzeug
答案 9 :(得分:0)
我非常喜欢Google AppEngine。我使用ORM和模板系统,但是遵循REST模式设计,只为相应的HTTP实现Python方法。它使原始HTTP交互成为中心,并可选择为您提供其他内容。此外,不再需要配置和管理部署环境了!