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

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

ただいまの
回答率

90.01%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,633

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'
   ...
   ...
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tachikoma

    2018/08/29 08:39

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

    キャンセル

  • sequelanonymous

    2018/08/29 09:06

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

    キャンセル

回答 2

check解決した方法

0

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/31 08:14

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

    キャンセル

  • 2018/08/31 10:44

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

    キャンセル

  • 2018/09/02 15:05

    from flask import current_appですね。ありがとうございます!
    create_app関数内でapp_contextを使っています。
    http://flask.pocoo.org/docs/1.0/api/ のURLのapp_contextに記載されています。

    キャンセル

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 10:36 編集

    > 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はロードしているようだが、思った通りの場所を読んでないらしい、それはなぜか、って質問だと思って読みましたがそれが勘違いだったでしょうか。

    キャンセル

  • 2018/08/29 10:46

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

    キャンセル

  • 2018/08/31 00:27

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

    キャンセル

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

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる