如何将Vue.js与Flask结合使用?

Nat*_*les 14 flask webpack vue.js vuejs2

我想一起使用Vue.js和Flask:Vue.js用于动态前端,Flask用于后端.我怎样才能做到这一点?

Nat*_*les 30

我最近有这个问题(结合Vue.js和Flask).

根据您是创建1)一个简单的Vue.js应用程序还是2)一个更复杂的Vue.js应用程序需要使用像Webpack这样的模块捆绑器来组合单个文件,至少有两种方法可以将它们组合起来.组件或npm包.


简单的Vue.js应用程序:

这实际上相当简单,非常强大:

  1. 如果您希望Vue.js功能("app")位于其自己的页面上,请创建一个新的模板.html文件.否则只需打开.html您希望应用程序所在的模板文件.
    • 这是您的Vue.js模板代码的用武之地.
  2. 如果您将Vue.js JavaScript代码放在与HTML相同的文件中,那么下面是一个简单的"Hello World"示例模板,您可以使用它来了解Flask模板文件中需要的内容:

    <head>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
    </head>
    <body>
    <div id="app">
        <p>{{ message }}</p>
    </div>
    <script>
    new Vue({
      el: '#app',
      data: {
        message: 'Hello Vue.js!'
      }
    })
    </script>
    </body>
    
    Run Code Online (Sandbox Code Playgroud)
    • 请注意,此示例包含Flask模板文件中的Vue.js JavaScript代码,因此您无需单独包含Vue.js JavaScript.对于较小的项目,这可能更容易.
  3. 或者,如果您希望Vue.js JavaScript代码位于其自己的文件中:
    1. 在您的static文件夹中创建一个新的JavaScript文件,在您要创建的此应用程序之后命名.
      • 这是您的Vue.js JavaScript代码的用武之地.
    2. .html模板文件的底部包含一个包含Vue.js的脚本标记.
      • <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js"></script>
        • 请注意,该版本号将更改,因此不要只复制该行.您可以在此处获取最新版本的链接.
    3. 同样在该模板文件中,也在底部,包含一个脚本标记,用于加载刚刚创建的JavaScript文件.
      • <script src="%% url_for('static', filename='js/YOUR_APP_NAME.js') %%"></script>
    4. 创建一个新div.html有一个模板文件idapp.
      • <div id="app"></div>
  4. 如果你使用Jinja2来渲染模板,你需要添加几行代码来告诉Jinja2不要使用{{ }}语法来渲染变量,因为我们需要Vue.js的那些双花括号符号.以下是您需要添加到您的代码app.py:

    class CustomFlask(Flask):
        jinja_options = Flask.jinja_options.copy()
        jinja_options.update(dict(
            variable_start_string='%%',  # Default is '{{', I'm changing this because Vue.js uses '{{' / '}}'
            variable_end_string='%%',
        ))
    
    app = CustomFlask(__name__)  # This replaces your existing "app = Flask(__name__)"
    
    Run Code Online (Sandbox Code Playgroud)
    • 请注意,如果您切换Flask的语法,Flask-Bootstrap将无法工作,因为Flask-Bootstrap有自己的模板,它仍然包含"{{"/"}}"语法.你可以在这里看到如何改变Vue.js的语法,它比改变Flask的语法更容易.
  5. 像往常一样服务页面./像往常一样渲染模板文件.
  6. 如果你想,用一个Vue.js 2.0的Hello World的jsfiddle做一些快速原型,然后在代码复制到你.html.js文件.
    • 确保小提琴使用的是最新版本的Vue.js!

简单!


使用Webpack的更复杂的Vue.js应用程序:

  1. 安装节点(它带有npm,这是我们需要的).
  2. 安装vue-cli:
    • npm install -g @vue/cli
  3. 创建一个新的Vue.js Webpack项目:
    • vue create my-project
    • 一种方法是创建一个server文件夹和一个client文件夹,其中该server文件夹包含Flask服务器代码,该client文件夹包含Vue.js项目代码.
    • 另一种方法是将Vue.js项目作为Flask项目中的文件夹包含在内.
  4. 设置Webpack配置,以便app.html在Flask server/templates文件夹中创建文件,并app.htmlserver/static/app/文件夹中创建所需的静态JavaScript和CSS ,与Flask应用程序的非Vue部分使用的静态资源隔离.
  5. 当您想要将Vue.js项目与Flask项目结合使用时,请npm run build从包含Vue.js项目的文件夹中运行,该项目将生成一个.html文件和几个静态文件(JavaScript和CSS).

我对我的Webpack配置所做的确切更改(通过我的git commit):

client/build/webpack.dev.conf.js:

new HtmlWebpackPlugin({
-   filename: 'index.html',
-   template: 'index.html',
+   filename: 'app.html',
+   template: 'app.html',
Run Code Online (Sandbox Code Playgroud)

这里(上图)我正在将Vue.js'启动'文件的名称更改为app.html,这样它就不会与我的Flask应用程序的'index.html'冲突.


client/config/index.js:

module.exports = {
  build: {
    env: require('./prod.env'),
-    index: path.resolve(__dirname, '../dist/index.html'),
-    assetsRoot: path.resolve(__dirname, '../dist'),
-    assetsSubDirectory: 'static',
-    assetsPublicPath: '/',
+    index: path.resolve(__dirname, '../../server/templates/app.html'),
+    assetsRoot: path.resolve(__dirname, '../../server/static/app'),
+    assetsSubDirectory: '',
+    assetsPublicPath: '/static/app',
Run Code Online (Sandbox Code Playgroud)

这里(上图)我正在设置应该创建app.html文件和静态资产的位置.

因为我们指示Webpack在Flask的"静态"文件夹(/static/app/)中生成静态资产......

  1. htmlWebpack将自动正确设置包含文件中这些资产的相对URL .
    • 例如: src=/static/app/js/app.f5b53b475d0a8ec9499e.js
  2. 当查询这些URL上的文件时,Flask将自动知道如何提供它们,因为它们位于static/文件夹中,Flask假定该文件夹具有/static/etc.URL.
    • 唯一需要Flask路由的生成文件是app.html文件.

client/build/webpack.prod.conf.js:

new HtmlWebpackPlugin({
  filename: process.env.NODE_ENV === 'testing'
-    ? 'index.html'
+    ? 'app.html'
    : config.build.index,
-  template: 'index.html',
+  template: 'app.html',
Run Code Online (Sandbox Code Playgroud)

在这里(上图)我只是重命名'发布'页面,与中相同webpack.dev.conf.js.


routes.py:

@web_routes.route('/app')
@login_required
def app():
    if current_user.datetime_subscription_valid_until < datetime.datetime.utcnow():
        return redirect(url_for('web_routes.pay'))

    return render_template('app.html')
Run Code Online (Sandbox Code Playgroud)

这里(上图)是我的渲染功能.我正在使用Flask的蓝图功能(<blueprint_name>.route),但你不必这样做.


Syc*_*jam 12

使用 vue-cli 或 Webpack 时,可以简化流程。只需创建

vue.config.js在您的 Vue 项目中,请参阅:Vue 配置

module.exports = {
    outputDir: "../dist",

    // relative to outputDir
    assetsDir: "static" 
};
Run Code Online (Sandbox Code Playgroud)

然后配置您的烧瓶应用程序:

app.py

module.exports = {
    outputDir: "../dist",

    // relative to outputDir
    assetsDir: "static" 
};
Run Code Online (Sandbox Code Playgroud)

注意,在flaskstatic_foldertemplate_folder不能相同。