使用Python进行网络编程的不同方法的优缺点
我想使用Python进行一些服务器端脚本编写。但是我对执行此操作的方式迷茫了。
它以自己动手的CGI方法开始,并且似乎以一些非常健壮的框架结束,这些框架基本上可以自己完成所有工作。中间还有很多东西,例如web.py,Pyroxide和Django。
- 我们所研究的框架或者方法的优缺点是什么?
- 有哪些权衡取舍?
- 他们擅长于哪些项目,而擅长于哪些项目?
编辑:我还没有太多的Web编程经验。
我想避免一些基本而乏味的事情,例如解析URL中的参数等。
另一方面,用Ruby on Rails在15分钟内创建的博客视频给我留下了深刻的印象,但我意识到,隐藏了数百件事,如果我们需要立即编写可运行的Web应用程序,这很酷,但事实并非如此。非常适合真正理解魔术,这就是我现在要寻找的。
解决方案
回答
如果我们从未尝试过任何CGI编程,那么我认为值得进行一个项目,也许只是一个使用DIY方法的示例游戏站点。与使用框架相比,我们将学到更多有关所有各个部分如何工作的知识。这将有助于我们设计和调试,等等,无论将来如何编写所有Web应用程序。
我现在个人使用Django。真正的好处是非常快速的应用程序部署。对象关系映射使事物快速移动,并且模板库使用起来很有趣。此外,管理界面还为我们提供了所有对象的基本CRUD屏幕,因此我们无需编写任何"无聊的"东西。
使用基于ORM的解决方案的不利之处在于,如果出于性能原因,我们确实想手工制作一些SQL,尽管它仍然很有可能,但比以前要难得多。
回答
如果我们决定使用基于WSGI的框架(例如TurboGears),我建议我们阅读Ian Bicking撰写的出色的文章《自己动手做另一个框架》。
在本文中,他从头开始构建了一个简单的Web应用程序框架。
另外,请观看Kevin Dangoor的视频"使用WSGI创建Web框架"。 Dangoor是TurboGears项目的创始人。
回答
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程序员(和一般而言更好的程序员)。
回答
好的,rails实际上是相当不错的,但是其中存在着太多的魔力(从Ruby的世界来看,我更喜欢merb而不是rails)。我个人使用Pylons,非常高兴。我要说(与django相比),与django相比,挂架使我们可以更轻松地互换int内部零件。缺点是我们将不得不自己编写更多内容(例如基本的CRUD)。
使用框架的优点:
- 快速完成工作(我的意思是,一旦我们了解框架,就可以快速进行处理)
- 一切都符合标准(滚动自己的标准可能不那么容易)
- 无需阅读大量的文章和文档,更容易实现某些工作(许多教程)
缺点:
- 你少学
- 难于更换零件(在塔架中问题不大,而django更是如此)
- 难以调整一些低级内容(例如上述SQL)
由此,我们可能可以设计出它们的优点:-)既然获得了所有代码,就可以对其进行调整,以适应最复杂的情况(定向塔现在应该可以在Google App引擎上运行...)。
回答
如果我们想变大,请选择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程序员,我相信我们需要认真尝试。我们应该了解框架所做的所有事情,并且不要害怕其内部结构,但是我们也应该花时间在别人设计的周到环境(即现有框架)中,并了解该结构如何为我们提供帮助。
回答
对于较小的项目,自己滚动是很容易的。尤其是我们可以像Genshi那样简单地导入一个模板引擎,并且可以非常快速,轻松地完成很多工作。有时,使用螺丝刀比去寻找电钻更快。
完善的框架可提供更多功能,但必须首先安装和设置才能利用该功能。对于较大的项目,这是可以忽略的问题,但是对于较小的项目,这可能会花费我们大量的时间,尤其是在框架不熟悉的情况下。