Flaskでのアプリケーションの作成は初めてですが、MySQLに接続し、テーブルの作成を行いたく、Flask-SQLAlchemyでモデルを別々のファイルに分割しようと考えております。
実行すると、下記エラーが吐かれてしまいます。
RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.
階層構造
skip/
├ app.py
├ database.py
├ config.py
├ views/
| └ skip_view.py
└ models/
| └ user.py
環境
・CentOS7
・Python3.6
・Flask2.0.2
・Flask-SQLAlchemy2.5.1
発生しているエラーログ
Traceback (most recent call last): File "/var/www/skip/app.py", line 2, in <module> from views import skip_view File "./views/skip_view.py", line 3, in <module> from models.user import User File "./models/user.py", line 1, in <module> from database import db File "./database.py", line 1, in <module> from flask_sqlalchemy import SQLAlchemy ModuleNotFoundError: No module named 'flask_sqlalchemy'
該当するソースコード
app.py
from flask import Flask from views import skip_view from database import db import config def create_app(): app = Flask(__name__) # DB設定を読み込む app.config.from_object('config.Config') db.init_app(app) app.register_blueprint(skip_view.app) return app app = create_app() if __name__ == "__main__": app.run()
database.py
from flask_sqlalchemy import SQLAlchemy # FlaskがSQLAlchemyを使えるように初期化 db = SQLAlchemy() def init_db(app): db.init_app(app)
config.py
class SystemConfig: # DBの接続情報を設定 SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{user}:{password}@{host}/{db_name}?charset=utf8'.format(**{ 'user': 'xxxx', 'password': 'xxxxxxxx', 'host': '127.0.0.1', 'db_name': 'xxxx' }) Config = SystemConfig
views/skip_view.py
from flask import Blueprint, render_template from models.user import User # Blueprintのオブジェクトを生成する app = Blueprint('views', __name__) @app.route('/login', methods=['GET','POST']) def login(): title = "ログイン" return render_template('login.html', title=title)
models/user.py
from database import db class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) nickname = db.Column(db.String(30), unique=True, nullable=True) email = db.Column(db.String(300), unique=True, nullable=True) password = db.Column(db.Text, nullable=True) first_name = db.Column(db.String(30), nullable=True) last_name = db.Column(db.String(30), nullable=True) db.create_all()
同様のエラーが無いか探してみたところ、テーブルを作成する際に、アプリケーションコンテキストをプッシュするために、「with app.app_context()」を使用するという記事を見たのですが、上手くいかずという状況です。
エラー文からflask_sqlalchemyが読み込まれていないことが原因だと思うのですが、参考にしているサイトでは、上記のコードで記載されていたので、何が原因なのかが分かりませんでした。
何か原因が分かる方がいらっしゃいましたら、ご教授頂けますと幸いです。
その他に必要な情報がありましたら提示いたします。
よろしくお願いいたします。
まだ回答がついていません
会員登録して回答してみよう