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

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

ただいまの
回答率

90.45%

  • Python 3.x

    10346questions

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

  • Flask

    369questions

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

  • SQLAlchemy

    57questions

    SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

db.init_appの初期化処理の処理の流れ、及び仕組みについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 361

一回目の起動時のみにテーブル作成及びデフォルト値のデータ挿入を実行させるように書きたいです。
下記は、サンプルですが、db.init_appの関数定義がなく、どう書くものでしょうか?db.init_app(app)の意味が気になっています。なぜ、わざわざcreate_app関数を定義してappをreturnさせて別で呼び出す必要があるのでしょうか?そもそも、これを初期化処理と読んでいいものでしょうか?

初期化処理は、だれもが書くような内容だと思うのでflaskでかかれたサンプルをご存知でしたら教えていただけると助かります。

run.py

from app import create_app

if __name__ == "__main__":
    app = create_app()
    app.run()

app/init.py

from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension
from flask.ext.sqlalchemy import SQLAlchemy # Import SQLAlchemy
from flask.ext.mongoengine import MongoEngine # Import Mongoengine
from flask.ext.admin import Admin
from app import config

# app setup
db = SQLAlchemy()
mongodb = MongoEngine()
admin = Admin()
toolbar = DebugToolbarExtension()

def create_app():

    app = Flask()
    app.config.config_from_object(config)

    #Initializing
    db.init_app(app)
    mongodb.init_app(app)
    admin.init_app(app)
    toolbar.init_app(app)

   # Import a module
    from app.module1.controllers import mod_app

    # Register blueprint(s)
    app.register_blueprint(mod_app)

    # Build the database:
    # This will create the database file using SQLAlchemy
    db.create_all()

    return app

引用元:
https://qiita.com/divider_kuro/items/c74514af9ea89f1b9793

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

主に設定 app.config を操作しているみたいですね。
自分も気になっていたので、該当のソースコードを引っ張ってきました。

flask.ext.sqlalchemy は deprecated

ちなみに flask.ext.sqlalchemy は deprecated とのことで、別の箇所から引っ張っています。

Importing flask.ext.sqlalchemy is deprecated, use flask_sqlalchemy instead. 
↓ 
flask.ext.sqlalchemyのインポートは非推奨です。代わりにflask_sqlalchemyを使用してください。
  だそうです。(エラーではなくて Warning=警告 ですね)

flaskの勉強をしていたらこういったエラーに出会いましたが、どういう内容かわかりますか?

ソースコード

class SQLAlchemy(object):

    ...

    def init_app(self, app):
        """This callback can be used to initialize an application for the
        use with this database setup.  Never use a database in the context
        of an application not initialized that way or connections will
        leak.

        (だいぶ意訳)
        この関数を使えば、
        このデータベースのセットアップするために、アプリケーションを初期化することができます。
        アプリケーションコンテキストの中でデータベースを使わなかった場合、
        データベース接続が漏れてしまいます。
        """
        if (
            'SQLALCHEMY_DATABASE_URI' not in app.config and
            'SQLALCHEMY_BINDS' not in app.config
        ):
            warnings.warn(
                'Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. '
                'Defaulting SQLALCHEMY_DATABASE_URI to "sqlite:///:memory:".'
            )

        app.config.setdefault('SQLALCHEMY_DATABASE_URI', 'sqlite:///:memory:')
        app.config.setdefault('SQLALCHEMY_BINDS', None)
        app.config.setdefault('SQLALCHEMY_NATIVE_UNICODE', None)
        app.config.setdefault('SQLALCHEMY_ECHO', False)
        app.config.setdefault('SQLALCHEMY_RECORD_QUERIES', None)
        app.config.setdefault('SQLALCHEMY_POOL_SIZE', None)
        app.config.setdefault('SQLALCHEMY_POOL_TIMEOUT', None)
        app.config.setdefault('SQLALCHEMY_POOL_RECYCLE', None)
        app.config.setdefault('SQLALCHEMY_MAX_OVERFLOW', None)
        app.config.setdefault('SQLALCHEMY_COMMIT_ON_TEARDOWN', False)
        track_modifications = app.config.setdefault(
            'SQLALCHEMY_TRACK_MODIFICATIONS', None
        )

        if track_modifications is None:
            warnings.warn(FSADeprecationWarning(
                'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
                'will be disabled by default in the future.  Set it to True '
                'or False to suppress this warning.'
            ))

        app.extensions['sqlalchemy'] = _SQLAlchemyState(self)

        @app.teardown_appcontext
        def shutdown_session(response_or_exc):
            if app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']:
                if response_or_exc is None:
                    self.session.commit()

            self.session.remove()
            return response_or_exc

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

同じタグがついた質問を見る

  • Python 3.x

    10346questions

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

  • Flask

    369questions

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

  • SQLAlchemy

    57questions

    SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。