使用Python进行Web编程的不同方法的优缺点

25
我想使用Python进行一些服务器端脚本编写。但是,由于有很多方法可以实现这一点,我有点迷茫。
从自己动手的CGI方法开始,似乎到了一些相当强大的框架,基本上会自行完成所有工作。还有很多其他的东西,例如web.pyPyroxideDjango
- 你所使用过的框架或方法的优缺点是什么? - 有哪些权衡之处? - 它们适用于什么样的项目?不适用于什么样的项目?
编辑:我还没有太多的Web编程经验。
我想避免像解析URL参数这样的基本且乏味的事情。另一方面,虽然Ruby on Rails创建的博客的视频给我留下了深刻的印象,但我意识到有数百件事情对我来说是隐藏的 - 如果你需要在短时间内编写一个可工作的webapp,那么这很酷,但对于真正理解其中的魔法来说就不是那么好了 - 这就是我现在寻求的。
9个回答

17

CGI适用于低流量的网站,但对于其他情况,它存在一些性能问题。这是因为每次请求到来时,服务器都会在自己的进程中启动CGI应用程序。这有两个问题:1)启动和停止进程可能需要时间;2)无法在内存中缓存任何内容。你可以使用FastCGI,但如果打算采用该路线,我认为编写一个直接的WSGI应用程序会更好(WSGI的工作方式与CGI相比没有太大区别)。

除此之外,你的选择主要取决于你想让框架做多少工作。你可以选择像Django或Pylons这样功能齐全的框架。或者你可以选择混合搭配的方法(使用类似CherryPy的HTTP组件、SQLAlchemy的数据库组件、Paste进行部署等)。我还应该指出,大多数框架也允许你将不同的组件替换为其他组件,因此这两种方法并不一定是互斥的。

就我个人而言,我不喜欢那些为我做太多魔法的框架,更喜欢混搭技术,但我被告知我完全疯了。 :)

你有多少网络编程经验?如果你是初学者,我建议选择Django。如果你更有经验,我建议尝试不同的方法和技术,直到找到合适的。


12
最简单的Web程序是CGI脚本,它基本上只是一个程序,其标准输出被重定向到发出请求的Web浏览器。在这种方法中,每个页面都有自己的可执行文件,必须在每个请求上加载和解析。这使得快速搭建网站非常简单,但在性能和组织方面都不利于扩展。因此,当我需要一个非常动态的页面,并且不会成长为一个更大的系统时,我使用CGI脚本。
比这更高级一些的是将Python代码嵌入HTML代码中,例如使用PSP。我认为现在很少有人使用它了,因为现代模板系统已经使其过时了。我曾经使用过PSP,发现它基本上与CGI脚本具有相同的组织限制(每个页面都有自己的文件),并且还有一些由于尝试混合忽略空白的HTML和敏感空白的Python而引起的烦恼。
再往上一步,则是像web.py这样的非常简单的Web框架,我也用过它。像CGI脚本一样,快速构建和运行非常简单,您不需要任何复杂的配置或自动生成的代码。您自己的代码将非常容易理解,因此您可以看到正在发生的事情。但是,它不像其他Web框架那样功能丰富;上次我使用它时,没有会话跟踪,因此我必须自己编写。它也有“太多魔幻行为”,引用Guido的话(“upvars(),bah”)。
最后,您拥有像Django这样的功能丰富的Web框架。为了让简单的Hello World程序工作起来需要一些工作,但每个主要框架都有一个很好、书写良好的教程(尤其是Django),可以指导您完成。我强烈推荐在任何真正的项目中使用这些Web框架,因为它们非常方便,具有丰富的功能和文档等优点。
最终,您必须决定自己更喜欢什么。例如,框架都使用模板语言(特殊的代码/标记)生成HTML文件。其中一些,如Cheetah模板,允许您编写任意Python代码,以便在模板中执行任何操作。而另一些,如Django模板,则更加限制您的展示代码与程序逻辑分离。这完全取决于您个人的偏好。另一个例子是URL处理;一些框架如Django要求您通过正则表达式在应用程序中定义URL。其他框架如CherryPy根据函数名称自动映射功能到URL上。再次强调,这是个人偏好。
我个人使用混合的Web框架,使用CherryPy处理Web服务器相关内容(表单参数,会话处理,URL映射等),而使用Django处理对象关系映射和模板。我的建议是从高级Web框架开始,按照其教程逐步学习,然后开始一个小的个人项目。我已经使用所有提到的技术进行了这样的操作,效果非常好。最终,您将找到自己喜欢的东西,并在此过程中成为更好的Web程序员(以及更好的程序员)。

