我对这个疯狂的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不冲突)。我希望我的问题能让你明白。我主要在后端工作,这个客户端框架对我来说是一个未知的领域。


你可以从任何一端开始。

你是对的,你可能不需要AngularJS的完整服务器端框架。通常更好的做法是提供静态HTML/CSS/JavaScript文件,并在后端提供一个供客户端使用的RESTful API。你应该避免将服务器端模板与AngularJS客户端模板混合使用。

如果你想使用Flask来提供你的文件(可能是多余的,但你仍然可以使用它),你可以将“app”的内容从“angular-phonecat”复制到“minitwit”的“静态”文件夹中。

AngularJS更多地针对类似ajax的应用程序,而flask让你既能做老式的web应用程序,也能创建RESTful api。每种方法都有优点和缺点,所以这取决于你想做什么。如果你能给我一些见解,我也许能提出进一步的建议。


我将开始组织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


编辑:新的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,将能够查找、连接和编译您的文件没有太多的麻烦。


这个由John Lindquist (angular.js和Jetbrains大师)制作的官方Jetbrains PyCharm视频是一个很好的起点,因为它展示了flask中webservice、数据库和angular.js的相互作用。

他用flask, sqlalchemy, flask-restless和angular.js在不到25分钟的时间里创建了pinterest的克隆版本。

享受: http://www.youtube.com/watch?v=2geC50roans


另一种选择是将两者完全分开。

project
|-- server
|-- client

与flask相关的文件在server文件夹下,与angularjs相关的文件在client文件夹下。这样,更改后端或前端将更容易。例如,将来你可能想从Flask切换到Django,或者AngularJS切换到ReactJS。


我认为确定在哪一端进行大部分数据处理是很重要的——前端还是后端。 如果它是前端,那么使用angular工作流,这意味着你的flask应用程序将更像一个api,而像flask-restful这样的扩展将会结束。

但如果你像我一样,大部分工作都在后台,那么就使用flask结构,只插入angular(或者在我的情况下vue.js)来构建前端(必要时)。