我对这个疯狂的MV*客户端框架还是个新手。它不一定是AngularJS,但我选择它是因为它对我来说比Knockout, Ember或Backbone更自然。工作流是怎样的?人们是先用AngularJS开发一个客户端应用程序,然后再把后端连接到它上面吗?
或者反过来,先在Django、Flask、Rails中构建后端,然后再将AngularJS应用程序附加到它上面?是否存在一种“正确”的做法,或者最终只是个人喜好?
我也不确定是否根据Flask或AngularJS结构我的项目?社会实践。
例如,Flask的minitwit应用的结构是这样的:
minitwit
|-- minitwit.py
|-- static
|-- css, js, images, etc...
`-- templates
|-- html files and base layout
AngularJS教程应用的结构是这样的:
angular-phonecat
|-- app
`-- css
`-- img
`-- js
`-- lib
`-- partials
`-- index.html
|-- scripts
`-- node.js server and test server files
我可以单独描绘一个Flask应用程序,也很容易看到像ToDo List这样的AngularJS应用程序,但当涉及到使用这两种技术时,我不明白它们是如何协同工作的。当你已经有了AngularJS时,我似乎不需要服务器端web框架,一个简单的Python web服务器就足够了。例如,在AngularJS的待办事项应用中,他们使用MongoLab通过Restful API与数据库对话。没有必要在后端有一个web框架。
也许我只是非常困惑,AngularJS只不过是一个花哨的jQuery库,所以我应该像在我的Flask项目中使用jQuery一样使用(假设我改变了AngularJS模板语法,使其与jinj2不冲突)。我希望我的问题能让你明白。我主要在后端工作,这个客户端框架对我来说是一个未知的领域。
编辑:新的Angular2风格指南建议了一个类似的,如果不是相同的更详细的结构。
下面的答案针对大型项目。
我花了相当多的时间思考和试验了几种方法,所以我可以将一些服务器端框架(在我的情况下是Flask与App Engine)与客户端框架(如Angular)相结合来实现后端功能。这两个答案都很好,但我想建议一个稍微不同的方法,至少在我看来,它更人性化。
在实现TODO示例时,事情非常简单。当你开始为用户体验添加功能和小细节时,你很容易迷失在风格和javascript等的混乱中。
我的应用程序开始变得相当大,所以我必须后退一步重新考虑。最初,像上面建议的方法可以工作,把所有的样式和所有的JavaScript放在一起,但它不是模块化的,不容易维护。
如果我们按特性组织客户端代码,而不是按文件类型组织:
app
|-- server
|-- controllers
|-- app.py
|-- models
|-- model.py
|-- templates
|-- index.html
|-- static
|-- img
|-- client
|-- app.js
|-- main_style.css
|-- foo_feature
|-- controller.js
|-- directive.js
|-- service.js
|-- style.css
|-- html_file.tpl.html
|-- bar_feature
|-- controller.js
|-- directive.js
|-- service.js
|-- style.css
|-- html_file.tpl.html
|-- lib
|-- jquery.js
|-- angular.js
|-- ...
等等。
如果我们像这样构建它,我们可以将我们的每个目录包装在一个angular模块中。我们以一种很好的方式分割了我们的文件,当我们使用一个特定的功能时,我们不必查看不相关的代码。
一个任务运行器,如正确配置的Grunt,将能够查找、连接和编译您的文件没有太多的麻烦。
我将开始组织Flask应用程序的标准结构如下:
app
|-- app.py
|-- static
|-- css
|-- img
|-- js
|-- templates
正如btford提到的,如果你正在开发一个Angular应用,你会想要专注于使用Angular客户端模板,而远离服务器端模板。使用render_template('index.html')会导致Flask将你的angular模板解释为jinja模板,所以它们不会正确呈现。相反,你会想要做以下事情:
@app.route("/")
def index():
return send_file('templates/index.html')
注意,使用send_file()意味着文件将被缓存,所以你可能想要使用make_response()来代替,至少在开发中:
return make_response(open('templates/index.html').read())
然后,构建应用程序的AngularJS部分,修改应用程序的结构,使其看起来像这样:
app
|-- app.py
|-- static
|-- css
|-- img
|-- js
|-- app.js, controllers.js, etc.
|-- lib
|-- angular
|-- angular.js, etc.
|-- partials
|-- templates
|-- index.html
确保index.html包含AngularJS,以及其他文件:
<script src="static/lib/angular/angular.js"></script>
此时,您还没有构造RESTful API,因此可以让js控制器返回预定义的示例数据(只是临时设置)。当你准备好了,实现RESTful API,并使用angular-resource.js将它连接到你的angular应用。
编辑:我把一个应用模板放在一起,虽然比我上面描述的要复杂一些,但它说明了如何用AngularJS + Flask构建应用,完成AngularJS和一个简单的Flask API之间的通信。如果你想看的话,这里是:https://github.com/rxl/angular-flask