質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2887閲覧

どうやったらapp.configでアクセスできるようになるのか?

sequelanonymous

総合スコア123

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/08/28 18:18

編集2018/08/29 01:13

xxx.pyをどう修正したら、app.configでconfigファイルで設定している定数の文字列を使うことできるのでしょうか?

init.py

def init_db(app): db.init_app(app) Migrate(app, db) def create_app(config_name): app = Flask(__name__) app.config.from_object(config[config_name]) return app

xxx.py

import create_app impoet modulename x = app.config["TOKEN"] ... ... ...

config.py

Class config: TOKEN = 'token' ... ...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tachikoma

2018/08/28 23:39

current_appを使うような気もするのですが、それじゃダメなんでしたっけ。
sequelanonymous

2018/08/29 00:06

その使い方も調べてました。もしご存知でしたら、書き方教えて頂いてもよろしいですか?お手数おかけします。
guest

回答2

0

自己解決

from flask import current_appをし、currnt_app.config[""]をグローバルではなく、関数内に書くことでアクセスができるようになる。

投稿2018/08/30 15:59

編集2018/09/02 05:59
sequelanonymous

総合スコア123

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2018/08/30 23:14

from flask import current_app の間違いではないでしょうか?
quickquip

2018/08/31 01:44

結局xxxx.pyの中のappは「create_app関数が返したものではなかった」ということになりますか? ではいったいそのappはなんなのか? が棚上げで、後から読んだ人にはなにがおかしいかが分からないままなのが気になります。
guest

0

使い方はapp.config["TOKEN"]で問題ないはずなのでそれがうまくいってないなら、別のどこかにおかしいところがあるのだと思いますよ。
(というよりもここに引用されているソースからでは、app.config.from_object(config[config_name])で設定がちゃんとされただろうという確信は全然持てないわけです)


import create_app # ここに書けるのはモジュールなので、__init__.py にあるcreate_app関数であるはずがない impoet modulename x = app.config["TOKEN"] # 引用されたソースに名前appに束縛している箇所、importしている箇所がない
  • create_app という名前のモジュールをインポートしているっぽいが、上のコードのcreate_appモジュールで定義された名前なので、別物のはず。ここでimportしているのは一体なに?

  • このappはどこからでてきた?


def create_app(config_name): app = Flask(__name__) app.config.from_object(config[config_name]) # 引用されたソースに名前configとconfig_nameに束縛している箇所、importしている箇所がない return app # 多分こう
  • このconfigconfig_nameはどこからでてきた?
  • つくったappをreturnしてないけどただ捨ててるだけ?

というすべてが謎なコードになっているので、答えれるわけがない。
これが動いているコードではないんだろうな、と思うだけ。
たぶん、引用時の問題だろうとは思うけど……。


前にconfig.from_objectが何をするかを調べたメモがあるので書いておきますね。

引数が文字列の場合

  • まず:'を.に変換する。
  • __import__(引数) して成功するか確認。成功したら(ロードされているということだから)sys.modules[引数] を返して終わり。
  • 初めの.でsplitして、前部分をモジュール名、後部分をオブジェクト名とする。
  • まず__import__(モジュール名, None, None, [オブジェクト名]) する。失敗したら __import__(モジュール名) する。どっちかが成功したらモジュールが取り出せたものとして、getattr(モジュール, オブジェクト名)してオブジェクトを取り出す。
  • 返ってきた値をdir関数に渡して属性を取り出す。

引数が文字列でない場合引数自身をdirに渡して名前空間を属性を取り出す。

取り出した属性から全てが大文字な(正確にはisupper()が真を返す)属性名だけを選択して、それをキー/値としてconfigに取り込む。

これは理解したのでしょうか?


ということで、このconfig.pyがプロジェクトルート(実行しているスクリプトと同階層)に置かれているという前提条件で、

app.config.from_object('config.config')

が実行されているなら、configに取り込まれると思います。


環境に依って動的に app.config.from_object する相手が変わるなら、実際ここでなにを引数にfrom_objectを読んでいるのかを確かめ、直後に設定が取り出せるかを確認するのがいいと思います。
app.config.from_object が呼ばれているかも確かめられるでしょう。

投稿2018/08/29 00:15

編集2018/08/30 15:21
quickquip

総合スコア11202

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sequelanonymous

2018/08/29 01:16 編集

> create_app という名前のモジュールをインポートしているっぽいが、上のコードのcreate_appはモジュールで定義された名前なので、別物のはず。ここでimportしているのは一体なに? このappはどこからでてきた? create_appは関数です。configは、dev,local,productionごとに用意しているので、起動した環境ごとにconfigがよばれるようにしています。 app.config.from_objectは問題なく、つかえています。問題は、.from_objectによって他のファイルで記載されて読み込まれたオブジェクトをどう他のファイルで利用するかでわからずにいます。
quickquip

2018/08/29 01:33

__init__.pyに書いてあるcreate_appは確かに関数ですが、xxx.pyに書いてある方のcreate_appは、import create_appにモジュールかパッケージしか書けないんですから、関数なハズはないですよね? __init__py として引用された部分にconfigが書いてないんだからそれが何か、どこからきたのかはこちらには分かりませんよね? 質問している人が言った「起動した環境ごとにconfigがよばれるようにしています」が、どういうコードなのかはこちらには分かりませんよね? 質問している以上"うまく動いていない"と思っているのでしょうから、そのコードが"書いた人の意図通りに動いているだろう"とか"Flaskが要求している通りに書かれているだろう"と想定できるはずがないですよね? もし問題なく書かれているなら、質問するはずがないんですから。
quickquip

2018/08/29 02:50 編集

> app.config.from_objectは問題なく、つかえています。問題は、.from_objectによって他のファイルで記載されて読み込まれたオブジェクトをどう他のファイルで利用するかでわからずにいます。 質問は、xxx.pyで x = app.config["TOKEN"] しても x に 'token' がセットされない、ってことじゃないんですか? だとしたらどういう理由で「app.config.from_objectは問題なく、つかえています。」と判断したんですか? create_app 関数の中で app.config.from_object の後では、app.config["TOKEN"] して 'token' が取り出せることを確認している? ってことでしょうか? app.config.from_object がエラーになってないから何かのconfigはロードしているようだが、思った通りの場所を読んでないらしい、それはなぜか、って質問だと思って読みましたがそれが勘違いだったでしょうか。
quickquip

2018/08/29 01:46

xxx.py の app が create_app が返してくれたインスタンスじゃない可能性、つまり実はcreate_appは呼ばれていない可能性もあるだろうと疑ってますよ。なにせコードがないので。
quickquip

2018/08/30 15:27

そういえば起動用スクリプトは引用されてないですね。productionだとgunicornあたりをお使いでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問