Flaskã®ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããšãªã¯ãšã¹ãã³ã³ããã¹ãã®è©³çްãªè§£èª¬ãå ç¢ã§ã¹ã±ãŒã©ãã«ãåœé察å¿ã®ãŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ãã广çãªç®¡çæ¹æ³ãåŠã³ãŸãããã
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®ããã®Flaskã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããšãªã¯ãšã¹ãã³ã³ããã¹ã管çã®ç¿åŸ
ãã€ãããã¯ãªãŠã§ãéçºã®äžçãç¹ã«ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå Žåããã¬ãŒã ã¯ãŒã¯ã管çããåºç€ãšãªãã¡ã«ããºã ãçè§£ããããšãæãéèŠã§ãã軜éã§æè»ãªPythonãŠã§ããã¬ãŒã ã¯ãŒã¯ã§ããFlaskã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãšãªã¯ãšã¹ãåºæã®ããŒã¿ã管çããããã®åŒ·åãªããŒã«ãæäŸããŸããäžã§ããã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããšãªã¯ãšã¹ãã³ã³ããã¹ãã¯ãé©åã«çè§£ãæŽ»çšããããšã§ãããå ç¢ã§ã¹ã±ãŒã©ãã«ã§ä¿å®æ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ã«ã€ãªããåºæ¬çãªæŠå¿µã§ãããã®å æ¬çãªã¬ã€ãã§ã¯ããããã®ã³ã³ããã¹ãããããããã解説ãããã®ç®çãä»çµã¿ãã°ããŒãã«ãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ã§å¹æçã«æŽ»çšããæ¹æ³ãæ¢ããŸãã
ã³ã¢ã³ã³ã»ããã®çè§£ïŒFlaskã«ãããã³ã³ããã¹ã
ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããšãªã¯ãšã¹ãã³ã³ããã¹ãã®è©³çްã«å ¥ãåã«ããã®ã·ããªãªã«ããããã³ã³ããã¹ããã®æå³ã®åºæ¬çãªçè§£ã確ç«ããŸããããFlaskã§ã¯ãã³ã³ããã¹ãã¯ãçŸåšã®ãªã¯ãšã¹ããã¢ããªã±ãŒã·ã§ã³èªäœãªã©ãç¹å®ã®ãªããžã§ã¯ãããç¹ã«ãã¥ãŒé¢æ°å ã«çŽæ¥ããªãå Žåã«ãã³ãŒãå ã§ç°¡åã«ã¢ã¯ã»ã¹ã§ããããã«ããæ¹æ³ã§ãã
ã³ã³ããã¹ãã®å¿ èŠæ§
ç°ãªã倧éžã®ãŠãŒã¶ãŒã«ãµãŒãã¹ãæäŸããFlaskã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠãããšæ³åããŠãã ãããåäžã®ãªã¯ãšã¹ãã«ã¯ã以äžãå«ãŸããå¯èœæ§ããããŸãã
- ã¢ããªã±ãŒã·ã§ã³å šäœã®æ§æãžã®ã¢ã¯ã»ã¹ïŒäŸïŒããŒã¿ããŒã¹ã®è³æ Œæ å ±ãAPIããŒïŒã
- ãŠãŒã¶ãŒåºæã®æ å ±ã®ååŸïŒäŸïŒèšèªèšå®ãã»ãã·ã§ã³ããŒã¿ïŒã
- ãã®ç¹å®ã®ãªã¯ãšã¹ãã«åºæã®æäœã®å®è¡ïŒäŸïŒãªã¯ãšã¹ãã®è©³çްã®ãã®ã³ã°ããã©ãŒã ã®éä¿¡ã®åŠçïŒã
ãããã®ããŸããŸãªæ
å ±ã管çããããã®æ§é åãããæ¹æ³ããªãå Žåãã³ãŒãã¯ç
©éã«ãªããæšè«ãé£ãããªããŸããã³ã³ããã¹ãã¯ãã®æ§é ãæäŸããŸããFlaskã¯ããããå®çŸããããã«ãããã·ã䜿çšããŸãããããã·ã¯ãå®è¡æã«æ±ºå®ãããå¥ã®ãªããžã§ã¯ãã«æäœãå§è²ãããªããžã§ã¯ãã§ããFlaskã®2ã€ã®äž»èŠãªãããã·ã¯ãcurrent_app
ãšg
ïŒãªã¯ãšã¹ãã³ã³ããã¹ãçšïŒã§ãããcurrent_app
èªäœãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã衚ãããšãã§ããŸãã
Flaskã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ã
ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãªã¯ãšã¹ãã®ã©ã€ããµã€ã¯ã«å šäœã§äœ¿çšå¯èœãªã¢ããªã±ãŒã·ã§ã³åºæã®ããŒã¿ãæ ŒçŽãããªããžã§ã¯ãã§ããããã¯åºæ¬çã«ãFlaskã¢ããªã±ãŒã·ã§ã³å ã§ã°ããŒãã«ã«ã¢ã¯ã»ã¹ããå¿ èŠãããã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®æ å ±ã®ããã®ã³ã³ããã§ãããå®è¡äžã®åã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹ïŒç¹ã«ãã«ãã¢ããªã±ãŒã·ã§ã³ãããã€ã¡ã³ãïŒã«å¯ŸããŠåå¥ã«èå¥ã§ããå¿ èŠããããŸãã
管ç察象ïŒ
ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã¯ãäž»ã«ä»¥äžã管çããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹ïŒçŸåšã®Flaskã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹èªäœãããã¯ã
current_app
ãããã·ãä»ããŠã¢ã¯ã»ã¹ãããŸãã - æ§æïŒã¢ããªã±ãŒã·ã§ã³ã®æ§æèšå®ïŒäŸïŒ
app.config
ããïŒã - æ¡åŒµæ©èœïŒã¢ããªã±ãŒã·ã§ã³ã«çµ±åãããFlaskæ¡åŒµæ©èœã«é¢é£ããæ å ±ã
ä»çµã¿ïŒ
Flaskã¯ã以äžã®å Žåã«ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããèªåçã«ããã·ã¥ããŸãã
- ãªã¯ãšã¹ããåŠçãããŠããå Žåã
@app.appcontext
ãã³ã¬ãŒã¿ãŒãŸãã¯with app.app_context():
ãããã¯ã䜿çšããå Žåã
ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããã¢ã¯ãã£ããªå Žåãcurrent_app
ãããã·ã¯æ£ããFlaskã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹ãæããŸããããã¯ãè€æ°ã®Flaskã¢ããªãå®è¡ãããŠããå¯èœæ§ãããã¢ããªã±ãŒã·ã§ã³ããéåžžã®ãªã¯ãšã¹ããã³ãã©ãŒã®å€éšïŒäŸïŒããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãCLIã³ãã³ãããŸãã¯ãã¹ãïŒããã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããå¿
èŠãããå Žåã«éèŠã§ãã
ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã®æåããã·ã¥ïŒ
ç¹å®ã®ã·ããªãªã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããæç€ºçã«ããã·ã¥ããå¿
èŠãããå ŽåããããŸããããã¯ãã«ã¹ã¿ã ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ïŒCLIïŒããã¹ããªã©ããªã¯ãšã¹ããµã€ã¯ã«å€ã§Flaskã䜿çšããå Žåã«ãããããŸããããã¯ãapp.app_context()
ã¡ãœããã䜿çšããŠãéåžžã¯with
ã¹ããŒãã¡ã³ãå
ã§å®çŸã§ããŸãã
from flask import Flask, current_app
app = Flask(__name__)
app.config['MY_SETTING'] = 'Global Value'
# Outside a request, you need to push the context to use current_app
with app.app_context():
print(current_app.config['MY_SETTING']) # Output: Global Value
# Example in a CLI command (using Flask-CLI)
@app.cli.command('show-setting')
def show_setting_command():
with app.app_context():
print(f"My setting is: {current_app.config['MY_SETTING']}")
ãã®æç€ºçãªã³ã³ããã¹ã管çã«ãããcurrent_app
ãåžžã«æ£ããã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹ã«ãã€ã³ãããããšã©ãŒãé²ããã¢ããªã±ãŒã·ã§ã³å
šäœã®ãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ãšã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãïŒ
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®å Žåãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã¯ãå
±æãªãœãŒã¹ãšæ§æã管çããããã«äžå¯æ¬ ã§ããããšãã°ãã¢ããªã±ãŒã·ã§ã³ããªã¯ãšã¹ãã®èšèªã«åºã¥ããŠç°ãªãåœéåïŒi18nïŒãŸãã¯ããŒã«ãªãŒãŒã·ã§ã³ïŒl10nïŒããŒã¿ã®ã»ãããããŒãããå¿
èŠãããå Žåãcurrent_app
ãããã·ã¯ãããã®ãªãœãŒã¹ãæãæ§æã«ã¢ã¯ã»ã¹ã§ããŸãããªã¯ãšã¹ãã³ã³ããã¹ãã¯ãŠãŒã¶ãŒã®ç¹å®ã®èšèªãä¿æããŸãããcurrent_app
ã¯ã¢ããªã±ãŒã·ã§ã³å
šäœã®i18nã»ããã¢ããã«ã¢ã¯ã»ã¹ããããã®ã²ãŒããŠã§ã€ã§ãã
Flaskãªã¯ãšã¹ãã³ã³ããã¹ã
ãªã¯ãšã¹ãã³ã³ããã¹ãã¯ãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããããäžæçã§ããããã¯ãFlaskã¢ããªã±ãŒã·ã§ã³ãžã®ååä¿¡ãªã¯ãšã¹ãã«å¯ŸããŠäœæããã³ç Žæ£ãããŸããçŸåšã®HTTPãªã¯ãšã¹ãã«åºæã®ããŒã¿ãä¿æããåã ã®ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãåŠçããããã«éèŠã§ãã
管ç察象ïŒ
ãªã¯ãšã¹ãã³ã³ããã¹ãã¯ãäž»ã«ä»¥äžã管çããŸãã
- ãªã¯ãšã¹ããªããžã§ã¯ãïŒåä¿¡HTTPãªã¯ãšã¹ãã
request
ãããã·ãä»ããŠã¢ã¯ã»ã¹ã§ããŸãã - ã¬ã¹ãã³ã¹ãªããžã§ã¯ãïŒéä¿¡HTTPã¬ã¹ãã³ã¹ã
- ã»ãã·ã§ã³ïŒãŠãŒã¶ãŒã»ãã·ã§ã³ããŒã¿ã
session
ãããã·ãä»ããŠã¢ã¯ã»ã¹ã§ããŸãã - ã°ããŒãã«ããŒã¿ïŒ
g
ïŒïŒç¹å¥ãªãªããžã§ã¯ãg
ãåäžã®ãªã¯ãšã¹ãäžã«ä»»æã®ããŒã¿ãæ ŒçŽããããã«äœ¿çšã§ããŸããããã¯ãããŒã¿ããŒã¹æ¥ç¶ããŠãŒã¶ãŒãªããžã§ã¯ãããŸãã¯ãã®ãªã¯ãšã¹ãäžã«ã¢ããªã±ãŒã·ã§ã³ã®è€æ°ã®éšåããã¢ã¯ã»ã¹ããå¿ èŠããããã®ä»ã®ãªã¯ãšã¹ãåºæã®ãªããžã§ã¯ããæ ŒçŽããããã«ãã䜿çšãããŸãã
ä»çµã¿ïŒ
Flaskã¯ãåä¿¡HTTPãªã¯ãšã¹ããåŠçããããã³ã«ããªã¯ãšã¹ãã³ã³ããã¹ããèªåçã«ããã·ã¥ããŸãããã®ã³ã³ããã¹ãã¯ãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã®äžã«ããã·ã¥ãããŸããããã¯ããªã¯ãšã¹ããã³ãã©ãŒå
ã§ã¯ãcurrent_app
ãšrequest
ïŒããã³g
ãsession
ïŒã®äž¡æ¹ã䜿çšå¯èœã§ããããšãæå³ããŸãã
ãªã¯ãšã¹ãã®åŠçãå®äºãããšïŒã¬ã¹ãã³ã¹ãè¿ãããäŸå€ãçºçããããã«ãã£ãŠïŒãFlaskã¯ãªã¯ãšã¹ãã³ã³ããã¹ãããããããŸãããã®ã¯ãªãŒã³ã¢ããã«ããããã®ç¹å®ã®ãªã¯ãšã¹ãã«é¢é£ä»ãããããªãœãŒã¹ãè§£æŸãããŸãã
ãªã¯ãšã¹ãåºæã®ããŒã¿ãžã®ã¢ã¯ã»ã¹ïŒ
ãã¥ãŒé¢æ°å ã®å žåçãªäŸã次ã«ç€ºããŸãã
from flask import Flask, request, g, session, current_app
app = Flask(__name__)
app.secret_key = 'your secret key'
@app.route('/')
def index():
# Accessing request data
user_agent = request.headers.get('User-Agent')
user_ip = request.remote_addr
# Accessing application data via current_app
app_name = current_app.name
# Storing data in g for this request
g.request_id = 'some-unique-id-123'
# Setting session data (requires secret_key)
session['username'] = 'global_user_example'
return f"Hello! Your IP is {user_ip}, User Agent: {user_agent}. App: {app_name}. Request ID: {g.request_id}. Session user: {session.get('username')}"
@app.route('/profile')
def profile():
# Accessing g data set in another view during the same request cycle
# Note: This is only if the /profile route was accessed via a redirect or internal
# forward from the '/' route within the same request. In practice, it's better
# to pass data explicitly or use session.
request_id_from_g = getattr(g, 'request_id', 'Not set')
return f"Profile page. Request ID (from g): {request_id_from_g}"
ãã®äŸã§ã¯ãFlaskãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããšãªã¯ãšã¹ãã³ã³ããã¹ããèªåçã«ããã·ã¥ãããããrequest
ãg
ãsession
ãããã³current_app
ã¯ãã¹ãŠã¢ã¯ã»ã¹å¯èœã§ãã
ãªã¯ãšã¹ãã³ã³ããã¹ãã®æåããã·ã¥ïŒ
Flaskã¯éåžžãHTTPãªã¯ãšã¹ãäžã«ãªã¯ãšã¹ãã³ã³ããã¹ãã®ããã·ã¥ãèªåçã«åŠçããŸããããã¹ããŸãã¯ããã¯ã°ã©ãŠã³ãåŠçã®ããã«ãªã¯ãšã¹ãã³ã³ããã¹ããã·ãã¥ã¬ãŒãããå¿
èŠãããç¶æ³ããããŸããããã¯ãapp.request_context()
ã䜿çšããŠè¡ãããšãã§ããŸããããã¯ãapp.app_context()
ãšçµã¿åãããŠäœ¿çšãããããšããããããŸãã
from flask import Flask, request, current_app
app = Flask(__name__)
app.config['MY_SETTING'] = 'Global Value'
# Simulate a request context
with app.test_request_context('/test', method='GET', headers={'User-Agent': 'TestClient'}):
print(request.method) # Output: GET
print(request.headers.get('User-Agent')) # Output: TestClient
print(current_app.name) # Output: __main__ (or your app's name)
# You can even use g within this simulated context
g.test_data = 'Some test info'
print(g.test_data) # Output: Some test info
test_request_context
ã¡ãœããã¯ããã¹ãçšã®ã¢ãã¯ãªã¯ãšã¹ãç°å¢ãäœæãã䟿å©ãªæ¹æ³ã§ããã©ã€ããµãŒããŒãå¿
èŠãšããã«ãããŸããŸãªãªã¯ãšã¹ãæ¡ä»¶äžã§ã³ãŒããã©ã®ããã«åäœããããæ€èšŒã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããšãªã¯ãšã¹ãã³ã³ããã¹ãã®é¢ä¿
ãããã®ã³ã³ããã¹ãã¯ç¬ç«ããŠããªãããšãçè§£ããããšãéèŠã§ãããããã¯ã¹ã¿ãã¯ã圢æããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã¯ããŒã¹ã§ãïŒæåã«ããã·ã¥ãããã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããŠããéãããŸãã¯æç€ºçã«ãããããããŸã§ã¢ã¯ãã£ããªãŸãŸã§ãã
- ãªã¯ãšã¹ãã³ã³ããã¹ãã¯æäžäœã«ãããŸãïŒã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã®åŸã«ããã·ã¥ãããåäžã®ãªã¯ãšã¹ãã®æéäžã®ã¿ã¢ã¯ãã£ãã§ãã
ãªã¯ãšã¹ããå°çãããšãFlaskã¯æ¬¡ã®åŠçãè¡ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã®ããã·ã¥ïŒã¢ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãããªãå Žåã¯ã1ã€ããã·ã¥ããŸããããã«ããã
current_app
ã䜿çšå¯èœã«ãªããŸãã - ãªã¯ãšã¹ãã³ã³ããã¹ãã®ããã·ã¥ïŒæ¬¡ã«ããªã¯ãšã¹ãã³ã³ããã¹ããããã·ã¥ãã
request
ãg
ãããã³session
ã䜿çšå¯èœã«ããŸãã
ãªã¯ãšã¹ããå®äºãããšïŒ
- ãªã¯ãšã¹ãã³ã³ããã¹ãã®ãããïŒFlaskã¯ãªã¯ãšã¹ãã³ã³ããã¹ããåé€ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã®ãããïŒã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåãã¢ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããžã®åç §ãä¿æããŠããªãå Žåããããããããããå¯èœæ§ããããŸãããã ããéåžžãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã¯ã¢ããªã±ãŒã·ã§ã³ããã»ã¹ãã¢ã¯ãã£ãã§ããéãåç¶ããŸãã
ãã®ã¹ã¿ãã¯ãããæ§è³ªã«ãããrequest
ã䜿çšå¯èœãªå Žåã¯åžžã«current_app
ã䜿çšå¯èœã§ãããcurrent_app
ã䜿çšå¯èœãªå Žåã¯å¿
ãããrequest
ã䜿çšå¯èœã§ã¯ãããŸããïŒããšãã°ãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã®ã¿ãæåã§ããã·ã¥ããå ŽåïŒã
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã§ã®ã³ã³ããã¹ãã®ç®¡ç
倿§ãªã°ããŒãã«ãªãŒãã£ãšã³ã¹åãã®ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã«ã¯ãç¬èªã®åé¡ãçºçããŸããã³ã³ããã¹ã管çã¯ããããã®åé¡ã«å¯ŸåŠããäžã§éèŠãªåœ¹å²ãæãããŸãã
1. åœéåïŒi18nïŒãšããŒã«ãªãŒãŒã·ã§ã³ïŒl10nïŒïŒ
課é¡ïŒããŸããŸãªåœã®ãŠãŒã¶ãŒã¯ç°ãªãèšèªã話ããç°ãªãæåçæåŸ ïŒããšãã°ãæ¥ä»åœ¢åŒãé貚èšå·ïŒãæã£ãŠããŸããã¢ããªã±ãŒã·ã§ã³ã¯é©å¿ããå¿ èŠããããŸãã
ã³ã³ããã¹ããœãªã¥ãŒã·ã§ã³ïŒ
- ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãïŒ
current_app
ã¯ãi18nã»ããã¢ããã®æ§æïŒããšãã°ã䜿çšå¯èœãªèšèªã翻蚳ãã¡ã€ã«ã®ãã¹ïŒãä¿æã§ããŸãããã®æ§æã¯ãã¢ããªã±ãŒã·ã§ã³å šäœã§ã°ããŒãã«ã«äœ¿çšã§ããŸãã - ãªã¯ãšã¹ãã³ã³ããã¹ãïŒ
request
ãªããžã§ã¯ãã䜿çšããŠããŠãŒã¶ãŒã®åªå èšèªãå€å¥ã§ããŸãïŒããšãã°ãAccept-Language
ããããŒãURLãã¹ããŸãã¯ã»ãã·ã§ã³ã«æ ŒçŽãããŠãããŠãŒã¶ãŒã®ãããã¡ã€ã«ããïŒã次ã«ãg
ãªããžã§ã¯ãã䜿çšããŠãçŸåšã®ãªã¯ãšã¹ãã«å¯ŸããŠæ±ºå®ããããã±ãŒã«ãæ ŒçŽãããã¥ãŒããžãã¯ãšãã³ãã¬ãŒãã®ãã¹ãŠã®éšåããç°¡åã«ã¢ã¯ã»ã¹ã§ããããã«ããããšãã§ããŸãã
äŸïŒFlask-Babelã䜿çšïŒïŒ
from flask import Flask, request, g, current_app
from flask_babel import Babel, get_locale
app = Flask(__name__)
app.config['BABEL_DEFAULT_LOCALE'] = 'en'
app.config['BABEL_DEFAULT_TIMEZONE'] = 'UTC'
babel = Babel(app)
# Application context is implicitly pushed by Flask-Babel during initialization
# and will be available during requests.
@babel.localeselector
def get_locale():
# Try to get language from URL first (e.g., /en/about)
if 'lang' in request.view_args:
g.current_lang = request.view_args['lang']
return request.view_args['lang']
# Try to get language from user's browser headers
user_lang = request.accept_languages.best_match(app.config['LANGUAGES'])
if user_lang:
g.current_lang = user_lang
return user_lang
# Fallback to application default
g.current_lang = app.config['BABEL_DEFAULT_LOCALE']
return app.config['BABEL_DEFAULT_LOCALE']
@app.route('//hello')
def hello_lang(lang):
# current_app.config['BABEL_DEFAULT_LOCALE'] is accessible
# g.current_lang was set by get_locale()
return f"Hello in {g.current_lang}!"
@app.route('/hello')
def hello_default():
# get_locale() will be called automatically
return f"Hello in {get_locale()}!"
ããã§ã¯ãcurrent_app
ã¯ããã©ã«ãã®ãã±ãŒã«æ§æãžã®ã¢ã¯ã»ã¹ãæäŸããrequest
ãšg
ã䜿çšããŠãçŸåšã®ãŠãŒã¶ãŒã®ãªã¯ãšã¹ãã®ç¹å®ã®ãã±ãŒã«ã決å®ããŠæ ŒçŽããŸãã
2. ã¿ã€ã ãŸãŒã³ãšæ¥ä»/æå»ã®åŠçïŒ
課é¡ïŒç°ãªããŠãŒã¶ãŒã¯ç°ãªãã¿ã€ã ãŸãŒã³ã«ããŸããã¿ã€ã ã¹ã¿ã³ããæ ŒçŽããŠè¡šç€ºããã«ã¯ãæ£ç¢ºã§ãŠãŒã¶ãŒã«é¢é£æ§ãããå¿ èŠããããŸãã
ã³ã³ããã¹ããœãªã¥ãŒã·ã§ã³ïŒ
- ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãïŒ
current_app
ã¯ããµãŒããŒã®ããã©ã«ãã®ã¿ã€ã ãŸãŒã³ããŸãã¯ããŒã¿ããŒã¹ã«æ ŒçŽãããŠãããã¹ãŠã®ã¿ã€ã ã¹ã¿ã³ãã®ããŒã¹ã¿ã€ã ãŸãŒã³ãä¿æã§ããŸãã - ãªã¯ãšã¹ãã³ã³ããã¹ãïŒ
request
ãªããžã§ã¯ãïŒãŸãã¯ãŠãŒã¶ãŒãããã¡ã€ã«/ã»ãã·ã§ã³ããæŽŸçããããŒã¿ïŒã¯ããŠãŒã¶ãŒã®ããŒã«ã«ã¿ã€ã ãŸãŒã³ãå€å¥ã§ããŸãããã®ã¿ã€ã ãŸãŒã³ã¯g
ã«æ ŒçŽããŠããã®ç¹å®ã®ãªã¯ãšã¹ãå ã§æ¥ä»ãšæå»ã®è¡šç€ºåœ¢åŒãèšå®ãããšãã«ç°¡åã«ã¢ã¯ã»ã¹ã§ããããã«ããããšãã§ããŸãã
äŸïŒ
from flask import Flask, request, g, current_app
from datetime import datetime
import pytz # A robust timezone library
app = Flask(__name__)
app.config['SERVER_TIMEZONE'] = 'UTC'
# Function to get user's timezone (simulated)
def get_user_timezone(user_id):
# In a real app, this would query a database or session
timezones = {'user1': 'America/New_York', 'user2': 'Asia/Tokyo'}
return timezones.get(user_id, app.config['SERVER_TIMEZONE'])
@app.before_request
def set_timezone():
# Simulate a logged-in user
user_id = 'user1'
g.user_timezone_str = get_user_timezone(user_id)
g.user_timezone = pytz.timezone(g.user_timezone_str)
@app.route('/time')
def show_time():
now_utc = datetime.now(pytz.utc)
# Format time for the current user's timezone
now_user_tz = now_utc.astimezone(g.user_timezone)
formatted_time = now_user_tz.strftime('%Y-%m-%d %H:%M:%S %Z%z')
# Accessing application's base timezone
server_tz_str = current_app.config['SERVER_TIMEZONE']
return f"Current time in your timezone ({g.user_timezone_str}): {formatted_time}
Server is set to: {server_tz_str}"
ããã¯ãg
ããŠãŒã¶ãŒã®ã¿ã€ã ãŸãŒã³ãªã©ã®ãªã¯ãšã¹ãåºæã®ããŒã¿ãä¿æããæå»ã®åœ¢åŒèšå®ã«ããã«äœ¿çšã§ããããã«ããæ¹æ³ã瀺ããŠããŸããäžæ¹ãcurrent_app
ã¯ã°ããŒãã«ãµãŒããŒã®ã¿ã€ã ãŸãŒã³èšå®ãä¿æããŸãã
3. éè²šãšæ¯æãåŠçïŒ
課é¡ïŒç°ãªãé貚ã§äŸ¡æ Œã衚瀺ããæ¯æããåŠçããããšã¯è€éã§ãã
ã³ã³ããã¹ããœãªã¥ãŒã·ã§ã³ïŒ
- ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãïŒ
current_app
ã¯ãã¢ããªã±ãŒã·ã§ã³ã®åºæ¬é貚ããµããŒããããŠããé貚ãé貚æç®ãµãŒãã¹ãŸãã¯æ§æãžã®ã¢ã¯ã»ã¹ãæ ŒçŽã§ããŸãã - ãªã¯ãšã¹ãã³ã³ããã¹ãïŒ
request
ïŒãŸãã¯ã»ãã·ã§ã³/ãŠãŒã¶ãŒãããã¡ã€ã«ïŒã¯ããŠãŒã¶ãŒã®åªå é貚ãå€å¥ããŸããããã¯g
ã«æ ŒçŽã§ããŸããäŸ¡æ Œã衚瀺ãããšãã¯ãåºæ¬äŸ¡æ ŒïŒå€ãã®å Žåãäžè²«ããéè²šã§æ ŒçŽãããŸãïŒãååŸããg
ããç°¡åã«ã¢ã¯ã»ã¹ã§ãããŠãŒã¶ãŒã®åªå é貚ã䜿çšããŠæç®ããŸãã
4. ããŒã¿ããŒã¹æ¥ç¶ãšãªãœãŒã¹ïŒ
課é¡ïŒå€æ°ã®åæãªã¯ãšã¹ãã«å¯ŸããŠããŒã¿ããŒã¹æ¥ç¶ãå¹ççã«ç®¡çããŸãããŠãŒã¶ãŒãå°åãŸãã¯ã¢ã«ãŠã³ãã®çš®é¡ã«åºã¥ããŠç°ãªãããŒã¿ããŒã¹ã«æ¥ç¶ããå¿ èŠãããå ŽåããããŸãã
ã³ã³ããã¹ããœãªã¥ãŒã·ã§ã³ïŒ
- ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãïŒç°ãªãããŒã¿ããŒã¹ã€ã³ã¹ã¿ã³ã¹ã«æ¥ç¶ããããã®ããŒã¿ããŒã¹æ¥ç¶ãŸãã¯æ§æã®ããŒã«ã管çã§ããŸãã
- ãªã¯ãšã¹ãã³ã³ããã¹ãïŒ
g
ãªããžã§ã¯ãã¯ãçŸåšã®ãªã¯ãšã¹ãã«äœ¿çšããç¹å®ã®ããŒã¿ããŒã¹æ¥ç¶ãä¿æããã®ã«çæ³çã§ããããã«ãããåäžã®ãªã¯ãšã¹ãå ã®ãã¹ãŠã®æäœã«å¯ŸããŠæ°ããæ¥ç¶ã確ç«ãããªãŒããŒããããåé¿ããã1ã€ã®ãªã¯ãšã¹ãã®ããŒã¿ããŒã¹æäœãå¥ã®ãªã¯ãšã¹ãã劚ããªãããšãä¿èšŒãããŸãã
äŸïŒ
from flask import Flask, g, request, current_app
import sqlite3
app = Flask(__name__)
app.config['DATABASE_URI_GLOBAL'] = 'global_data.db'
app.config['DATABASE_URI_USERS'] = 'user_specific_data.db'
def get_db(db_uri):
db = getattr(g, '_database', None)
if db is None:
db = g._database = sqlite3.connect(db_uri)
# Optional: Configure how rows are returned (e.g., as dictionaries)
db.row_factory = sqlite3.Row
return db
@app.before_request
def setup_db_connection():
# Determine which database to use based on request, e.g., user's region
user_region = request.args.get('region', 'global') # 'global' or 'user'
if user_region == 'user':
# In a real app, user_id would come from session/auth
g.db_uri = current_app.config['DATABASE_URI_USERS']
else:
g.db_uri = current_app.config['DATABASE_URI_GLOBAL']
g.db = get_db(g.db_uri)
@app.teardown_request
def close_db_connection(exception):
db = getattr(g, '_database', None)
if db is not None:
db.close()
@app.route('/data')
def get_data():
cursor = g.db.execute('SELECT * FROM items')
items = cursor.fetchall()
return f"Data from {g.db_uri}: {items}"
# Example usage: /data?region=global or /data?region=user
ãã®ãã¿ãŒã³ã«ãããåãªã¯ãšã¹ããç¬èªã®ããŒã¿ããŒã¹æ¥ç¶ã䜿çšãããã®ç¹å®ã®ãªã¯ãšã¹ãã«å¯ŸããŠå¹ççã«ééãããããšãä¿èšŒãããŸããcurrent_app.config
ã¯ç°ãªãããŒã¿ããŒã¹æ§æãžã®ã¢ã¯ã»ã¹ãæäŸããg
ã¯ãªã¯ãšã¹ãã®ã¢ã¯ãã£ããªæ¥ç¶ã管çããŸãã
ã°ããŒãã«ã¢ããªã§ã®ã³ã³ããã¹ã管çã®ãã¹ããã©ã¯ãã£ã¹
1. ãªã¯ãšã¹ãåºæã®ããŒã¿ã«ã¯`g`ãåªå ããïŒ
g
ãªããžã§ã¯ãã䜿çšããŠãåäžã®ãªã¯ãšã¹ãã®æéã«ã®ã¿é¢é£ããããŒã¿ãæ ŒçŽããŸãïŒããšãã°ãããŒã¿ããŒã¹æ¥ç¶ãèªèšŒããããŠãŒã¶ãŒãªããžã§ã¯ãããªã¯ãšã¹ãã«åºæã®èšç®ãããå€ïŒãããã«ããããªã¯ãšã¹ãããŒã¿ãåé¢ããããªã¯ãšã¹ãéã§ãªãŒã¯ããã®ãé²ããŸãã
2. ã¹ã¿ãã¯ãçè§£ããïŒ
ãªã¯ãšã¹ãã³ã³ããã¹ãã¯ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã®äžã«ããã·ã¥ãããããšãåžžã«èŠããŠãããŠãã ãããããã¯ãrequest
ãããå Žåã¯current_app
ã䜿çšå¯èœã§ãããå¿
ããããã®éã§ã¯ãªãããšãæå³ããŸããå®å
šãªãªã¯ãšã¹ããµã€ã¯ã«å€ã§å®è¡ãããå¯èœæ§ã®ããã³ãŒããäœæããå Žåã¯ãããã«æ³šæããŠãã ããã
3. å¿ èŠã«å¿ããŠã³ã³ããã¹ããæç€ºçã«ããã·ã¥ããïŒ
ãŠããããã¹ããããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ããŸãã¯CLIã³ãã³ãã§ã¯ãã³ã³ããã¹ããã¢ã¯ãã£ãã§ãããšæ³å®ããªãã§ãã ãããwith app.app_context():
ããã³with app.request_context(...):
ã䜿çšããŠã³ã³ããã¹ããæåã§ç®¡çããcurrent_app
ãrequest
ãªã©ã®ãããã·ãæ£ããåäœããããšã確èªããŸãã
4. `before_request`ããã³`teardown_request`ããã¯ã䜿çšããïŒ
ãããã®Flaskãã³ã¬ãŒã¿ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ããã³ãªã¯ãšã¹ãã³ã³ããã¹ãå ã§ç®¡çããããªã¯ãšã¹ãåºæã®ãªãœãŒã¹ã®èšå®ãšç Žæ£ã«åŒ·åã§ããããšãã°ãããŒã¿ããŒã¹æ¥ç¶ãééããããå€éšãµãŒãã¹ã¯ã©ã€ã¢ã³ããåæåãããããŸãã
5. ç¶æ ã«ã°ããŒãã«å€æ°ã䜿çšããªãïŒ
Flaskã®ã³ã³ããã¹ãã¯ç¹å®ã®ãªããžã§ã¯ãïŒcurrent_app
ãªã©ïŒãžã®ã°ããŒãã«ã¢ã¯ã»ã¹ãæäŸããŸãããã³ã³ããã¹ãã·ã¹ãã ããã€ãã¹ããæ¹æ³ã§ãªã¯ãšã¹ãåºæãŸãã¯ã¢ããªã±ãŒã·ã§ã³åºæã§ããå¿
èŠããã倿Žå¯èœãªç¶æ
ãæ ŒçŽããããã«ãPythonã®ã°ããŒãã«å€æ°ãŸãã¯ã¢ãžã¥ãŒã«ã¬ãã«ã®å€æ°ã䜿çšããããšã¯é¿ããŠãã ãããã³ã³ããã¹ãã¯ãç¹ã«åæå®è¡ç°å¢ã§ããã®ç¶æ
ãå®å
šãã€æ£ãã管çããããã«èšèšãããŠããŸãã
6. ã¹ã±ãŒã©ããªãã£ãšåæå®è¡ã®ããã«èšèšããïŒ
ã³ã³ããã¹ãã¯ãFlaskã¢ããªã±ãŒã·ã§ã³ãã¹ã¬ããã»ãŒãã§ã¹ã±ãŒã©ãã«ã«ããããã«äžå¯æ¬ ã§ããéåžžãåã¹ã¬ããã¯ç¬èªã®ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããšãªã¯ãšã¹ãã³ã³ããã¹ããååŸããŸããã³ã³ããã¹ãïŒç¹ã«g
ïŒãé©åã«äœ¿çšããããšã§ãç°ãªããªã¯ãšã¹ããåŠçããç°ãªãã¹ã¬ãããäºãã®ããŒã¿ã«å¹²æžããªãããã«ããããšãã§ããŸãã
7. æ¡åŒµæ©èœãè³¢ãæŽ»çšããïŒ
å€ãã®Flaskæ¡åŒµæ©èœïŒFlask-SQLAlchemyãFlask-LoginãFlask-Babelãªã©ïŒã¯ãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããšãªã¯ãšã¹ãã³ã³ããã¹ãã«å€§ããäŸåããŠããŸãããããã®æ¡åŒµæ©èœãã³ã³ããã¹ãã䜿çšããŠç¬èªã®ç¶æ ãšãªãœãŒã¹ã管çããæ¹æ³ãçè§£ããŠãã ããããã®ç¥èã«ããããããã°ãšã«ã¹ã¿ã çµ±åãã¯ããã«ç°¡åã«ãªããŸãã
é«åºŠãªã·ããªãªã§ã®ã³ã³ããã¹ã
åæå®è¡ãšã¹ã¬ããåŠçïŒ
WebãµãŒããŒã¯ãã¹ã¬ãããŸãã¯éåæã¯ãŒã«ãŒã䜿çšããŠãè€æ°ã®ãªã¯ãšã¹ããåæã«åŠçããããšããããããŸãããªã¯ãšã¹ããåŠçããåã¹ã¬ããã¯ãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããšãªã¯ãšã¹ãã³ã³ããã¹ããèªåçã«ååŸããŸãããã®åé¢ã¯éèŠã§ããããšãã°ãçŸåšã®ãŠãŒã¶ãŒã®IDã«åçŽãªã°ããŒãã«å€æ°ã䜿çšããå Žåãç°ãªãã¹ã¬ãããäºãã®å€ãäžæžãããäºæž¬ã§ããªãåäœãšã»ãã¥ãªãã£ã®è匱æ§ã«ã€ãªããå¯èœæ§ããããŸãããªã¯ãšã¹ãã³ã³ããã¹ãã«çµã³ä»ããããg
ãªããžã§ã¯ãã¯ãåã¹ã¬ããã®ããŒã¿ãåé¢ãããŠããããšãä¿èšŒããŸãã
ãã¹ãïŒ
Flaskã¢ããªã±ãŒã·ã§ã³ã®å¹æçãªãã¹ãã¯ãã³ã³ããã¹ã管çã«å€§ããäŸåããŠããŸããFlaskã®test_client()
ã¡ãœããã¯ããªã¯ãšã¹ããã·ãã¥ã¬ãŒããããã¹ãã¯ã©ã€ã¢ã³ããè¿ããŸãããã®ã¯ã©ã€ã¢ã³ãã䜿çšãããšãFlaskã¯å¿
èŠãªã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããšãªã¯ãšã¹ãã³ã³ããã¹ããèªåçã«ããã·ã¥ããå®éã®ãªã¯ãšã¹ããçºçããŠãããã®ããã«ããã¹ãã³ãŒããrequest
ãsession
ãããã³current_app
ãªã©ã®ãããã·ã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã
from flask import Flask, session, current_app
app = Flask(__name__)
app.secret_key = 'testing_key'
@app.route('/login')
def login():
session['user'] = 'test_user'
return 'Logged in'
@app.route('/user')
def get_user():
return session.get('user', 'No user')
# Test using the test client
client = app.test_client()
response = client.get('/login')
assert response.status_code == 200
# Session data is now set within the test client's context
response = client.get('/user')
assert response.get_data(as_text=True) == 'test_user'
# current_app is also available
with app.test_client() as c:
with c.application.app_context(): # Explicitly push app context if needed
print(current_app.name)
ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ïŒäŸïŒCeleryïŒïŒ
ã¿ã¹ã¯ãããã¯ã°ã©ãŠã³ãã¯ãŒã«ãŒïŒCeleryã«ãã£ãŠç®¡çãããã¯ãŒã«ãŒãªã©ïŒã«å§ä»»ãããšããããã®ã¯ãŒã«ãŒã¯å€ãã®å Žåãã¡ã€ã³WebãµãŒããŒã®ãªã¯ãšã¹ããµã€ã¯ã«å€ã§ãå¥ã®ããã»ã¹ãŸãã¯ã¹ã¬ããã§å®è¡ãããŸããããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãã¢ããªã±ãŒã·ã§ã³æ§æã«ã¢ã¯ã»ã¹ããããã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããå¿ èŠãšããæäœãå®è¡ãããããå¿ èŠãããå Žåã¯ãã¿ã¹ã¯ãå®è¡ããåã«ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããæåã§ããã·ã¥ããå¿ èŠããããŸãã
from your_flask_app import create_app # Assuming you have a factory pattern
from flask import current_app
@celery.task
def process_background_data(data):
app = create_app() # Get your Flask app instance
with app.app_context():
# Now you can safely use current_app
config_value = current_app.config['SOME_BACKGROUND_SETTING']
# ... perform operations using config_value ...
print(f"Processing with config: {config_value}")
return "Task completed"
ãã®ãããªã·ããªãªã§ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããããã·ã¥ããªããšãcurrent_app
ãŸãã¯ãã®ä»ã®ã³ã³ããã¹ãäŸåãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ããããšãããšãšã©ãŒãçºçããŸãã
çµè«
Flaskã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããšãªã¯ãšã¹ãã³ã³ããã¹ãã¯ãFlaskã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åºæ¬çãªèŠçŽ ã§ãããã°ããŒãã«ãªãŒãã£ãšã³ã¹åãã«èšèšããå Žåã¯ããã«éèŠã«ãªããŸãããããã®ã³ã³ããã¹ããã¢ããªã±ãŒã·ã§ã³ããŒã¿ãšãªã¯ãšã¹ãåºæã®ããŒã¿ã管çããæ¹æ³ãçè§£ãããã®äœ¿çšã«é¢ãããã¹ããã©ã¯ãã£ã¹ãæ¡çšããããšã§ã次ã®ã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
- å ç¢ïŒåæå®è¡ã®åé¡ãç¶æ ãªãŒã¯ãçºçãã«ããã
- ã¹ã±ãŒã©ãã«ïŒè² è·ã®å¢å ãšåæãŠãŒã¶ãŒãå¹ççã«åŠçã§ããã
- ä¿å®å¯èœïŒçµç¹åãããç¶æ 管çã«ãããæšè«ãšãããã°ã容æã«ãªãã
- åœé察å¿ïŒèšèªãã¿ã€ã ãŸãŒã³ãé貚ãªã©ã«é¢ãããŠãŒã¶ãŒèšå®ã«é©å¿ã§ããã
Flaskã®ã³ã³ããã¹ã管çãç¿åŸããããšã¯ããã¬ãŒã ã¯ãŒã¯ã®æ©èœãåŠã¶ã ãã§ã¯ãããŸãããã°ããŒãã«ã«ãŠãŒã¶ãŒã«ãµãŒãã¹ãæäŸããè€éã§ææ°ã®Webã¢ããªã±ãŒã·ã§ã³ã®åŒ·åºãªåºç€ãæ§ç¯ããããšã§ãããããã®æŠå¿µãåãå ¥ãããããžã§ã¯ãã§å®éšããããšã§ãæŽç·Žãããã°ããŒãã«å¿åã®Webãšã¯ã¹ããªãšã³ã¹ãéçºããããã®éãæ©ãã§ããããšã«ãªããŸãã