Merry, Xmas.
Python advent calendar 2012 (#python_adv) 24æ¥ç®ã®è¨äºãããã¯ãã®åæ¾éãBGMã«ãéããã¾ãã
仿¥ã¯ Flask ã®ã¤ã±ã¦ãªãã¨ããã¨ã®ã¤ããããããç´¹ä»ãã¾ãã
å¾ªç° import åé¡
app.py ï¼ãã¡ã¤ã«ã ãã®æ§æããæé·ãã¦ãã¡ã¤ã«ãåãå§ããã¨ãã«çªãå½ããã®ã循ç°importåé¡ã§ãã
ä»ã¾ã§ï¼ã¢ã¸ã¥ã¼ã«ã ã£ã app.py
ã myapp/__init__.py
ã«ãã¦ã view 颿°ã myapp/views.py
ã®ä¸ã§å®ç¾©ãã¦ããããã¨ãã¾ãã
#myapp/__init__.py from flask import Flask app = Flask(__name__) import myapp.views
#myapp/views.py from myapp import app @app.route('/') def index(): return 'hello'
view 颿°ã« @app.route
ãã³ã¬ã¼ã¿ã使ãã«ã¯ views.py
ã§ from myapp import app
ãããªãã¨ãããªããã ãã©ã __init__.py
ã®ä¸ãã views.py
ã import ããªãã¨åæåãçµãããªãã¨ããç¸äºå帰æ§é ã«ãªã£ã¦ãã¾ãã
Larger Applications ã®ãã¼ãã«ããã¨ããã __init__.py
ã®æå¾ã§ views.py
ã import ãã¦ããã®ããã½ã§ãããã® import ã app ã®å®ç¾©ããåã«ããã¨ã views.py
㯠app ã使ãã¾ããã
ããã§ä¸å¿åé¡ãªãã®ã§ããããã®åé¿æ¹æ³ã¯ãã¾ãæ¨å¥¨ã§ãããã®ã§ã¯ããã¾ããã絶対 import (from myapp import app
) ãç¸å¯¾ import (from . import app
) ã«æ¸ãæããã ãã§ã http://stackoverflow.com/questions/8030264/relative-import-problems-in-python-3 ã«ãããããªåé¡ã«ã¶ã¤ããå±éºãããã¾ãã
ã§ããã ãã¢ã¸ã¥ã¼ã«ãåé¢ãã¦å¾ªç° import ãèµ·ãããªãããã«ãããå¾ªç° import ãããå ´åã¯ã ã¢ã¸ã¥ã¼ã«ã import ããã ãã«ãã¦ãã®ã¢ã¸ã¥ã¼ã«ã®å±æ§ã使ãã®ã¯ import ãå®å ¨ã«çµãã£ãå¾ã«å®è¡ããã颿°ã®ä¸ã ãã«ããã®ããå§ãã§ãã import ä¸ã§åæåãçµãã£ã¦ãªãã¢ã¸ã¥ã¼ã«ã使ãã®ã¯ããã¾ãããã
Flaskã§ã¯ãã¨ãããã __init__.py
ã§ app
ãä½ããªãã®ãè¯ãã¨æãã¾ãã
代ããã«ã _app.py
ãªã©ãä½ã£ã¦ããã§ app
ãçæãã __init__.py
㯠from ._app import app; from . import views
ããã ãã«ãã¦ãã¾ãã¾ãã views.py
ã§ã from ._app import app
ã§ãã¾ãã
ãããã㨠_app.py
ã¯ã app
ãªãã¸ã§ã¯ããçæããã ãã§å½¹ç®ãçµãã£ã¦ä»ã®ã¢ã¸ã¥ã¼ã«ã«ä¾åããªããªãã®ã§ãå·¡å import ã¯é¿ãããã¾ãã
ãããã¯ã @app
ãç´æ¥ä½¿ãã®ã¯ããã¦å¿
ã Blueprint
ãä½¿ãæ¹æ³ããå§ãã§ãã
#myapp/__init__.py from flask import Flask app = Flask(__name__) from .views import bp app.register_blueprint(bp)
#myapp/views.py from flask import Blueprint bp = Blueprint('top', __name__) @bp.route('/') def index(): return 'hello'
view ã®ä¸ã§ app ã使ãããæã¯ã flask.current_app
ã¨ãããããã·ãªãã¸ã§ã¯ããçµç±ãããã¨ã§ãç´æ¥ app ãªãã¸ã§ã¯ãã«ä¾åãããã¨ãé¿ããäºãã§ãã¾ãã
Flaskæ¡å¼µã®å質åé¡
Flask Extension Development ã§ã¯ã Application Factory ã«å¯¾å¿ãããè¡åã®è¯ã Flask æ¡å¼µã®ä½ãæ¹ãç´¹ä»ãã¦ãã¾ãã ãã®æ¡å¼µã¯æ¬¡ã®ããã«ãã¦ä½¿ããã¨ãã§ãã¾ãã
db = SQLite() # application factory ã¯è¤æ°åå¼ã°ãå¾ãã®ã§ã db ã¯è¤æ°ã® app ã¨å調ãã¦åããªãã¨ãããªã def make_app(): app = flask.Flask(__name__) app.config.from_pyfile('config.py') db.init_app(app) # ç¾å¨å®è¡ä¸ã® app ã«ä¾åãã¦åã cur = db.connection.cursor() cur.execute(â¦)
ã¾ãããã®ããã¥ã¡ã³ãã§æè¨ã¯ããã¦ãã¾ãããããã® SQLite ã¯æ¥ç¶æã«åãã¦è¨å®ãèªãããã«ãªã£ã¦ããã®ã§ã make_app()
ãå®è¡ããå¾ã« app.config ãæ¸ãæãã¦ãåãããã«ãªã£ã¦ãã¾ãã
ãã®ããã«å¾¡è¡åè¯ãä½ããã¦ãã Flask æ¡å¼µãªããã¦ããããã¹ãã§ã¡ãã£ã¨ app ã®è¨å®ãå¤ãã¦å®è¡ãããªã©ãã¦ãåé¡ãèµ·ãããã使ãåæãè¯ãã§ãã
ã¨ãããããã®ããã¥ã¡ã³ãã®ãµã³ãã«ã³ã¼ãã«ã¯ãã°ãããã¾ãã
def connect(self): return sqlite3.connect(self.app.config['SQLITE3_DATABASE'])
init_app()
ãå©ç¨ãããå ´å㯠self.app
ãä¿åããªã (ç¹å®ã® app ã¤ã³ã¹ã¿ã³ã¹ã«ä¾åããã current_app
ãå©ç¨ããããã«ãã) ã¨èª¬æãã¦ããã®ã«ããããããã self.app
ã使ã£ã¡ãã£ã¦ããã®ã§èª¬æéãã«åãã¾ããã
ãã®ãã°ã¯æ°ã¥ãã¦ãã§ã«ãã°å ±åããã®ã§ãããä»ãããããªåºæ¬çãªãã°ãå ¬å¼ã®æ¡å¼µã¢ã¸ã¥ã¼ã«ã®ä½ãæ¹ã解説ã«å«ã¾ãã¦ãããã¨ããæ³åã§ããéããããªãã® Flask æ¡å¼µãããè¡åã®ãããå®è£ ã«ãªã£ã¦ãã¾ãããå ¬å¼ãµã¤ãã«è¼ã£ã¦ãã approved extension ã§ãããè¡åã®æªããã®ãããµãã¦ãã¾ãã
ãªã®ã§ã Flask æ¡å¼µã®ãè¡åã®è¯ãã«é ¼ãã®ãããã¾ããããè¤æ°ã® app ã¤ã³ã¹ã¿ã³ã¹ãåæã«ä½¿ãã®ã¯è«å¤ã§ãããããã¹ãã®æã«ã¡ãã£ã¨è¨å®ãããã£ã app ãªãã¸ã§ã¯ããä½ãç´ããããã«ã¯ Application Factory ã§æ¡å¼µãå«ãã¦å ¨é¨ä½ããªããã¦ãã¾ãã°ãããä½ãæãããã¾ããã
db = app = None def make_app(conf): global app, db app = flask.Flask(__name__) app.config.update(conf) db = SQLite(app)
çæ³ã¯çæ³ã§ããã¨è¦æããªã人ã«ã¯(Flaskã使ãã®ã¯)é£ãã
ãããªæãã§ã Flask ã¯å ¬å¼ãµã¤ãã«ããæ¨å¥¨éãã®æ¹æ³ã使ãã°å°é·ãé¿ãããããã¬ã¼ã ã¯ã¼ã¯ã§ã¯ããã¾ããã Flaskã使ãå ´åã¯ãFlaskæ¬ä½ãå©ç¨ããæ¡å¼µã¢ã¸ã¥ã¼ã«ã®ã½ã¼ã¹ãèªåã§èªã¿ã¾ãããã
åé¡ã«ã¶ã¤ãã£ãæã«èªåã§ã½ã¼ã¹ãèªãã§è§£æ±ºã§ããã®ã§ããã°ãFlaskã¯ã使ãå§ããã®ãç°¡åã§ã©ãã«ã«ã¹ã¿ãã¤ãºãããã¨ãã§ããã¨ã¦ã便å©ãªéå ·ã¨ãªã£ã¦ããã¾ãã