前提
Python+Flaskで簡易なWebページを作成しています。
状況
- Flaskにおいて、ModelとViewとDB設定をファイル単位で分割したい。
- ViewとDBを共通化したファイル(「うまくいくコード」のsub.py)ではflaskのcurrent_appをモジュールを利用して、applicationの設定情報を読み込める。
- しかし、sub.pyのうち、DBクラスを分割した場合、DBクラス内でapplication.configの読み込み方がわかりません。
- 実際のコードで、DBクラスではAWSのDynamoDBへの接続情報をapplication.configから読み込もうとしています。事例を検索するとSQLAlchemyでのDB分割方法はありましたが、このスクリプトでSQLAlchemyは使用していません。そのため、db.init_app(app)といった利用ができない状況です。
うまくいくコード
main.py
Python
1from flask import Flask 2from sub import application_sub 3 4def create_app(): 5 application = Flask(__name__) 6 application.config['table_name'] = 'fuga_table' 7 return application 8 9 10if __name__ == '__main__': 11 application = create_app() 12 application.register_blueprint(application_sub) 13 application.run()
sub.py
Python
1from flask import Blueprint, current_app 2 3application_sub = Blueprint('sub', __name__) 4 5class DB(): 6 table_name = current_app.config['table_name'] 7 8@application_sub.route('/') 9def top_page(): 10 return 'hello world'
試したこと(うまくいかないコード)
以下のコードでmain.pyを実行すると、RuntimeError: Working outside of application context.
とエラーが出ます。sub2でapplication設定を読めないのはわかるのですが、対応の仕方がわかりませんでした。
main.py(変更なし)
Python
1from flask import Flask 2from sub import application_sub 3 4def create_app(): 5 application = Flask(__name__) 6 application.config['table_name'] = 'fuga_table' 7 return application 8 9 10if __name__ == '__main__': 11 application = create_app() 12 application.register_blueprint(application_sub) 13 application.run()
sub.py(DB設定を除外)
Python
1from flask import Blueprint, current_app 2from sub2 import DB 3 4application_sub = Blueprint('sub', __name__) 5 6@application_sub.route('/') 7def top_page(): 8 return 'hello world'
sub2.py(DB設定)
Python
1from flask import current_app 2 3class DB(): 4 table_name = current_app.config['table_name']
実際のDBファイルのイメージ
実際のDBは以下のようになっています。
DB
Python
1from pynamodb.models import Model 2from pynamodb.attributes import UnicodeAttribute 3 4class DB(Model): 5 class Meta: 6 table_name = application.config.get('TABLE_NAME') 7 region = application.config.get('AWS_REGION') 8 aws_access_key_id = application.config.get('AWS_ACCESS_KEY_ID') 9 aws_secret_access_key = application.config.get('AWS_SECRET_ACCESS_KEY') 10 11 partition_key = UnicodeAttribute(hash_key=True, null=False)
View
Python
1from sub import DB 2 3@application.route('/', methods=['GET']) 4def top_page(): 5 entries = DB_Training.scan() 6 entries = sorted(entries, key=lambda x: x.partition_key, reverse=True) 7 return render_template('entries/top_page.html', registration_data=entries) 8

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/11/28 02:52
2022/11/28 13:42 編集