Python中Web编程的不同方法的优缺点

时间:2008-09-04 13:00:14

标签: python frameworks cgi wsgi

我想使用Python做一些服务器端脚本。但是我有很多方法可以做到这一点。

它从自己动手的CGI方法开始,似乎以一些非常强大的框架结束,这些框架基本上可以完成所有工作。还有很多内容,例如web.pyPyroxideDjango

  • 您使用的框架或方法的专业缺点是什么?
  • 有什么权衡
  • 对于什么样的项目他们做得好以及做得不好?

编辑:我还没有太多关于网络编程的经验 我想避免解析参数URL等基本和繁琐的事情。
另一方面,虽然blog created in 15 minutesRuby on Rails的视频给我留下了深刻的印象,但我意识到我隐藏了数以百计的东西 - 如果您需要立即编写有效的Web应用程序,这很酷,但对真正理解魔法并不是那么好 - 这就是我现在所寻求的。

9 个答案:

答案 0 :(得分:17)

CGI非常适合低流量网站,但它在其他方面存在一些性能问题。这是因为每次请求进入时,服务器都会在自己的进程中启动CGI应用程序。这有两个原因:1)启动和停止进程可能需要一些时间; 2)您无法在内存中缓存任何内容。你可以选择FastCGI,但我认为如果你要走这条路,你最好还是写一个直的WSGI应用程序(WSGI的工作方式真的不是一个整体很多不同于CGI)。

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

就个人而言,我不喜欢那些对我来说太神奇的框架,而不喜欢混合搭配技术,但我被告知我也完全疯了。 :)

您有多少网络编程经验?如果你是初学者,我会说与Django一起去。如果你有更多的经验,我会说到你找到合适的方法和技巧,然后才能找到合适的方法和技巧。

答案 1 :(得分:12)

最简单的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。同样,这是个人偏好。

我个人使用混合的Web框架,使用CherryPy作为我的Web服务器(表单参数,会话处理,url映射等)和Django作为我的对象关系映射和模板。我的建议是从一个高级Web框架开始,按照其教程开始工作,然后开始一个小型的个人项目。我用我提到的所有技术做到了这一点,这真的很有用。最终,您将对自己喜欢的内容有所了解,并在此过程中成为更好的Web程序员(以及更好的程序员)。

答案 2 :(得分:7)

如果您决定使用基于WSGI的框架(例如TurboGears),我建议您阅读Ian Bicking撰写的优秀文章Another Do-It-Yourself Framework

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

另外,请查看Kevin Dangoor的视频Creating a web framework with WSGI。 Dangoor是TurboGears项目的创始人。

答案 3 :(得分:4)

如果你想变大,选择Django就可以了。但是如果你只是想学习,请使用已经提到的WebOb来推广自己的框架 - 这非常有趣,我相信你会学到更多东西(另外你可以使用你喜欢的组件:模板系统,网址调度员) ,数据库层,会话,等等。

在过去的两年里,我使用Django建立了几个大型网站,我只能说,Django将在20%的时间内满足80%的需求。无论您使用哪种框架,剩余20%的工作将占用80%的时间。

答案 4 :(得分:3)

总是值得做一些艰难的事情 - 一次 - 作为学习练习。一旦了解了它的工作原理,选择一个适合您应用程序的框架,然后使用它。一旦理解了角速度,就不需要重新发明轮子。 : - )

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

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

答案 5 :(得分:2)

如果你之前从未做过任何CGI编程,我认为值得做一个项目 - 也许只是一个自己的样本游戏网站 - 使用DIY方法。通过使用框架,您将学到更多关于各个部分的工作方式。这将有助于您设计和调试所有未来的Web应用程序,无论您编写它们。

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

使用基于ORM的解决方案的缺点是,如果你确实想要手工编写一些SQL,比如说出于性能原因,它会比其他方式更难,尽管仍然很有可能。

答案 6 :(得分:2)

如果您使用的是Python,那么以CGI开头,而是从WSGI开始(您可以使用wsgiref.handlers.CGIHandler将WSGI脚本作为CGI脚本运行。结果是这基本上和CGI一样低级(在教育意义上可能很有用,但也有些烦人),但不必写入完全过时的界面(并将应用程序绑定到单个流程模型)。 / p>

如果你想要一个不那么烦人但同样低级别的界面,使用WebOb就可以提供。您将实现所有逻辑,并且将会有一些您不会理解的黑暗角落,但您不必花时间弄清楚如何解析HTTP日期(它们很奇怪! )或解析POST主体。我以这种方式编写应用程序(没有任何其他框架),它完全可行。作为初学者,如果您对了解框架的作用感兴趣,我建议您这样做,因为您不可避免地要编写自己的迷你框架。 OTOH,一个真正的框架可能会教你应用程序设计和结构的良好实践。要成为一名非常优秀的网络程序员,我相信你需要认真对待;你应该理解框架所做的一切,而不是害怕它的内部,但你也应该把时间花在别人设计的周到环境中(即现有的框架),并理解这种结构如何帮助你。

答案 7 :(得分:1)

好吧,rails实际上还不错,但是那里有一点点魔法(从Ruby世界我更喜欢merb到rails)。我个人使用Pylons,非常高兴。我会说(与django相比),pylons允许你比django更容易交换内部零件。缺点是你必须自己编写更多东西(比如基本的CRUD)。

使用框架的优点:

  1. 快速完成工作(我的意思是,一旦你知道框架,我就意味着快速完成)
  2. 一切都符合标准(滚动自己时可能不容易实现)
  3. 在不阅读大量文章和文档的情况下,更容易获得一些工作(很多教程)
  4. 缺点:

    1. 你学得更少
    2. 更难更换部件(在挂架中没有那么多问题,django更是如此)
    3. 更难调整一些低级别的东西(比如上面提到的SQL)
    4. 从那以后你可以设计出它们有用的东西:-)既然你得到了所有的代码就可以调整它以适应最恶劣的情况(据说塔架现在可以在谷歌应用引擎上工作......)

答案 8 :(得分:1)

对于较小的项目,滚动自己的项目相当容易。特别是因为您可以简单地导入像Genshi这样的模板引擎,并且可以非常快速轻松地完成。有时使用螺丝刀比寻找电钻更快。

完全成熟的框架提供了更多功能,但必须先安装和设置才能充分利用这些功能。对于较大的项目,这是一个可以忽略不计的问题,但对于较小的项目,这可能会耗费大部分时间 - 特别是如果框架不熟悉的话。