Vue.jsとFlaskでSPA(Single Page Application)
Vue.jsとFlaskでSPA(Single Page Application) 普段はフロント側を書く機会がほとんど無いのですが、プロジェクトをモダンなフレームワークに順次対応していきたいと思い、勉強を兼ねてVue. […]
Filter by Category
Vue.jsとFlaskでSPA(Single Page Application) 普段はフロント側を書く機会がほとんど無いのですが、プロジェクトをモダンなフレームワークに順次対応していきたいと思い、勉強を兼ねてVue. […]
コマンドラインからPyCharmを起動する Pythonで開発する時は必ず使っているJetBrains社のPyCharmですが、全部入りのIDEであるが故に仮想環境やフレームワークの自動設定などのサポートが手厚いことがか […]
tcp 0.0.0.0:5000: bind: address already in use FlaskやFastAPIで開発することも増えてきたので5000番のポートを使用する機会が増えました。Djangoで開発する時 […]
Flaskで発生するsignal only works in main threadの解決方法 Flaskで開発中のアプリケーションを起動すると以下のエラーが発生する場合があります。このエラーは、Flaskではmain関 […]
AWS Cloud9にPython3.9をインストール AWSのCloud9(Ubuntu)にはデフォルトでPython 3.6.9がインストールされています。 openaiに必要なpandasのインストール opena […]
PyCharmで.txtファイルで発生するRequirementsTokenTypeというエラー PyCharmで拡張子が.txtファイルを開くとエディタに以下のようなエラーが発生します。 PyCharmでは.txtはr […]
お名前.comからXserver Domainにドメイン移管 年末や年度末になるとサーバーやドメインの新規契約や更新の時期ですよね。その時々で費用や使いやすさを重視してサービスを選んだ結果、別々の会社で管理されているドメ […]
AWSのCloud9を使ってPythonのプログラミング研修を開催 2022年11月から2023年2月までの期間で、群馬県庁職員を対象にしたDXを促進するためのPythonによるプログラミング研修を開催しました。現在、群 […]
ConoHa WINGからロリポップにWordPressを引っ越し WordPressを運営していくと処理できるアクセス数やコストなど、様々な理由でサーバーの移行を考えるタイミングがあります。今までWordPressの移 […]
AttributeError: module ‘numpy’ has no attribute ‘float’ numpyを使ったライブラリをコマンド実行した際に以下のエラ […]
YouTube APIキーの取得方法 普段はログインフォームにIDとパスワードを入力してログインしていたサービスでもAPIが提供されていれば、Pythonなどのプログラムからコンテンツのアップロードや取得といった操作を行 […]
2022年に最も読まれた記事ランキング あけましておめでとうございます2023年もどうぞよろしくお願いします ファントムでは「情報技術で人々の暮らしを豊かにする」という企業理念で、2023年も皆様のお役に立てるよう精進し […]
Sentryのエラー検知をSlackに通知 前回に引き続き、今回はSentryとSlackの連携方法について説明します。 SentryとSlackの連携機能は導入する決め手となった理由の一つです。デフォルトではメールアド […]
コピペでOK! エラー検知・監視でSentryを導入 システムを運用していくうえで避けては通れないシステムの監視とエラーの検知ですが、ファントムではSentryというサービスを利用しています。SentryとSlackを連 […]
PythonからDeepLのAPIを使って翻訳 最先端のAI技術を使った世界最高レベルの機械翻訳のDeepLをAPIで操作します。deeplのライブラリを使うとPythonで書く通常のPOSTのコードよりも記述量を少なく […]
rembgで背景を削除した画像を編集して元の画像と再合成 YouTubeにアップロードしたrembgで背景を削除する説明動画にコメントをいただいたので、rembgを使った画像処理の続編です。rembgで背景を削除した画像 […]
Rembgで画像から背景を削除 先日、SNSで見た画像の背景を削除して切り抜くPythonのライブラリを見つけたので早速試してみました。普段業務で画像の背景を処理することも多くソフトを使って背景を削除していたので、Pyt […]
競艇で実装した戦略を紹介します。 1着率を正規化 まず試したのはそれぞれの選手の1着率を全試合から計算してそれをその試合ごとに正規化する方法です。 期待値はオッズと確率の積で表せるので、確率を計算することで相対的にどの券 […]
MacにGoProをウェブカメラとして認識させてOpenCVで使う MacとGoProを繋ぎ、GoProをウェブカメラとして認識させてOpenCVに映像を入力します。今回は映像を取り込んで画面に表示するだけですが、Pyt […]
Raspberry PiにInsightFaceをインストールできなかった 顔検出や顔認証、属性判定ができるInsightFaceというライブラリを使ってRaspberry Piで属性判定に挑戦しましたが、結果的にRas […]
普段はフロント側を書く機会がほとんど無いのですが、プロジェクトをモダンなフレームワークに順次対応していきたいと思い、勉強を兼ねてVue.jsとFlaskでSPAに初挑戦しました。ネット上にある記事はVue2で書かれていることが多く、router周りの設定でエラーが発生してそのままでは起動できなかったので、Vue3に対応したコードで書き換えています。
PC: MacBook Pro (14, 2021)
OS: macOS Monterey 12.0.1
Python: 3.9.1
Flask: 2.2.3
Vue: 3.2.47
※vue createコマンドで生成されるnode_modulesと仮想環境のvenvは非表示にしています。
.
├── backend
│ └── app.py
└── frontend
├── README.md
├── babel.config.js
├── config
│ └── index.js
├── dist
│ ├── favicon.ico
│ ├── index.html
│ └── static
│ ├── css
│ │ └── app.c5557091.css
│ └── js
│ ├── app.81ccbf27.js
│ ├── app.81ccbf27.js.map
│ ├── chunk-vendors.4f456998.js
│ └── chunk-vendors.4f456998.js.map
├── jsconfig.json
├── package-lock.json
├── package.json
├── public
│ ├── favicon.ico
│ └── index.html
├── src
│ ├── App.vue
│ ├── assets
│ │ └── logo.png
│ ├── components
│ │ ├── AvoutView.vue
│ │ └── HomeView.vue
│ ├── main.js
│ └── router
│ └── index.js
└── vue.config.js
初めに@vue/cliをインストールします。既にインストールされていれば飛ばします。
npm install -g @vue/cli
vue -V
で以下のように表示されればインストールできています。
@vue/cli 5.0.8
vueのアプリケーションを作成します。(frontendの部分は任意の名前でOKです)
vue create frontend
Vue3で開発していくのでVue 3を選択してエンターを押して実行します。(デフォルトで選択されているので、そのままエンターでOK)コマンドを実行するとfrontendディレクトリが追加されます。
以下の画像のようにそれぞれコマンドを実行して開発サーバーを起動します。
cd frontend
npm run serve
画像のように表示されたら、http://localhost:8080/にアクセスして開発サーバーが起動できているか確認します。起動に成功すると以下の画像のように表示されます。
別タブなどで新規のターミナルを開いて.vueファイルの追加を行います。.vueファイルがあるcomponentsディレクトリに移動して編集を行います。
cd frontend/src/components
最初からあるHelloWorld.vueは使わないので削除します。続けてHomeView.vueとAboutView.vueを作成します。
rm -r HelloWorld.vue
touch HomeView.vue AboutView.vue
src/components/HomeView.vue
<template>
<div>
<p>Home</p>
</div>
</template>
src/components/AboutView.vue
<template>
<div>
<p>About</p>
</div>
</template>
src/App.vue
src内にあるApp.vueを以下のように差し替えます。
<template>
<div id="app">
<h1>Vue with Flask</h1>
<router-view />
</div>
</template>
<script>
export default {
name: 'App',
}
</script>
<style>
#app {
text-align: center;
}
</style>
http://localhost:8080/にアクセスして以下のように表示されていれば成功です。
各URLに合わせて表示するページを切り替える設定を行います。srcディレクトリに戻り、vue-routerのインストールとrouterディレクトリを作成します。routerディレクトリを作成したらルーティング用のindex.jsを作成します。
cd ../
npm install vue-router
mkdir router
touch router/index.js
src/router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import HomeView from '../components/HomeView';
import AboutView from '../components/AboutView.vue';
const router = createRouter({
history: createWebHistory(),
routes: [
{name: 'Home', path: '/', component: HomeView},
{name: 'About', path: '/about', component: AboutView},
],
});
export default router;
src/main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'
createApp(App)
.use(router)
.mount('#app')
http://localhost:8080/とhttp://localhost:8080/aboutにアクセスしてそれぞれ表示されているか確認します。
次はFlaskの設定を行ないます。ターミナル等の別タブで新規ディレクトリとpyファイルを追加します。
mkdir backend
touch backend/app.py
pipでFlaskをインストールします。
pip install flask
backend/app.py
from flask import Flask, render_template
app = Flask(__name__,
static_folder="../frontend/dist/static",
template_folder="../frontend/dist"
)
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
return render_template("index.html")
Flaskはapp.pyのstatic_folder
とtemplate_folder
に指定したdist/staticからファイルを読み込みますが、そのままnpm run buildコマンドでビルドするとstaticが生成されないので、以下のようにビルドしたファイルを保存するディレクトリ(dist/static)を指定します。assetsDir: “static”を追記することでビルドしたファイルがdist/staticに保存されます。
frontend/vue.config.js
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
assetsDir: "static",
})
ビルドコマンドを実行します。ビルドが完了するとfrontendディレクトリにdistディレクトリが追加されます。このディレクトリにVue側で作成したファイルが生成されています。
npm run build
flask runコマンドでFlaskサーバーを起動します。
FLASK_APP=backend/app.py flask run
http://127.0.0.1:5000/とhttp://127.0.0.1:5000/aboutでそれぞれ表示が変わっている確認します。npm run serveで起動していたフロント側の開発サーバーはCtrl+Cで停止します。
Vue.jsはコンポーネントと呼ばれる要素を他のページから呼びせる仕組みがとても便利です。例えばヘッダーやフッターなどの共通の要素をコンポーネント化しておけば必要なところで読み込むことができます。変更が必要なときも元のファイルを変更すれば、使用している全てのページにも反映されるので保守性にも優れています。
群馬県でPythonを使ったAIやソフトウェアを開発している株式会社ファントムが運営しています。
メーリングリストに登録するとファントムの最新情報をお届けします
お客様のメールアドレスを共有することはありません