Vue.jsとFlaskを一緒に使用したい:動的なフロントエンドにはVue.js、バックエンドにはFlask。それを行う?
最近この問題が発生しました(Vue.jsとFlaskの組み合わせ)。
作成するのが1)単純なVue.jsアプリであるか、2)Webpackなどのモジュールバンドラーを使用して組み合わせる必要がある、より複雑なVue.jsアプリであるかに応じて、少なくとも2つの方法があります 単一ファイルコンポーネント またはnpmパッケージ。
シンプルなVue.jsアプリ:
これは実際にはかなり簡単で、それ自体で非常に強力です。
.html
_ファイルを作成します。それ以外の場合は、アプリを入れたい_.html
_テンプレートファイルを開きます。Vue.js JavaScriptコードをHTMLと同じファイルに含めても問題がない場合、以下は、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>
_
static
フォルダーに新しいJavaScriptファイルを作成し、作成するこのアプリの名前を付けます。.html
_テンプレートファイルの下部に、Vue.jsを含めるスクリプトタグを含めます。<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js"></script>
_ <script src="%% url_for('static', filename='js/YOUR_APP_NAME.js') %%"></script>
.html
_テンプレートファイルにdiv
がid
。の新しいapp
を作成します<div id="app"></div>
_テンプレートのレンダリングにJinja2を使用している場合、変数をレンダリングするために_{{ }}
_構文を使用しないようにJinja2に指示するために数行のコードを追加する必要があります。 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__)"
_
.html
_および_.js
_ファイルにコピーします。かんたん!
Webpackを使用したより複雑なVue.jsアプリ:
npm install -g @vue/cli
_vue create my-project
_server
フォルダーとclient
フォルダーを作成することです。ここで、server
フォルダーにはFlaskサーバーコード、 client
フォルダーにはVue.jsプロジェクトコードが含まれています。app.html
_ファイルがFlask _server/templates
_フォルダーに作成され、_app.html
_で必要な静的JavaScriptおよびCSSが作成されるように、Webpack構成をセットアップします。 _server/static/app/
_フォルダー内、Vue以外の部分で使用される静的アセットから分離Flask app。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',
_
ここ(上)で、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',
_
ここ(上記)では、app.htmlファイルと静的アセットを作成する場所を設定しています。
なぜなら、Flaskの「静的」フォルダー(_/static/app/
_)内に静的アセットを生成するようにWebpackに指示しているからです...
html
ファイルにこれらのアセットを含める相対URLは、Webpackによって自動的に正しく設定されます。src=/static/app/js/app.f5b53b475d0a8ec9499e.js
_static/
_フォルダー内にあるため、それらの提供方法を自動的に認識します。これは、Flask _/static/etc.
_のURLがあると想定します。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',
_
ここ(上)では、_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')
_
ここ(上)は私のレンダー関数です。 Flaskのブループリント機能(_<blueprint_name>.route
_)を使用していますが、使用する必要はありません。
Vue-cliまたはWebpackを使用すると、プロセスを簡略化できます。単に作成する
vue.config.js
Vueプロジェクト内、参照: Vue config
module.exports = {
outputDir: "../dist",
// relative to outputDir
assetsDir: "static"
};
次に、flask app:
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")
flask static_folder
およびtemplate_folder
を同じにすることはできません。