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

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

ただいまの
回答率

87.36%

FLASK BruePrint作成時のapp.configの扱いについて

解決済

回答 3

投稿 編集

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

score 59

FLASKで作成したデータベースアプリがあります。

現在、このモジュールをPORTを変えて起動していますが、
BLUEPRINTを使って、まとめたいと思っています。

アプリケーションは、app.pyで同名であり、
ほとんどコピーして複製化しています。

フォルダの構成は下記です。

C:.
├─master
│  ├─static-database.db
│  ├─templates-index.html
│  ├─upload
│  └─pycache
└─ort
├─static-database.db
├─templates-index.html
├─upload
└─pycache

個々のモジュールに、グローバルで使っている変数、データベース、フォルダ等が
あり、これらのソースを極力触らないで、BLUEPRINTでまとめることは可能なのでしょうか?

現状では、重複分は名前を変えるなどの修正が必要になりますが
作業で発生するミスを避けたいと思っています。

ソースA

master.views.py

TEMP_FOLDER = './upload/'

app = Flask(__name__)
app.config['TEMP_FOLDER'] = TEMP_FOLDER 
app.config['DATABASE']='database.db'

@app.route('/', methods=['GET'])
def main():
    conn = sqlite3.connect(app.config['DATABASE'])
    cur = conn.cursor()
    cur.execute("SELECT * FROM schedule order by upd DESC")
    table = cur.fetchall()
    conn.close()
    return render_template('/index.html',table)

ソースB

ort.views.py

TEMP_FOLDER = './upload/'

app = Flask(__name__)
app.config['TEMP_FOLDER'] = TEMP_FOLDER 
app.config['DATABASE']='database.db'

@app.route('/', methods=['GET'])
def main():
    conn = sqlite3.connect(app.config['DATABASE'])
    cur = conn.cursor()
    cur.execute("SELECT * FROM schedule order by upd DESC")
    table = cur.fetchall()
    conn.close()
    return render_template('/index.html',table)

合体APP

from flask import Flask
app = Flask(__name__)
app.config['PORT']='8000'

from master.views import app1
app.register_blueprint(app1, url_prefix='/master')

from ort.views import app2
app.register_blueprint(app2, url_prefix='/ort')

if __name__ == "__main__":
    app.run(app.config['PORT'], host='0.0.0.0')
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

check解決した方法

0

FLASKを辞めて、DJANGOに移行しました。
まだ試行していますが、FLASKよりも拡張性は高い気がします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

既存の完成したものを、ソースを極力触らないで
BLUEPRINTでまとめることは可能なのでしょうか? 

現状のコードによると思います。
現状のコードをそのまま使うなら、別サイトとしてApacheやNginxで公開し、URLをそろえる(aaa.com/FuncA, aaa.com/FuncBの様な感じ)のが良いかもしれません。
まとめたい理由によると思いますが、どのような理由なのでしょうか?

Blueprintでまとめる場合は、DBもまとめることになると思いますので、既存のコード内で重複している部分は書き直すことになると思います。
(書き直さないとメンテナンス性も落ちそうですし)
その場合、ディレクトリ構造をDjangoの様にすれば機能を追加して行く感じで作成できそうです。

記憶を頼りに書いているのでなんか間違っているかもしれませんが、以下のような感じです。

root
├ Application_A
│ ├ static
│ ├ templates
│ ├ database.db
│ └ app_A.py
├ Application_B
│ ├ static
│ ├ templates
│ ├ database.db
│ └ app_B.py
├ templates
├ static
└ app.py

ちなみに、TEMP_FOLDERというのがFlask ver1.1.xのドキュメントで見当たりませんでした、何かモジュールを使っていますか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/03/09 11:28

    今回の目的は、ソースコードの管理を一括のレポジトリにしたい、サーバーでのアプリケーション実行数を減らしたい、などがあります。
    ひとまず、アプリケーションの派生版ができてきて、構造的な見直しが必要になってきました。
    現時点では、ユーザー割り当てなど動的なものまでは、望んでいませんが、そのうちユーザー認証含めて、FLASKだけでどこまでできるかは不安です。
    GIT-HUBに参考になる記事を見つけたので、こちらを参照しようと思います。

    https://github.com/hamano/explore-flask-ja/blob/master/blueprints.md

    キャンセル

0

自分なりの解決方法を得ました。

1)各モジュールのソースコード
app.configで書いている文章は、そのままcurrent.appに置き換える必要がありますが、
これは下記の方法で書き換えます。

from flask import current_app 
APP.CONFIG → current_app.config

2)config内の辞書名
DATABASEファイルなど、そもそも同名で運用している状態は、いずれにしろ改変が必要
・ファイル名を変える DATABASE_APP1、DATABASE_APP2など
・DATABASEの中に、APP1,APP2を識別するテーブルを作成、SQLのFROM文を書き換えてデータを分離
・ 〃      同一テーブル内に、APP1,APP2を識別するカラムを生成し、SQLのWHERE文でデータを分離

今回はSQLITEを使っているので、データベース自体は重くありません。
そのために、ソースコードの変更が最も少なくなるように、ファイル名を変えて運用ということにしました。

3)Staticフォルダ、Templateフォルダ

ここは2)と同じように、フォルダを統一して、名前を変えるしかなさそうです。。。

他に、良い運用があれば教えて頂ければと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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