current_appの説明がしっくりと理解できません。
flaskでORMを書いていますが、調べながら見よう見まねで動かしつつ、flask-migrateを実行してmigrationファイルができるという状況です。
しかし、ちゃんと理解できていません。とりわけ、current_appについて理解できていません。
current_appを理解するためには、公式ドキュメントの以下の点について理解する必要があると思っています。
-
まず、なぜproxyの話がでてくるのか? migrationコマンドを実行する時にthe current requestを送っていないと思います。もし、requestをどこかで送っているとしてら、どの部分でそういうコードをかいているのか?
blueprintsは使っていないし、そもそもapplication factory patternという言葉が曖昧で意味がわからないが使っていいないと思うので関係がないと思うが、import itのitは何をさしているのか?
migrationを実行するときに、このアプリケーションを実行するためにたてるサーバーとは別にもう一つmigrationようにサーバーをたててrunしているのか?それは、以下のコードのどの部分で行われているのか?
以下、公式ドキュメントからの抜粋
http://flask.pocoo.org/docs/1.0/api/#flask.current_app
flask.current_app A proxy to the application handling the current request. This is useful to access the application without needing to import it, or if it can’t be imported, such as when using the application factory pattern or in blueprints and extensions. This is only available when an application context is pushed. This happens automatically during requests and CLI commands. It can be controlled manually with app_context(). This is a proxy. See Notes On Proxies for more information.
以下、実際にちゃんと理解せず使ってなんとか動かしている箇所
python
1from flask import Flask 2from flask_sqlalchemy import SQLAlchemy 3from c.config import test 4from flask_migrate import Migrate 5 6current_app = Flask(__name__) 7from c.models.models import db 8current_app.config['JSON_AS_ASCII'] = False 9current_app.config.from_object(test) 10migrate = Migrate(current_app, db) 11 12 13with current_app.app_context(): 14 config.set_main_option('sqlalchemy.url', 15 current_app.config.get('SQLALCHEMY_DATABASE_URI')) 16 target_metadata = db.metadata 17 18... 19... 20... 21 22def run_migrations_online(): 23 """Run migrations in 'online' mode. 24 25 In this scenario we need to create an Engine 26 and associate a connection with the context. 27 28 """ 29 30 # this callback is used to prevent an auto-migration from being generated 31 # when there are no changes to the schema 32 # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html 33 def process_revision_directives(context, revision, directives): 34 if getattr(config.cmd_opts, 'autogenerate', False): 35 script = directives[0] 36 if script.upgrade_ops.is_empty(): 37 directives[:] = [] 38 logger.info('No changes in schema detected.') 39 40 engine = engine_from_config(config.get_section(config.config_ini_section), 41 prefix='sqlalchemy.', 42 poolclass=pool.NullPool) 43 44 connection = engine.connect() 45 context.configure(connection=connection, 46 target_metadata=target_metadata, 47 process_revision_directives=process_revision_directives, 48 **current_app.extensions['migrate'].configure_args) 49 50 try: 51 with context.begin_transaction(): 52 context.run_migrations() 53 finally: 54 connection.close() 55 56if context.is_offline_mode(): 57 run_migrations_offline() 58else: 59 run_migrations_online()
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/08 15:26
2018/08/08 16:45 編集
2018/08/09 05:41