Python 中不同 Web 编程方法的优缺点
Posted
技术标签:
【中文标题】Python 中不同 Web 编程方法的优缺点【英文标题】:Pros and Cons of different approaches to web programming in Python 【发布时间】:2010-09-07 19:22:04 【问题描述】:我想使用 Python 编写一些服务器端脚本。但是我有点迷失了很多方法来做到这一点。
它以自己动手的 CGI 方法开始,似乎以一些非常强大的框架结束,这些框架基本上可以自己完成所有工作。还有很多介于两者之间的东西,比如web.py、Pyroxide 和Django。
您从事过的框架或方法有哪些优点和缺点? 有哪些权衡? 哪些项目做得好,哪些做得不好?编辑:我还没有太多的网络编程经验。
我想避免基本和繁琐的事情,例如解析 URL 以获取参数等。
另一方面,虽然blog created in 15 minutes 和Ruby on Rails 的视频给我留下了深刻的印象,但我意识到有成百上千的事情瞒着我——如果你需要马上写一个有效的webapp
,这很酷,但是对于真正理解魔法来说并不是那么好——这就是我现在所寻求的。
【问题讨论】:
【参考方案1】:CGI 非常适合低流量网站,但它在其他任何网站上都有一些性能问题。这是因为每次有请求进来时,服务器都会在自己的进程中启动 CGI 应用程序。这很糟糕,原因有两个:1)启动和停止进程可能需要时间,2)您无法在内存中缓存任何内容。你可以使用 FastCGI,但我认为如果你要走那条路,你最好直接写一个 WSGI 应用程序(WSGI 的工作方式实际上并没有太大的不同来自 CGI)。
除此之外,您的选择主要是您希望框架执行多少操作。你可以使用像 Django 或 Pylons 这样的全唱歌、全跳舞的框架。或者您可以采用混合搭配的方法(使用 CherryPy 之类的东西来处理 HTTP 内容,SQLAlchemy 用于数据库内容,粘贴用于部署等)。我还应该指出,大多数框架还允许您为其他框架切换不同的组件,因此这两种方法不一定相互排斥。
就我个人而言,我不喜欢为我带来太多魔力的框架,更喜欢混合搭配技术,但有人告诉我,我也完全疯了。 :)
您有多少网络编程经验?如果您是初学者,我建议您使用 Django。如果您更有经验,我建议您尝试不同的方法和技术,直到找到合适的。
【讨论】:
【参考方案2】:最简单的 Web 程序是 CGI 脚本,它基本上只是一个程序,其标准输出被重定向到发出请求的 Web 浏览器。在这种方法中,每个页面都有自己的可执行文件,必须在每次请求时加载和解析。这使得启动和运行某些东西变得非常简单,但在性能和组织方面都很难扩展。因此,当我需要一个非常快速且不会增长为更大系统的动态页面时,我会使用 CGI 脚本。
更进一步的是将 Python 代码嵌入到 html 代码中,例如使用 PSP。我认为现在很多人都不会使用它,因为现代模板系统已经让它变得非常过时了。我与 PSP 合作了一段时间,发现它与 CGI 脚本具有基本相同的组织限制(每个页面都有自己的文件),加上一些与空白相关的烦恼,因为试图将空白无知的 HTML 与空白敏感的 Python 混合在一起。
下一步是非常简单的 Web 框架,例如我也使用过的 web.py。与 CGI 脚本一样,启动和运行某些东西非常简单,您不需要任何复杂的配置或自动生成的代码。您自己的代码将很容易理解,因此您可以看到正在发生的事情。但是,它不像其他 Web 框架那样功能丰富;上次我使用它时,没有会话跟踪,所以我不得不自己动手。引用 Guido ("upvars(), bah") 时,它也有“太多的魔法行为”。
最后,您拥有功能丰富的 Web 框架,例如 Django。这些将需要一些工作才能让简单的 Hello World 程序正常工作,但每个主要程序都有一个很棒的、编写良好的教程(尤其是 Django)来引导你完成它。我强烈建议将这些 Web 框架之一用于任何实际项目,因为它方便、功能和文档等。
最终你必须决定你喜欢什么。例如,框架都使用模板语言(特殊代码/标签)来生成 HTML 文件。其中一些(例如 Cheetah 模板)允许您编写任意 Python 代码,以便您可以在模板中执行任何操作。诸如 Django 模板之类的其他模板更具限制性,并迫使您将演示代码与程序逻辑分开。这完全取决于您个人的喜好。
另一个例子是 URL 处理;某些框架(例如 Django)让您通过正则表达式在应用程序中定义 URL。其他诸如 CherryPy 会自动将您的函数映射到您的函数名称的 url。同样,这是个人喜好。
我个人将 CherryPy 用于我的 Web 服务器内容(表单参数、会话处理、URL 映射等)和 Django 用于我的对象关系映射和模板,从而混合使用 Web 框架。我的建议是从一个高级 Web 框架开始,按照自己的方式完成它的教程,然后从一个小型个人项目开始。我已经用我提到的所有技术做到了这一点,这真的很有益。最终,您将了解自己喜欢什么,并在此过程中成为一名更好的 Web 程序员(通常也是一名更好的程序员)。
【讨论】:
【参考方案3】:如果您决定使用基于 WSGI 的框架(例如 TurboGears),我建议您阅读 Ian Bicking 的优秀文章 Another Do-It-Yourself Framework。
在文章中,他从零开始构建了一个简单的 Web 应用程序框架。
另外,请查看 Kevin Dangoor 的视频 Creating a web framework with WSGI。 Dangoor 是 TurboGears 项目的创始人。
【讨论】:
【参考方案4】:如果你想变大,选择 Django 就可以了。但是,如果您只想学习,请使用已经提到的 WebOb 推出自己的框架 - 这真的很有趣,我相信您会学到更多(另外您可以使用您喜欢的组件:模板系统、url 调度程序、数据库层、会话等)。
在过去的 2 年中,我使用 Django 构建了几个大型网站,我只能说,Django 将在 20% 的时间内满足您 80% 的需求。剩下的 20% 的工作将花费 80% 的时间,无论您使用哪种框架。
【讨论】:
【参考方案5】:总是值得用艰难的方式做某事——一次——作为一种学习练习。一旦您了解了它的工作原理,请选择一个适合您的应用程序的框架并使用它。一旦你了解了角速度,你就不需要重新发明***了。 :-)
在你开始之前,确保你对框架背后的编程语言有相当深入的了解也是值得的——尝试同时学习 Django 和 Python(或 Ruby 和Rails,或 X 和 Y),可能会导致更多的混乱。先用语言写一些代码,然后添加框架。
我们学会开发,不是通过使用工具,而是通过解决问题。撞到几堵墙,爬过去,找到更高的墙!
【讨论】:
【参考方案6】:如果您之前从未做过任何 CGI 编程,那么我认为值得做一个项目 - 也许只是一个仅供您自己使用的示例游戏站点 - 使用 DIY 方法。与使用框架相比,您将学到更多关于所有不同部分如何工作的知识。这将有助于您设计和调试所有未来的 Web 应用程序,无论您如何编写它们。
我个人现在使用Django。真正的好处是非常快速的应用程序部署。对象关系映射使事情进展迅速,模板库使用起来很有趣。此外,管理界面为您提供所有对象的基本 CRUD 屏幕,因此您无需编写任何“无聊”的东西。
使用基于 ORM 的解决方案的缺点是,如果您确实想要手工制作一些 SQL,比如说出于性能原因,它会比其他方式困难得多,尽管仍然很有可能。
【讨论】:
【参考方案7】:如果你使用 Python,你应该不从 CGI 开始,而是从 WSGI 开始(你可以使用wsgiref.handlers.CGIHandler 将你的 WSGI 脚本作为 CGI 脚本运行。结果是基本上和 CGI 一样低级(这在教育意义上可能有用,但也会有些烦人),但不必编写完全过时的接口(并将您的应用程序绑定到单个进程模型)。
如果您想要一个不那么烦人但同样低级的界面,使用WebOb 可以提供。您将实现所有逻辑,并且会有一些您不理解的黑暗角落,但您不必花时间弄清楚如何解析 HTTP 日期(它们很奇怪! ) 或解析 POST 正文。我以这种方式编写应用程序(没有任何其他框架)并且它是完全可行的。作为初学者,如果您有兴趣了解框架的作用,我会建议您这样做,因为您不可避免地会编写自己的迷你框架。 OTOH,一个真正的框架可能会教你应用程序设计和结构的良好实践。要成为一个真正优秀的网络程序员,我相信你需要认真尝试两者;您应该了解框架所做的一切并且不要害怕其内部结构,但您还应该花时间在其他人设计的深思熟虑的环境中(即现有框架),并了解该结构如何帮助您。
【讨论】:
【参考方案8】:好的,rails 实际上相当不错,但是其中的魔法有点太多了(从 Ruby 世界来看,我更喜欢 merb 而不是 rails)。我个人使用 Pylons,非常高兴。我想说(与 django 相比),pylons 允许您比 django 更容易地交换 int 内部部件。缺点是你必须自己写更多的东西(比如基本的 CRUD)。
使用框架的优点:
-
快速完成工作(我的意思是一旦你了解了框架就可以快速完成)
一切都符合标准(滚动您自己的标准可能不太容易实现)
无需阅读大量文章和文档即可更轻松地完成工作(大量教程)
缺点:
-
你学得更少
更难更换部件(在 pylons 中不是什么大问题,在 django 中更是如此)
更难调整一些低级的东西(如上面提到的 SQL)
从中您可能可以设计出它们的优点 :-) 由于您获得了所有代码,因此可以对其进行调整以适应最奇怪的情况(据推测,pylon 现在可以在 Google 应用程序引擎上运行...) .
【讨论】:
【参考方案9】:对于较小的项目,滚动您自己的项目相当容易。尤其是您可以简单地导入像 Genshi 这样的模板引擎,然后快速轻松地完成很多事情。有时使用螺丝刀比去找电钻要快。
成熟的框架提供了更多的功能,但必须先安装和设置,然后才能利用这种功能。对于较大的项目,这是一个可以忽略不计的问题,但对于较小的项目,这可能会占用您大部分时间——尤其是在不熟悉框架的情况下。
【讨论】:
以上是关于Python 中不同 Web 编程方法的优缺点的主要内容,如果未能解决你的问题,请参考以下文章