Flaskとフロントエンド開発でよくあるエラーと解決策まとめ!初心者向けに丁寧に解説
生徒
「Flaskとフロントエンドを組み合わせて開発しているのですが、エラーがたくさん出てしまって困っています…。どう対処すればいいんですか?」
先生
「FlaskとHTMLやJavaScript、CSSを組み合わせると、サーバー側とフロント側の両方でエラーが出やすくなりますね。でも、原因が分かれば必ず解決できます。今日は初心者でも理解できるように、よくあるエラーとその対処法をまとめて学びましょう。」
生徒
「お願いします!どんなエラーが多いんですか?」
先生
「実際の開発現場でもよく起きる、代表的なFlask+フロントエンドのエラーを順番に紹介しますね。」
1. Flaskが静的ファイル(CSS・JS)を読み込まないエラー
Flaskでは、デフォルトでstaticフォルダ内のファイルを「静的ファイル」として扱います。しかし、CSSやJavaScriptが反映されないというトラブルが初心者によくあります。
原因は、HTMLでのパス指定が間違っていることが多いです。Flaskでは直接パスを書くのではなく、url_for()関数を使うのが正しい方法です。
<!-- 間違った書き方 -->
<link rel="stylesheet" href="/static/style.css">
<!-- 正しい書き方 -->
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
このように書くことで、Flaskが自動的に正しいURLを生成してくれるため、環境が変わっても動作します。初心者はここでつまずくことが多いので注意しましょう。
2. Jinja2テンプレートでJavaScriptが動かない
FlaskのテンプレートエンジンであるJinja2は、{{ }}や{% %}などの構文を使います。一方、JavaScriptのテンプレート文字列やフレームワーク(例:Vue.js)でも似た記号を使うため、衝突することがあります。
たとえば次のようなコードでは、FlaskがJavaScript内の{{ message }}を自分のテンプレートと勘違いしてエラーになります。
<script>
const msg = "{{ message }}"; // Flaskがここを展開してしまう
</script>
このような場合は、{% raw %}と{% endraw %}で囲むと、Flaskが中を無視してくれます。
{% raw %}
<script>
const msg = "{{ message }}"; // これでエラーにならない
</script>
{% endraw %}
このテクニックは、Vue.jsやReactをFlaskテンプレートと併用する場合にもよく使われます。
3. CORSエラー(クロスオリジン)でAPI通信ができない
フロントエンド(JavaScript)からFlaskのAPIにデータを送るとき、CORS(クロスオリジンリソースシェアリング)というセキュリティ制限に引っかかることがあります。
たとえば、フロント側がhttp://localhost:3000で動き、Flaskがhttp://127.0.0.1:5000で動いていると、ドメインが違うため通信がブロックされます。
解決策は、Flaskの拡張機能flask-corsを使うことです。
from flask import Flask, jsonify
from flask_cors import CORS
app = Flask(__name__)
CORS(app) # これを追加!
@app.route("/api/data")
def get_data():
return jsonify({"message": "CORS設定ができました!"})
これで、異なるポート番号のアプリ間でも通信できるようになります。
4. JavaScriptでFlaskのデータを取得できない
フロントエンドからFlaskのAPIを呼び出す際、URLやデータ形式が間違っていると、データを受け取れません。
たとえば、以下のようにJavaScriptから/api/dataを呼び出してデータを取得します。
<script>
fetch('/api/data')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('通信エラー:', error));
</script>
このとき、Flask側ではJSON形式で返す必要があります。文字列をそのまま返すと、ブラウザが解釈できずにエラーになります。
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/api/data")
def data():
return jsonify({"message": "こんにちは、フロントエンド!"})
このようにjsonify()を使うと、正しい形式でデータを送信できます。
5. テンプレートで変数が表示されない
FlaskのテンプレートでPythonの変数を渡したのに、画面に表示されない場合は、render_template()に渡すデータが正しく設定されていない可能性があります。
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def home():
message = "Flaskテンプレートの変数表示テスト"
return render_template("index.html", msg=message)
<!-- index.html -->
<p>{{ msg }}</p>
Python側の変数名(msg)とHTML内の変数名が一致しているかを確認しましょう。大文字小文字が違うだけでも表示されません。
6. Flaskのルーティングがうまく動かない
FlaskではURLパスを定義する際に@app.route()を使いますが、似たURLを複数登録すると競合してエラーになることがあります。
@app.route("/user")
def user_page():
return "ユーザーページ"
@app.route("/user/<name>")
def user_profile(name):
return f"{name}さんのプロフィール"
このような場合は、固定のURL(/user)と動的URL(/user/<name>)を分けて定義することで、正しくルーティングされます。
7. 開発中のよくあるトラブル対処のコツ
- 画面が更新されない: ブラウザのキャッシュを削除して再読み込み(Ctrl+F5)を試しましょう。
- 変更が反映されない: Flaskのデバッグモードを有効にします。
app.run(debug=True)を設定すれば自動リロードされます。 - フロントのJSが動かない: コンソール(開発者ツールの「Console」タブ)でエラー内容を確認しましょう。
Flaskとフロントエンドの開発は、最初は難しく感じますが、エラーを一つずつ理解すると確実にレベルアップします。