关于框架:Python中不同的Web编程方法的利弊

关于框架:Python中不同的Web编程方法的利弊

Pros and Cons of different approaches to web programming in Python

我想使用Python做一些服务器端脚本。但是我对执行此操作的方式迷茫了。

它以"自己动手做" CGI方法开始,并且似乎以一些相当健壮的框架结束,这些框架基本上可以自己完成所有工作。中间还有很多东西,例如web.py,Pyroxide和Django。

  • 您所研究的框架或方法的优缺点是什么?
  • 有哪些权衡?
  • 他们擅长于哪些项目,而擅长于哪些项目?

编辑:我还没有太多的Web编程经验。
我想避免一些基本和乏味的事情,例如解析URL中的参数等。
另一方面,虽然Ruby on Rails在15分钟内创建的博客视频给我留下了深刻的印象,但我意识到隐藏了数百件事-如果您需要立即编写可运行的Web应用程序,这很酷,但是真正了解魔术并不是那么好-这就是我现在想要的。


CGI非常适合低流量的网站,但对于其他任何网站都存在一些性能问题。这是因为每次请求进入时,服务器都会在其自己的进程中启动CGI应用程序。这很糟糕,原因有两个:1)启动和停止进程可能要花费一些时间,并且2)您无法在内存中缓存任何内容。您可以使用FastCGI,但我认为如果您要走这条路线,最好只编写一个简单的WSGI应用程序(WSGI的工作方式与CGI确实没有太大的不同) )。

除此之外,您的选择大部分是您希望框架执行的操作。您可以使用所有唱歌,跳舞的框架,例如Django或Pylons。或者,您可以采用混合匹配的方法(对HTTP内容使用CherryPy,对数据库内容使用SQLAlchemy,对部署进行粘贴等)。我还应该指出,大多数框架还允许您将其他组件切换为其他组件,因此这两种方法不一定是互斥的。

就我个人而言,我不喜欢那些为我做太多魔术的框架,并且更喜欢混合和匹配技术,但是有人告诉我我也完全疯了。 :)

您有多少Web编程经验?如果您是初学者,我想和Django一起去。如果您更有经验,我会尝试各种方法和技巧,直到找到合适的方法。


最简单的Web程序是CGI脚本,它基本上只是一个程序,其标准输出重定向到发出请求的Web浏览器。用这种方法,每个页面都有其自己的可执行文件,必须在每个请求上对其进行加载和解析。这使启动和运行变得非常简单,但是在性能和??组织方面都无法很好地扩展。因此,当我很快需要一个非常动态的页面而不会扩展到更大的系统时,我使用了CGI脚本。

这样做的第一步是将您的Python代码嵌入到HTML代码中,例如PSP。我认为现在没有多少人使用此功能,因为现代模板系统已经使此功能过时了。我在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程序员(和一般而言更好的程序员)。


如果您决定使用基于WSGI的框架(例如TurboGears),我建议您阅读Ian Bicking撰写的出色的文章《自己动手做另一个框架》。

在本文中,他从头开始构建了一个简单的Web应用程序框架。

另外,请观看Kevin Dangoor的视频使用WSGI创建Web框架。 Dangoor是TurboGears项目的创始人。


如果您想变大,请选择Django并已设置。但是,如果您只是想学习,请使用已经提到的WebOb滚动自己的框架-这确实很有趣,而且我相信您会学到更多(此外,您还可以使用喜欢的组件:模板系统,URL调度程序,数据库层,会议等)。

在过去的两年中,我使用Django构建了几个大型站点,我只能说Django将在20%的时间内满足您80%的需求。无论您使用哪种框架,剩下的20%的工作都将花费80%的时间。


作为一项学习练习,用一次艰难的方法做某事总是值得的。了解了它的工作原理之后,请选择适合您的应用程序的框架,然后使用它。了解角速度后,您无需重新发明轮子。 :-)

同样值得一提的是,在您跳入之前对框架背后的编程语言有相当深入的了解-尝试同时学习Django和Python(或Ruby和Rails或X和Y),可能会导致更加混乱。首先用该语言编写一些代码,然后添加框架。

我们不是通过使用工具而是通过解决问题来学习开发。碰到几堵墙,爬过去,找到更高的墙!


如果您使用的是Python,则不应以CGI开头,而应以WSGI开头(您可以使用wsgiref.handlers.CGIHandler将WSGI脚本作为CGI脚本运行。其结果基本上是与CGI一样低级的(在教育意义上可能是有用的,但也会有些烦人),而不必编写完全过时的接口(并将您的应用程序绑定到单个流程模型)。

如果您想要一个不那么烦人但类似的低级界面,则可以使用WebOb来提供。您将实现所有逻辑,并且几乎没有您不了解的黑暗角落,但是您不必花时间弄清楚如何解析HTTP日期(它们很奇怪!)或解析POST正文。我以这种方式(没有任何其他框架)编写应用程序,并且完全可行。作为初学者,如果您有兴趣了解框架的用途,我建议您这样做,因为不可避免的是您将编写自己的微型框架。 OTOH,一个真实的框架可能会教您应用程序设计和结构的良好实践。要成为一名真正的优秀Web程序员,我相信您需要认真尝试。您应该了解框架所做的所有事情,并且不要害怕其内部结构,但是您还应该在其他人设计的周到环境(即现有框架)中花费时间,并了解该结构如何为您提供帮助。


如果您从未尝试过任何CGI编程,那么我认为使用DIY方法进行一个项目(也许只是一个适合自己的示例游戏站点)是值得的。与使用框架相比,您将学到更多有关所有各个部分如何工作的知识。这将帮助您设计和调试,等等,无论将来如何编写所有Web应用程序。

我个人现在使用Django。真正的好处是非常快速的应用程序部署。对象关系映射使事物快速移动,并且模板库使用起来很有趣。此外,管理界面还为您提供了所有对象的基本CRUD屏幕,因此您无需编写任何"无聊的"东西。

使用基于ORM的解决方案的不利之处在于,如果出于性能原因,您确实想手工制作某些SQL,尽管它仍然很有可能,但是比以前要难得多。


对于较小的项目,自己滚动是很容易的。 尤其是您可以像Genshi那样简单地导入一个模板引擎,并且可以非常快速,轻松地完成很多工作。 有时,使用螺丝刀比去寻找电钻更快。

完善的框架可提供更多功能,但必须首先安装和设置才能利用该功能。 对于较大的项目,这是可以忽略的问题,但是对于较小的项目,这可能会花费您大部分时间-尤其是在不熟悉框架的情况下。


好的,rails实际上是相当不错的,但是其中发生了太多的魔术(从Ruby的世界来看,我更喜欢merb而不是rails)。我个人使用Pylons,非常高兴。我想说(与django相比),与django相比,挂架使您可以更轻松地互换int内部零件。缺点是您将不得不自己编写更多内容(例如基本的CRUD)。

使用框架的优点:

  • 快速完成工作(我的意思是,一旦您了解框架,就可以快速进行处理)
  • 一切都符合标准(滚动自己的标准可能不那么容易)
  • 无需阅读大量的文章和文档,更容易实现某些工作(许多教程)
  • 缺点:

  • 你少学
  • 难于更换零件(在塔架中问题不大,而django更是如此)
  • 难以调整一些底层的内容(例如上述SQL)
  • 由此,您可能可以设计出它们的优点:-)既然获得了所有代码,就可以对其进行调整,以适应最复杂的情??况(定向塔现在应该可以在Google App引擎上运行...)。


    推荐阅读