2010-01-24 59 views
7

这是关于如何限制Web开发框架(如Django和ruby-on-rails)的一般性问题。Web框架的限制

我打算构建一个REST风格的Web服务,它将有一个纯粹的JSON/XML接口,没有GUI。该服务将依赖数据库,但是对于一些更重要的操作,没有明确的方式将“模型”对象直接保存到数据库表中。另外,我需要完全控制数据写入数据库的时间和方式。我将需要维护多个数据库连接,以便仅将一些连接用于读取,而将其他连接用于写入。

我看过“完整的”MVC框架,如Django和更基本的这样的web.py和塔。我现在的印象是,如果我最初使用完整的框架,事情会变得更快,但最终我会陷入困境,因为我将受到我所能做的框架的限制。如果我使用更基本的框架,将需要更长的时间才能使所有内容都能正常运行,但我可以自由地做我需要的。

这是看起来像,但我怀疑这可能是一个不正确的印象,因为有多少网站是用Django和Rails编写的。你能否提出你的意见?我完全错了,有一种方法可以轻松完成像Django或Rails这样的框架,或者根据我的要求,我应该使用类似web.py的东西?

谢谢!

+0

“最终我会卡住,因为我会被框架限制”?你认为会发生什么?请提供一个例子或报价或参考。 Django三年后,我没有遇到任何问题。但我想知道你认为你的问题会是什么。请举一个例子。 – 2010-01-24 15:18:13

+0

嗨洛特, 这可能是非常天真的,但这是我想象的一个例子。据我了解,Django自然依赖模型持久化到数据库。在你的模型中你定义了映射,其余的几乎自动发生。我的系统中的一些数据对象很适合这个,但其他人只是不这样工作。我最终会遇到一个怪异的模型对象和SQL调用混合。这已经让我充满了喜欢我与Django的战斗。 – Alex 2010-01-24 18:16:55

+0

谢谢大家提供非常有启发性的答案。由于看起来这个问题没有正确的答案,我刚刚选择了一个更完整的答案,不一定是“正确答案”之一。 – Alex 2010-01-25 02:13:08

回答

8

Web框架往往围绕网站建设优化,使得大多数正常使用情况下,更简单的实现。一旦你开始在框架中做更多的“开箱即用”的东西,你可能会发现你花更多的时间去解决它,那么你首先会节省使用它。

很难一概而论这里(尤其是因为我真的只有深入Django的了),所以我会使用基于我自己的经验开发一个JSON API提供一些建议Django的:

简单的放,我不推荐使用Django来编写REST API。以我自己的经验,我真的没有发现任何值得写作的东西。我不需要Django的模板系统,所以我真正使用的是URL调度和ORM。即使如此,我还得做一些攻击来让URL调度器做我想做的事情 - 如果我没有使用其他功能,事实上它会更快地使用不同的URL系统。在你的情况下,Django的ORM甚至不适合,因为它不支持多个数据库(除非你使用1.2 alphas ...)。由于Django缺乏良好的启动信号,Django开始看起来相当糟糕。如果我在你的鞋子里,我会为特定的库做些什么(ORM,WSGI等),然后使用它们,而不是试图弯曲和敲击Django,使其适合我的需求。

在一个完全不同的说明,你可能想看看Tornado作为一个可能的HTTP前端。它既简单又快捷。

0

与自己的能力相比,你会受到更多的限制,而不同的开发团队正致力于大型项目的共享所有这些共同部分。

1

整体而言,Rails与您所需要的一样有帮助。如果您需要使用直接的SQL加载集合,那很简单。如果你想在同一行中使用所有内置的ActiveRecord Fu,你可以。 REST风格的路由非常简单,但如果REST特定的Rails风格不能满足您的需求,则路由是完全可配置的。在Rails应用程序中,您可以根据需要使用尽可能多的或尽可能少的默认值,并且可以在所有级别重新配置。

+0

谢谢。我明白,但如果我没有使用Rails的最有用的方面,我会不会像其他人所建议的那样使用Sinatra更好? – Alex 2010-01-24 18:18:35

+0

我没有使用Sinatra,但是我从很多Rails老兵那里听到过关于它的好消息。我想问题是你的应用会有多沉重。如果它是一个有大量数据库/域逻辑的大型应用程序,那么您可能需要在适当的时候* Rails稍微更重的框架。但诚实地说,我可以给出的最好建议是坐下来看看你有什么高层次的要求,看看他们如何映射到每个框架以及框架的优势/劣势。有一点需要考虑的是Rails的学习曲线可能比你想象的要高。很多细节。 – 2010-01-24 23:40:57

5

即使您也使用框架,仍然可以充分利用所讨论语言的潜力。框架并不是一个限制因素,它基本上是一种简化应用程序某些部分开发的工具。例如,Django和rails抽象出一些数据库功能,所以你只需要担心你的模型对象。这并不意味着你不能自己做东西......

1

如果你不使用Rails的表示层,你会错过很大一部分。将对象转储到json/xml所需的功能非常小,您可以从中获得唯一的实际剩余优势,即ActiveRecord和路由,如果您无法想象您的数据干净地适合模型,那么不会留下太多。

