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 编程方法的优缺点的主要内容,如果未能解决你的问题,请参考以下文章

基于IWS的Web服务与IBM i中的CGI编程的优缺点是什么?

python --- 面向对象编程

python-面向对象编程设计与开发

初入Web开发,phppython和ruby应该学哪个?

Python编程

Python 基础 —— 简介