关于框架: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引擎上运行...)。


    推荐阅读

      linux运维操作命令?

      linux运维操作命令?,系统,网络,基础,标准,工具,信息,工作,命令,软件,数据,lin

      linux清空操作命令?

      linux清空操作命令?,系统,数据,命令,名称,不了,文件夹,文件,环境,回收站,目

      linux脚本命令输信息?

      linux脚本命令输信息?,系统,信息,代码,脚本,数据,工具,发行,命令,变量,文件,l

      linux上启动脚本命令?

      linux上启动脚本命令?,服务,状态,系统,代码,脚本,工作,周期性,命令,文件,方

      linux安装操作命令?

      linux安装操作命令?,系统,工作,地址,工具,服务,情况,信息,命令,最新,管理,lin

      linux操作系mv命令?

      linux操作系mv命令?,名字,系统,软件,文件,命令,信息,地址,目录,文件夹,源文

      linux操作命令大全图?

      linux操作命令大全图?,工作,地址,系统,信息,命令,目录,控制台,功能,操作,内

      linux操作命令论文?

      linux操作命令论文?,管理,系统,设计,网络,企业,基础,机电设备,技术,发展,机

      linux下编写脚本命令?

      linux下编写脚本命令?,代码,时间,工具,标准,系统,实战,平台,最新,网站,文件,l

      linux定时器脚本命令?

      linux定时器脚本命令?,系统,代码,时间,工具,工作,定期,周期性,异常,任务,脚

      linux停止脚本命令行?

      linux停止脚本命令行?,系统,工作,平台,命令,基础,第一,环境,信息,终端,程序,

      linux命令运行脚本?

      linux命令运行脚本?,代码,系统,工作,设计,状态,命令,脚本,文件,目录,终端,运

      linux操作命令cp?

      linux操作命令cp?,系统,文件,命令,源文件,基本知识,时间,目录,文件夹,选项,

      linux操作命令及用法?

      linux操作命令及用法?,工作,地址,系统,管理,信息,命令,目录,网络,文件,操作,L

      linux脚本赋权限命令?

      linux脚本赋权限命令?,系统,档案,工作,命令,工具,脚本,权限,文件,程序,文件

      linux基础命令和操作?

      linux基础命令和操作?,工作,地址,基础,命令,管理,标准,系统,目录,单位,信息,l

      linux关闭脚本命令?

      linux关闭脚本命令?,系统,服务,状态,命令,档案,暂停,软件,工具,数据,电脑,lin

      linux激活脚本命令?

      linux激活脚本命令?,系统,信息,环境,脚本,命令,代码,服务,工具,标准,官网,如

      linux中查询操作命令?

      linux中查询操作命令?,信息,系统,名称,命令,地址,数字,指令,用户,历史,文件,

      linux线程操作命令?

      linux线程操作命令?,系统,工作,时间,代码,线程,信息,第一,命令,函数,操作,lin