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

时间:2017-09-14 08:28:47

标签: flask webpack vue.js vuejs2

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

2 个答案:

答案 0 :(得分:26)

我最近遇到了这个问题(结合了Vue.js和Flask)。

至少有两种方法可以将它们组合起来,具体取决于您是否创建1)一个简单的Vue.js应用程序或2)一个更复杂的Vue.js应用程序需要使用像Webpack这样的模块捆绑包合并Single-File Components或npm包。

简单的Vue.js app:

这实际上非常简单且非常强大:

  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>
    
    • 请注意,此示例包含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>
        • 请注意,该版本号将会更改,因此请勿复制该行。您可以获取最新版本here的链接。
    3. 同样在该模板文件中,也在底部,包含一个脚本标记,用于加载刚刚创建的JavaScript文件。
      • <script src="%% url_for('static', filename='js/YOUR_APP_NAME.js') %%"></script>
    4. div模板文件中创建.html id app的新<div id="app"></div>
      • {{ }}
  4. 如果您使用Jinja2渲染模板,则需要添加几行代码以告知Jinja2不使用app.py语法来渲染变量,因为我们需要那些双卷曲-brace符号为Vue.js.以下是您需要添加到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__)" 执行此操作的代码:

    .html
    • 请注意,如果您切换Flask的语法,Flask-Bootstrap将无效,因为Flask-Bootstrap有自己的模板,但仍然包含&#34; {{&#34; /&#34;}}&#34;句法。您可以看到here如何更改Vue.js的语法,它比更改Flask的语法更容易。
  5. 像往常一样提供网页。 /像往常一样渲染模板文件。
  6. 如果需要,请使用Vue.js 2.0 Hello World JSFiddle进行更快速的原型设计,然后将代码复制到.jsnpm install -g @vue/cli文件中。
    • 确保小提琴使用的是最新版本的Vue.js!
  7. 容易!

    使用Webpack的更复杂的Vue.js应用

    1. Install Node(它带有npm,这是我们需要的。)
    2. 安装vue-cli
      • vue create my-project
    3. 创建一个新的Vue.js Webpack项目:
      • server
      • 执行此操作的一种方法是创建client文件夹和server文件夹,其中client文件夹包含Flask服务器代码,app.html文件夹包含Vue.js项目代码。
      • 另一种方法是将Vue.js项目作为Flask项目中的文件夹包含。
    4. 设置您的Webpack配置,以便在Flask server/templates文件夹中创建app.html文件,并在server/static/app/中创建npm run build所需的静态JavaScript和CSS }文件夹,与Flask应用程序的非Vue部分使用的静态资产隔离。
    5. 如果要将Vue.js项目与Flask项目合并,请在包含Vue.js项目的文件夹中运行.html,这将生成client/build/webpack.dev.conf.js文件和多个静态文件( JavaScript和CSS)。
    6. 我对我的Webpack配置所做的确切更改(通过我的git commit):

      new HtmlWebpackPlugin({ - filename: 'index.html', - template: 'index.html', + filename: 'app.html', + template: 'app.html',

      client/config/index.js

      在这里(上图)我正在更改Vue.js的名称&#39;启动&#39;将文件发送到app.html,这样它就不会与我的Flask app&#39; index.html&#39;冲突。

      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',

      /static/app/

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

      因为我们指导Webpack在Flask&#34;静态&#34;内生成静态资产。文件夹(html)...

      1. Webpack会自动正确设置包含src=/static/app/js/app.f5b53b475d0a8ec9499e.js文件中这些资产的相对URL。
        • 例如:static/
      2. 当查询这些网址上的文件时,Flask会自动知道如何提供这些文件,因为它们位于/static/etc.文件夹中,Flask认为该文件夹中有app.html网址。
        • 唯一需要Flask路由的生成文件是client/build/webpack.prod.conf.js文件。
      3. new HtmlWebpackPlugin({ filename: process.env.NODE_ENV === 'testing' - ? 'index.html' + ? 'app.html' : config.build.index, - template: 'index.html', + template: 'app.html',

        webpack.dev.conf.js

        在这里(上图)我只是重新命名&#39;发布&#39;页面,与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')

        <blueprint_name>.route

        这里(上图)是我的渲染功能。我使用了Flask的蓝图功能({{1}}),但您不必这样做。

答案 1 :(得分:0)

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

vue.config.js在您的Vue项目中,请参见:Vue config

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

    // relative to outputDir
    assetsDir: "static" 
};

然后配置烧瓶应用程序:

app.py

from flask import Flask, render_template

app = Flask(__name__,
            static_folder = "./dist/static",
            template_folder = "./dist")


@app.route('/')
def index():
    return render_template("index.html")

请注意,烧瓶static_foldertemplate_folder中的容器不能相同。