我认为你真的只需要一个简约的框架来照顾一些基础知识。在请求/响应处理和路由方面为您提供了一些细节,并且让您不知所措。类似于Sinatra之类的Python可能会成为你的胡同。我在Scala中使用了一个名为Step的类似框架,用于基于xml/json的web服务,我关心性能(并且没有进行演示)。

我在浏览web.py,它似乎覆盖了与Sinatra/Step类似的功能级别。我觉得这是比一些更完整的功能框架更合适的方向。我并没有后悔我对Step的选择,因为代码基本上非常小,不可能不了解它,如果有需要,可以轻松扩展。

1

我已经使用Ruby/Rails多年了,而且不像我用过的所有其他语言/框架(跨越了近15年的Java,PHP,ColdFusion,ASP等等),它都能够避开你需要它。

这听起来像你可能会从像西纳特拉一个“更轻”框架中受益,但与即将发布的Rails 3发布的好处正变得越来越明显。 Rails 3让所有东西都可配置......事实上,Rails现在只是一组特殊的插件和扩展,它们都是一个无限灵活的核心。

我有兴趣在此声明:

“,该服务将依赖于数据库但对于一些比较重要的操作 的有持久化的没有明确的方式‘直接模式’对象成数据库表“。

不知道你的意思是这个声明......在某些时候你有东西进入数据库,对吧?

在最不平凡的应用程序,你很少有单一的模式绑定到请求的结束...你实际上可能的是被退回或更新机型相当复杂的网络。

如果您正在使用JSON的工作,我肯定会建议在寻找像的MongoDB数据库。 MongoDB完全基于存储JSON数据,因此可能会非常适合您的应用程序。

+0

感谢Toby Hede!要回答你的问题,一些操作会导致数据库中数据的大量重组。通过使用一系列作为单个事务提交的复杂查询,而不是修改大量模型,然后坚持它们,这将更有效地完成。 – Alex 2010-01-24 18:27:17

+0

在这种情况下,我肯定会看到类似MongoDB的东西...... Mongo将世界视为一系列可以操纵的JSON文档。另外,Rails仍然可以处理模型的任意查询。我认为Django也可以。 – 2010-01-24 23:01:32

6

大多数Web站点很适合像导轨或Django的丰富框架 - 但你正在构建一个网络服务,并且具有非常不同的权衡。

就个人而言,我更喜欢使用非常光框架的Web服务,在Python,这意味着主要在WSGI依赖(这是一个标准,而不是框架),最小高度模块化的组件,以提供一些小我可能需要的额外服务取决于服务的详细信息(WSGI非常擅长允许模块化的“中间件”组件)。

我个人最喜欢的模块化WSGI组件的集合是Werkzeug,请求和响应对象的WebOb;如果我需要模板,那么现在我倾向于使用Django Templates,如果我需要关系数据库,我更喜欢直接编写SQL(尽管SQLAlchemy有其优点!)。

但是,使用模块化组件而不是集成框架很酷的事情是,您可以改变每一种选择(并根据您的确切需要,偏好和品味随意混搭) - ) 。

1

您已经写下没有要求,您已经写下了技术决定。这完全不同。 你想实现什么?那么我们或许可以帮助你用如何来实现它们。

0

给一个尝试到Spring 3.0:See this post

+0

Spring = java,dude问起Python和Ruby,所以我假设他只对它们感兴趣。 – 2010-07-09 20:33:12

+0

Dude实际上使用“诸如”和“like”来描述他使用的2个web框架......不确定是否将他包含在Python和ruby中。 无用评论无论如何... – Philippe 2010-07-12 12:21:52

2

在平均水平,更完整的和有益的网络框架,更多的限制是,当你试图做的事情不是这样的Web框架认为是另一种方式正确的方式。一些网络框架试图提供非常有用的帮助,而不是限制性的,有些做得比其他更好。

而且一般建议有:不要打架。你会输。所以选择一个框架可以帮助你处理你想做的事情,但是不强制执行其他任何事情。对于你的web服务案例,这应该不成问题。至少在Python世界里(这是我所关心的),有很多极简主义的Web框架。 Bobo,BFG,Pylons,Werkzeug等等,这些都不会妨碍你一点。

另外不要忘记,你经常可以通过并排运行几个框架。尤其是使用诸如敏捷/ XDV等技术。例如Plone.org主要是Plon(杜)一个优秀的内容管理系统,但是如果你想做其他事情,则会受到极大的限制。因此,该网站的一部分是Trac,这是卓越的Python错误跟踪器。它们看起来都是一样的。

1

如果您知道您不打算使用ORM或创建用户界面,那么您刚刚取消了首先使用Web应用程序框架的90%。例如,如果您查看Django的功能集,那么您将使用哪些部分来实现Web服务,而您无法使用更简单的Web服务,如Werkzeug或CherryPy?

构建Web服务和构建任何接受输入并产生输出的旧黑盒之间的主要区别在于,基于HTTP的API所带来的各种技术限制,无状态问题以及幂等问题。 Web应用程序框架将为您提供一些帮助,但不是太多。

+0

谢谢罗伯特!如果我正确地理解了每个回复此主题的人都说你的回答很好地概括了人们的想法。 – Alex 2010-01-25 02:14:41