7

4
如果你想要大规模开发,选择Django就可以了。但如果只是想学习,可以使用已经提到的WebOb自己编写框架,这会很有趣,而且我相信你会学到更多(此外,你还可以使用你喜欢的组件:模板系统、URL分发器、数据库层、会话等等)。
在过去的两年里,我使用Django构建了几个大型站点,我只能说,Django可以在20%的时间内满足你80%的需求。剩下的20%工作将花费80%的时间,无论你使用哪个框架。

3

值得一提的是,以较困难的方式去做某事是很有价值的 - 作为学习练习。一旦你理解了它的工作原理,选择适合你的应用程序的框架并使用它。在了解角速度之后,您无需重新发明轮子。 :-)

在尝试学习Django和Python(或Ruby和Rails,或X和Y)等同时,请确保您对框架背后的编程语言有相当牢固的理解,否则可能会导致更多的混淆。先在语言中编写一些代码,然后再添加框架。

我们通过解决问题而不是使用工具来学习开发。遇到一些困难,克服它们,寻找更高的墙壁!


2
如果你正在使用Python,你不应该从CGI开始,而是应该从WSGI开始(你可以使用wsgiref.handlers.CGIHandler将你的WSGI脚本作为CGI脚本运行)。结果基本上与CGI一样低级(在教育意义上可能有用,但也会有些烦人),但不必写一个完全过时的接口(并将你的应用程序绑定到单个进程模型)。
如果你想要一个不那么烦人但类似低级的接口,使用WebOb会提供这个功能。你将会实现所有逻辑,并且会有一些你不理解的角落,但你不需要花时间去弄清楚如何解析HTTP日期(它们很奇怪!)或解析POST请求体。我以这种方式编写应用程序(没有其他框架),这是完全可行的。作为一个初学者,如果你对理解框架做了兴趣,我建议你这样做,因为你不可避免地会编写自己的迷你框架。另一方面,一个真正的框架可能会教你应用程序设计和结构的良好实践。成为一个真正优秀的Web程序员,我认为你需要认真尝试这两种方法;你应该理解框架所做的一切,不要害怕它的内部结构,但你也应该花时间在别人设计的思考环境中(即现有的框架),并理解那个结构如何帮助你。

2
如果您以前没有进行过任何CGI编程,我认为值得使用DIY方法完成一个项目——也许只是一个供自己使用的示例网站。这样您将比使用框架学到更多有关各种部件如何工作的知识。这将有助于您设计、调试和编写所有未来的Web应用程序。
个人而言,我现在使用Django。真正的好处是非常快速的应用程序部署。对象关系映射使事情快速运转,模板库使用起来非常愉快。此外,管理界面为所有对象提供了基本的CRUD屏幕,因此您不需要编写任何“无聊”的内容。
使用ORM解决方案的缺点是,如果您确实想手工制作一些SQL(例如出于性能原因),那么它比以前要难得多,尽管仍然很可能。

1

对于较小的项目,自己编写程序相当容易。特别是您可以简单地导入像Genshi这样的模板引擎,快速轻松地完成很多工作。有时候使用螺丝刀比寻找电钻更快。

完整的框架提供了更多的功能,但必须先安装和设置才能利用这些功能。对于大型项目,这是微不足道的问题,但对于较小的项目,这可能会占用大部分时间 - 特别是如果框架不熟悉。


1

好的,Rails其实非常不错,但是其中有些魔法太多了(从Ruby世界来看,我更喜欢Merb而不是Rails)。我个人使用Pylons,感觉非常满意。与Django相比,我会说Pylons可以让你更容易地更换其内部部件。缺点是你需要自己写更多东西(如基本的CRUD)。

使用框架的优点:

  1. 快速完成任务(一旦你掌握了框架,速度飞快)
  2. 一切都符合标准(如果自己开发可能不容易实现)
  3. 不必阅读海量文章和文档就可以轻松入门(有很多教程)

缺点:

  1. 学到的知识少
  2. 更换部件更困难(在Pylons中并不是很大的问题,但在Django中更为明显)
  3. 调整某些低级别的东西(如上述的SQL)更加困难

从这些方面来看,你可以大概了解它们适用于什么情况。由于你拥有所有的代码,所以可以根据需要进行微调,即使是最奇怪的情况(据说Pylons现在也可以在Google App Engine上运行...)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接