ããã¯ãFlaskãã€ã¯ããã¬ãŒã ã¯ãŒã¯ã䜿çšããŠPython Webã¢ããªã±ãŒã·ã§ã³ãäœæããçµéšã説æããã·ãªãŒãºã®3çªç®ã®èšäºã§ãã
ãã®ã¬ã€ãã®ç®çã¯ãããªãæ©èœçãªãã€ã¯ãããã°ã¢ããªã±ãŒã·ã§ã³ãéçºããããšã§ãããªãªãžããªãã£ãå®å
šã«æ¬ åŠããŠããããããã€ã¯ãããã°ã¢ããªã±ãŒã·ã§ã³ãšåŒã¶ããšã«ããŸããã
çãç¹°ãè¿ã
åã®ããŒãã§ã¯ãããŒã ããŒãžçšã®ã·ã³ãã«ãªãã³ãã¬ãŒããå®çŸ©ããä»®æ³ãªããžã§ã¯ãããŸã æã£ãŠããªããã®ã®ãããã¿ã€ããšããŠäœ¿çšããŸããã ããšãã°ããŠãŒã¶ãŒãŸãã¯ã¬ã³ãŒãã
ãã®èšäºã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã«ååšããã®ã£ããã®1ã€ãåããŸãã ãã©ãŒã ã®äœ¿çšãæ€èšããŸãã
ãã©ãŒã ã¯ãWebã¢ããªã±ãŒã·ã§ã³ã§æãåºæ¬çãªãããã¯ã®1ã€ã§ãã ãã©ãŒã ã䜿çšãããšããŠãŒã¶ãŒã¯ããã°ã®ãšã³ããªãæ®ããããã¢ããªã±ãŒã·ã§ã³ã«ãã°ã€ã³ãããã§ããŸãã
ãã®éšåã«åŸãã«ã¯ããã€ã¯ãããã°ã¢ããªã±ãŒã·ã§ã³ã¯ãåã®èšäºã®æåŸã«æ®ãããã®ãšåãã§ãªããã°ãªããŸããã ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããåäœããŠããããšã確èªããŠãã ããã
æ§æ
ãã©ãŒã ã®åŠçã«ã¯ã
WTForms
ã©ãããŒã§ãããFlaskã¢ããªã±ãŒã·ã§ã³ãšå®å
šã«çµ±åããã
Flask-WTF
æ¡åŒµæ©èœã䜿çšããŸãã
å€ãã®Flaskæ¡åŒµæ©èœã«ã¯èšå®ãå¿
èŠãªãããå¿
èŠã«å¿ããŠå€æŽã®ããã«ç°¡åã«ã¢ã¯ã»ã¹ã§ããããã«ããã€ã¯ãããã°ã«ãŒããã©ã«ããŒå
ã«èšå®ãã¡ã€ã«ãäœæããŸãã ããããå§ããŸãïŒconfig.pyãã¡ã€ã«ïŒïŒ
CSRF_ENABLED = True SECRET_KEY = 'you-will-never-guess'
ç°¡åã§ãããããã¯ã
Flask-WTF
æ¡åŒµæ©èœã«å¿
èŠãª2ã€ã®èšå®ã§ãã
CSRF_ENABLED
ã¯ãåœã®ã¯ãã¹ãµã€ããªã¯ãšã¹ãã®é²æ¢ãæå¹ã«ããŸãã ã»ãšãã©ã®å Žåããã®ãªãã·ã§ã³ãæå¹ã«ãããšãã¢ããªã±ãŒã·ã§ã³ãããå®å
šã«ãªããŸãã
SECRET_KEY
ã
CSRF
æå¹ãªå Žåã«ã®ã¿å¿
èŠã§ãã ãã©ãŒã æ€èšŒã§äœ¿çšãããæå·åããŒã¯ã³ãäœæããããã«äœ¿çšãããŸãã ã¢ããªã±ãŒã·ã§ã³ãäœæãããšãã¯ãç§å¯éµãå
¥æããã®ãé£ããããšã確èªããŠãã ããã
ããã§èšå®ãã§ããŸããã®ã§ãFlaskã«ãããèªã¿åã£ãŠäœ¿çšããããã«æ瀺ããå¿
èŠããããŸãã Flaskã¢ããªã±ãŒã·ã§ã³ãªããžã§ã¯ããäœæãããçŽåŸã«ãããè¡ãããšãã§ããŸãã ïŒãã¡ã€ã«app / __ init__.pyïŒïŒ
from flask import Flask app = Flask(__name__) app.config.from_object('config') from app import views
ãã°ã€ã³ãã©ãŒã
Flask-WTF
ãã©ãŒã ã¯
Form
ã¯ã©ã¹ã®ãµãã¯ã©ã¹ãªããžã§ã¯ããšããŠè¡šãããŸãã ãã©ãŒã ãµãã¯ã©ã¹ã¯ããã©ãŒã ãã£ãŒã«ããã¯ã©ã¹ã®å€æ°ãšããŠåçŽã«å®çŸ©ããŸãã
èå¥ã·ã¹ãã ãšäžç·ã«äœ¿çšããããã°ã€ã³ãã©ãŒã ãäœæããŸãã ã¢ããªã±ãŒã·ã§ã³ã§ãµããŒããããã°ã€ã³ã¡ã«ããºã ã¯ããŠãŒã¶ãŒå/ãã¹ã¯ãŒãã®æšæºã¿ã€ãã§ã¯ãããŸãã-OpenIDããã°ã€ã³ãšããŠäœ¿çšããŸãã OpenIDã®å©ç¹ã¯ãèªèšŒãOpenIDãããã€ããŒãä»ããŠæž¡ãããããããã¹ã¯ãŒãã確èªããå¿
èŠããªãããšã§ããããã«ããããŠãŒã¶ãŒã®ãµã€ããããå®å
šã«ãªããŸãã
OpenIDãã°ã€ã³ã«ã¯ãOpenIDãšãã1è¡ã®ã¿ãå¿
èŠã§ãã ãŸãããã©ãŒã ã«[Remember Me]ãã§ãã¯ããã¯ã¹ãããããããŠããŠãŒã¶ãŒããã©ãŠã¶ãŒã«Cookieãèšå®ã§ããããã«ããŸããããã«ããããŠãŒã¶ãŒãæ»ã£ããšãã«ãŠãŒã¶ãŒåãèšæ¶ãããŸãã
æåã®ãã©ãŒã ïŒãã¡ã€ã«app / forms.pyïŒãäœæããŸãã
from flask.ext.wtf import Form from wtforms import TextField, BooleanField from wtforms.validators import Required class LoginForm(Form): openid = TextField('openid', validators = [Required()]) remember_me = BooleanField('remember_me', default = False)
ã¯ã©ã¹ã¯ããèªäœãèªã£ãŠãããšç¢ºä¿¡ããŠããŸãã
Form
ã¯ã©ã¹ãšãå¿
èŠãª2ã€ã®ãã£ãŒã«ãã¯ã©ã¹
TextField
ãš
BooleanField
ã
ã€ã³ããŒãããã
Required
ã¯ããŠãŒã¶ãŒãéä¿¡ããããŒã¿ãæ€èšŒããããã«ãã£ãŒã«ãã«ã¢ã¿ããã§ããããªããŒã¿ãŒã§ãã
Required
ããªããŒã¿ãŒã¯ããã£ãŒã«ãã空çœã§éä¿¡ãããªãã£ãããšã確èªããã ãã§ãã
Flask-WTF
ã«ã¯å€ãã®ããªããŒã¿ãŒããããŸãããä»åŸããã€ãã®æ°ããããªããŒã¿ãŒã䜿çšããŸãã
ãã©ãŒã ãã³ãã¬ãŒã
ãã©ãŒã ãå«ãHTMLãã³ãã¬ãŒããå¿
èŠã§ãã
LoginForm
ãªããšã«ãäœæãã
LoginForm
ã¯ã©ã¹ã¯HTMLã§ãã©ãŒã ãã£ãŒã«ããã¬ã³ããªã³ã°ããæ¹æ³ãç¥ã£ãŠãããããã¬ã€ã¢ãŠãã«éäžããã ãã§ãã ãã°ã€ã³ãã³ãã¬ãŒãã¯æ¬¡ã®ãšããã§ãïŒïŒapp / templates / login.html fileïŒïŒ
{% extends "base.html" %} {% block content %} <h1>Sign In</h1> <form action="" method="post" name="login"> {{form.hidden_tag()}} <p> Please enter your OpenID:<br> {{form.openid(size=80)}}<br> </p> <p>{{form.remember_me}} Remember Me</p> <p><input type="submit" value="Sign In"></p> </form> {% endblock %}
ç¶æ¿æŒç®åãä»ããŠ
base.html
ãã³ãã¬ãŒããåã³äœ¿çšãããããæ¡åŒµããŠããããšã«æ³šæããŠãã ããã ãã¹ãŠã®ãã³ãã¬ãŒãã§ãããè¡ããã¬ã€ã¢ãŠãããã¹ãŠã®ããŒãžã§äžè²«ããŠããããšã確èªããŸãã
éåžžã®HTMLãã©ãŒã ãšãã³ãã¬ãŒãã«ã¯ããã€ãã®èå³æ·±ãéãããããŸãã ãã³ãã¬ãŒãã¯ã
form
ãã³ãã¬ãŒãåŒæ°ã§å²ãåœãŠãã°ããã®ãã©ãŒã ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãæ³å®ããŠããŸãã ä»åŸããã®ãã³ãã¬ãŒããè¿ããã¥ãŒé¢æ°ãäœæãããšãã«ããã®ãã³ãã¬ãŒãåŒæ°ã®éä¿¡ãåŠçããŸãã
ãã³ãã¬ãŒããã©ã¡ãŒã¿
form.hidden_tag()
ã¯ãCSRFãèšå®ãã¡ã€ã«ã«å«ãŸããªãããã«é衚瀺ãã£ãŒã«ãã«çœ®ãæããããŸãã CSRFãæå¹ãªå Žåããã®ãã£ãŒã«ãã¯ãã¹ãŠã®ãã©ãŒã ã«ããå¿
èŠããããŸãã
ãã©ãŒã ã®ãã£ãŒã«ãã¯ãã©ãŒã ãªããžã§ã¯ãã«ãã£ãŠæå®ãããŸãããã£ãŒã«ããæ¿å
¥ãããã³ãã¬ãŒãã®å Žæã§åŒæ°
{{form.field_name}}
ãåç
§ããã ãã§ãã äžéšã®ãã£ãŒã«ãã¯åŒæ°ãåãå ŽåããããŸãã ãã®å Žåããã©ãŒã ã«å¹
80æåã®openidãã£ãŒã«ããäœæããããã«äŸé ŒããŸãã
ãã©ãŒã ã¯ã©ã¹ã§éä¿¡ãã¿ã³ãå®çŸ©ããªãã£ããããéåžžã®ãã£ãŒã«ããšããŠå®çŸ©ããå¿
èŠããããŸãã éä¿¡ãã£ãŒã«ãã«ã¯ããŒã¿ãå«ãŸããªãããããã©ãŒã ã¯ã©ã¹ã§å®çŸ©ããå¿
èŠã¯ãããŸããã
ãã©ãŒã æåº
ãã©ãŒã ãèŠãåã®æåŸã®ã¹ãããã¯ããã³ãã¬ãŒããã¬ã³ããªã³ã°ãããã¬ãŒã³ããŒã·ã§ã³é¢æ°ãæžãããšã§ãã
ãã©ãŒã ãªããžã§ã¯ãããã³ãã¬ãŒãã«æž¡ãã ãã§ãããããããã¯å®éã«ã¯éåžžã«ç°¡åã§ãã æ°ãããã¥ãŒé¢æ°ïŒapp / views.pyãã¡ã€ã«ïŒã¯æ¬¡ã®ãšããã§ãã
from flask import render_template, flash, redirect from app import app from forms import LoginForm
LoginForm
ã¯ã©ã¹ãã€ã³ããŒããããã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŠããã³ãã¬ãŒãã«éä¿¡ããŸããã ãã©ãŒã ãã£ãŒã«ããæç»ããããã«å¿
èŠãªã®ã¯ããã ãã§ãã
flash
ã€ã³ããŒããš
redirect
泚æãæããŸããã åŸã§ãããã䜿çšããŸãã
å¥ã®é©æ°ã¯ã
route
ãã³ã¬ãŒã¿ã®ã¡ãœããåŒæ°ã§ãã ããã§ããã¥ãŒé¢æ°ã
GET
ããã³
POST
ãªã¯ãšã¹ããåãå
¥ããããšãFlaskã«äŒããŸãã ããããªããšãéä¿¡ã¯
GET
èŠæ±ã®ã¿ãåãå
¥ããŸãã ãŠãŒã¶ãŒãå
¥åããããŒã¿ãå«ããã©ãŒã ãéä¿¡ãã
POST
ãªã¯ãšã¹ããåãåãããã
ãã®æ®µéã§ãã¢ããªã±ãŒã·ã§ã³ãèµ·åãããã©ãŠã¶ã§ãã©ãŒã ã確èªã§ããŸãã éå§åŸããã¥ãŒé¢æ°loginã«é¢é£ä»ããã¢ãã¬ã¹ãéããŸãïŒ
httpïŒ// localhostïŒ5000 / loginããŒã¿ãåä¿¡ããéšåã¯ããã°ã©ã ããŠããªããããéä¿¡ãã¿ã³ãã¯ãªãã¯ããŠãå¹æã¯ãããŸããã
ãã©ãŒã ããŒã¿ã®ååŸ
Flask-WTF
ãäœæ¥ã容æã«ãããã1ã€ã®åéã¯ãéä¿¡ãããããŒã¿ã®åŠçã§ãã ããã¯
login
ãã¥ãŒé¢æ°ã®æ°ããããŒãžã§ã³ã§ããã©ãŒã ããŒã¿ïŒapp / views.pyãã¡ã€ã«ïŒãæ€èšŒããŠä¿åããŸãã
@app.route('/login', methods = ['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): flash('Login requested for OpenID="' + form.openid.data + '", remember_me=' + str(form.remember_me.data)) return redirect('/index') return render_template('login.html', title = 'Sign In', form = form)
validate_on_submit
ã¡ãœããã¯åŠçå
šäœãå®è¡ããŸãã ãã©ãŒã ããŠãŒã¶ãŒã«è¡šç€ºããããšãã«ïŒã€ãŸãããŠãŒã¶ãŒãããŒã¿ãå
¥åããåã«ïŒã¡ãœãããåŒã³åºããå ŽåããŠãŒã¶ãŒã¯
False
ãè¿ããŸãããã®å Žåããã³ãã¬ãŒããæç»ããå¿
èŠãããããšãããããŸãã
validate_on_submit
ããã©ãŒã éä¿¡ãªã¯ãšã¹ãã®äžéšãšããŠäžç·ã«åŒã³åºãããå Žåããã¹ãŠã®ããŒã¿ãåéãããã£ãŒã«ãã«ã¢ã¿ãããããããªããŒã¿ãŒãå®è¡ããŸãããã¹ãŠåé¡ãªããã°ãããŒã¿ã®æå¹æ§ã瀺ã
True
ãè¿ããŸãã ããã¯ãããŒã¿ãã¢ããªã±ãŒã·ã§ã³ã«å«ããã®ã«å®å
šã§ããããšãæå³ããŸãã
å°ãªããšã1ã€ã®ãã£ãŒã«ããæ€èšŒã«åæ Œããªãå Žåãé¢æ°ã¯
False
ãè¿ããŸããããã«ããããŠãŒã¶ãŒã®åã«ãã©ãŒã ãåã³æç»ããããšã©ãŒãä¿®æ£ã§ããããã«ãªããŸãã åŸã§ãæ€èšŒã倱æãããšãã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããæ¹æ³ãåŠç¿ããŸãã
validate_on_submit
ã
True
validate_on_submit
è¿ããšããã¥ãŒé¢æ°ã¯Flaskããã€ã³ããŒãããã2ã€ã®æ°ããé¢æ°ãåŒã³åºããŸãã
Flash
æ©èœã¯ããŠãŒã¶ãŒã«è¡šç€ºããã次ã®ããŒãžã«ã¡ãã»ãŒãžã衚瀺ããç°¡åãªæ¹æ³ã§ãã ãã®å Žåããã®ã³ã°ã«å¿
èŠãªã€ã³ãã©ã¹ãã©ã¯ãã£ãã§ãããŸã§ãããã°ã«ããã䜿çšãã代ããã«ãéä¿¡ãããããŒã¿ã瀺ãã¡ãã»ãŒãžã衚瀺ããŸãã
flash
ããŠãŒã¶ãŒã®ãã£ãŒãããã¯ãæäŸããæ¬çªãµãŒããŒã§ãéåžžã«åœ¹ç«ã¡ãŸãã
Flashã¡ãã»ãŒãžã¯ããŒãžã«èªåçã«è¡šç€ºãããŸããããã³ãã¬ãŒãã¯ãµã€ãã®ã¬ã€ã¢ãŠãã«åã£ã圢åŒã§ã¡ãã»ãŒãžã衚瀺ããå¿
èŠããããŸãã ãã¹ãŠã®ãã³ãã¬ãŒãããã®æ©èœãç¶æ¿ããããã«ãããŒã¹ãã³ãã¬ãŒãã«ã¡ãã»ãŒãžãè¿œå ããŸãã ããã¯æŽæ°ãããåºæ¬ãã³ãã¬ãŒãã§ãïŒãã¡ã€ã«app / templates / base.htmlïŒïŒ
<html> <head> {% if title %} <title>{{title}} - microblog</title> {% else %} <title>microblog</title> {% endif %} </head> <body> <div>Microblog: <a href="/index">Home</a></div> <hr> {% with messages = get_flashed_messages() %} {% if messages %} <ul> {% for message in messages %} <li>{{ message }} </li> {% endfor %} </ul> {% endif %} {% endwith %} {% block content %}{% endblock %} </body> </html>
ã¡ãã»ãŒãžã®è¡šç€ºæ¹æ³ã«èª¬æãå¿
èŠãªãããšãé¡ã£ãŠããŸãã
ãã°ã€ã³ãã¥ãŒã§äœ¿çšããå¥ã®æ°ããæ©èœã¯
redirect
ã§ãã ãã®é¢æ°ã¯ãèŠæ±ãããããŒãžã§ã¯ãªããã¯ã©ã€ã¢ã³ãã®Webãã©ãŠã¶ãŒãå¥ã®ããŒãžã«ãªãã€ã¬ã¯ãããŸãã ãã¬ãŒã³ããŒã·ã§ã³æ©èœã§ã¯ãåã®ããŒãã§éçºããã¡ã€ã³ããŒãžãžã®ãªãã€ã¬ã¯ãã䜿çšããŸããã é¢æ°ããªãã€ã¬ã¯ãã§çµäºããå Žåã§ãããã©ãã·ã¥ã¡ãã»ãŒãžã衚瀺ãããããšã«æ³šæããŠãã ããã
ã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããã©ãŒã ãã©ã®ããã«æ©èœãããã確èªããã®ã«æé©ãªæéã§ãã 空ã®openidãã£ãŒã«ããæã€ãã©ãŒã ãéä¿¡ããŠã
Required
ããªããŒã¿ãŒãéä¿¡ããã»ã¹ãåæ¢ããæ¹æ³ã確èªããŠãã ããã
ãã£ãŒã«ãæ€èšŒã®æ¹å
çŸåšã®ç¶æ
ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãç¡å¹ãªããŒã¿ã§éä¿¡ããããã©ãŒã ã¯åãå
¥ããããŸããã 代ããã«ããã©ãŒã ã¯åã³ä¿®æ£ã®ããã«ãŠãŒã¶ãŒã«éä¿¡ãããŸãã ããããŸãã«ç§ãã¡ã«å¿
èŠãªãã®ã§ãã
ç§ãã¡ãèŠéããã®ã¯ããã©ãŒã ã®äœãééã£ãŠãããã®ãŠãŒã¶ãŒããã®éç¥ã§ããã 幞ããªããšã«ã
Flask-WTF
ã¯ãã®ã¿ã¹ã¯ãç°¡åã«ããŸãã
ãã£ãŒã«ãã®æ€èšŒã«å€±æãããšã
Flask-WTF
ã¯ãã©ãŒã ãªããžã§ã¯ãã«èŠèŠçãªãšã©ãŒã¡ãã»ãŒãžãè¿œå ããŸãã ãããã®ã¡ãã»ãŒãžã¯ãã³ãã¬ãŒãã§å©çšã§ããããã衚瀺ããããžãã¯ãè¿œå ããã ãã§ãã
ããã¯ããã£ãŒã«ãæ€èšŒã¡ãã»ãŒãžãå«ããã°ã€ã³ãã³ãã¬ãŒãã§ãïŒãã¡ã€ã«app / templates / login.htmlïŒïŒ
{% extends "base.html" %} {% block content %} <h1>Sign In</h1> <form action="" method="post" name="login"> {{form.hidden_tag()}} <p> Please enter your OpenID:<br> {{form.openid(size=80)}}<br> {% for error in form.errors.openid %} <span style="color: red;">[{{error}}]</span> {% endfor %}<br> </p> <p>{{form.remember_me}} Remember Me</p> <p><input type="submit" value="Sign In"></p> </form> {% endblock %}
ç§ãã¡ãè¡ã£ãå¯äžã®å€æŽã¯ãopenidãã£ãŒã«ãã®å³åŽã«ããªããŒã¿ãŒã«ãã£ãŠè¿œå ããããšã©ãŒã¡ãã»ãŒãžãæç»ããã«ãŒããè¿œå ããããšã§ããã ååãšããŠãããªããŒã¿ãŒãæ·»ä»ããããã£ãŒã«ãã«ã¯ã
form.errors._
ãšããŠãšã©ãŒãè¿œå ãã
form.errors._
ã ãã®å Žåã
form.errors.openid
ã䜿çšã
form.errors.openid
ã ãããã®ã¡ãã»ãŒãžãèµ€ã§è¡šç€ºããŠããŠãŒã¶ãŒã®æ³šæãåèµ·ããŸãã
OpenIDãšã®çžäºäœçš
å®éãå€ãã®äººããã§ã«OpenIDãããã€ãæã£ãŠããããšããç¥ããªããšããäºå®ã«çŽé¢ããŸãã å€ãã®äž»èŠãªã€ã³ã¿ãŒããããµãŒãã¹ãããã€ããŒããŠãŒã¶ãŒã®OpenIDèªèšŒããµããŒãããŠããããšã¯ããŸãç¥ãããŠããŸããã ããšãã°ãGoogleã¢ã«ãŠã³ããæã£ãŠããå Žåã¯ãOpenIDãæã£ãŠããŸãã YahooãAOLãFlickrããã®ä»ã®å€ãã®ãµãŒãã¹ãšåæ§ã«ã
é »ç¹ã«äœ¿çšãããOpenIDã®ããããã䜿çšããŠãµã€ããžã®ãŠãŒã¶ãŒã¢ã¯ã»ã¹ã容æã«ããããã«ããŠãŒã¶ãŒãOpenIDãæåã§å
¥åããå¿
èŠããªãããã«ããããã®äžéšã«ãªã³ã¯ãè¿œå ããŸãã
玹ä»ãããOpenIDãããã€ããŒã®ãªã¹ããå®çŸ©ããããšããå§ããŸãããã èšå®ãã¡ã€ã«ïŒconfig.pyãã¡ã€ã«ïŒã§ãããè¡ãããšãã§ããŸãïŒ
OPENID_PROVIDERS = [ { 'name': 'Google', 'url': 'https://www.google.com/accounts/o8/id' }, { 'name': 'Yahoo', 'url': 'https://me.yahoo.com' }, { 'name': 'AOL', 'url': 'http://openid.aol.com/<username>' }, { 'name': 'Flickr', 'url': 'http://www.flickr.com/<username>' }, { 'name': 'MyOpenID', 'url': 'https://www.myopenid.com' }]
ãã°ã€ã³ãã¥ãŒé¢æ°ã§ãã®ãªã¹ãã䜿çšããæ¹æ³ãèŠãŠã¿ãŸãããã
@app.route('/login', methods = ['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): flash('Login requested for OpenID="' + form.openid.data + '", remember_me=' + str(form.remember_me.data)) return redirect('/index') return render_template('login.html', title = 'Sign In', form = form, providers = app.config['OPENID_PROVIDERS'])
ããã§ã¯ã
app.config
ããŒã§èšå®ãæ€çŽ¢ããŠèšå®ãååŸããŸãã ãªã¹ãã¯ããã³ãã¬ãŒãåŒæ°ãšããŠ
render_template
åŒã³åºãã«è¿œå ãããŸãã
ãæ³åã®ãšããããããçµäºããã«ã¯å¥ã®æé ãå®è¡ããå¿
èŠããããŸãã 次ã«ããã°ã€ã³ãã³ãã¬ãŒãïŒãã¡ã€ã«app / templates / login.htmlïŒã§ãããã®ãããã€ããŒãžã®ãªã³ã¯ã衚瀺ããæ¹æ³ãæå®ããå¿
èŠããããŸãã
{% extends "base.html" %} {% block content %} <script type="text/javascript"> function set_openid(openid, pr) { u = openid.search('<username>') if (u != -1) { </script> <h1>Sign In</h1> <form action="" method="post" name="login"> {{form.hidden_tag()}} <p> Please enter your OpenID, or select one of the providers below:<br> {{form.openid(size=80)}} {% for error in form.errors.openid %} <span style="color: red;">[{{error}}]</span> {% endfor %}<br> |{% for pr in providers %} <a href="javascript:set_openid('{{pr.url}}', '{{pr.name}}');">{{pr.name}}</a> | {% endfor %} </p> <p>{{form.remember_me}} Remember Me</p> <p><input type="submit" value="Sign In"></p> </form> {% endblock %}
ãããã®ãã¹ãŠã®å€æŽã«é¢é£ããŠããã³ãã¬ãŒãã¯ããé·ãããšãå€æããŸããã äžéšã®OpenIDã«ã¯ãŠãŒã¶ãŒåãå«ãŸããŠããããããŠãŒã¶ãŒåãèŠæ±ããŠããOpenIDãäœæããJavaScriptããžãã¯ãå¿
èŠã§ãã ãŠãŒã¶ãŒããããã€ããŒã®OpenIDãªã³ã¯ãã¯ãªãã¯ããïŒãªãã·ã§ã³ã§ïŒãŠãŒã¶ãŒåãå
¥åãããšããã®ãããã€ããŒã®OpenIDãããã¹ãããã¯ã¹ã«æ¿å
¥ãããŸãã
Google OpenIDãªã³ã¯ãã¯ãªãã¯ããåŸã®ãã°ã€ã³ããŒãžã®ã¹ã¯ãªãŒã³ã·ã§ããæåŸã®èšè
ãã°ã€ã³ãã©ãŒã ã¯å€§å¹
ã«é²æ©ããŸããããå®éã«ã¯ããŠãŒã¶ãŒãã·ã¹ãã ã«å
¥ãããã«äœãããŠããŸããã ç§ãã¡ãããããšã¯ããã°ã€ã³ããã»ã¹ã®GUIã«é¢é£ããããšã ãã§ããã ããã¯ãå®éã®ãã°ã€ã³ãè¡ãåã«ããŠãŒã¶ãŒãèšé²ã§ããããŒã¿ããŒã¹ãå¿
èŠã ããã§ãã
次ã®éšåã§ã¯ãããŒã¿ããŒã¹ãäœæããŠèµ·åããŸããå°ãåŸã§ãã°ã€ã³ã·ã¹ãã ãå®æãããŸãã®ã§ã以äžã®èšäºã®æŽæ°ã«ã泚ç®ãã ããã
çŸåšã®ç¶æ
ã®ãã€ã¯ãããã°ã¢ããªã±ãŒã·ã§ã³ã¯ãããããããŠã³ããŒãã§ããŸãã
microblog-0.3.zipzipãã¡ã€ã«ã«ã¯ããã©ã¹ã³ä»®æ³ç°å¢ãå«ãŸããŠããªãããšã«æ³šæããŠãã ããã ã¢ããªã±ãŒã·ã§ã³ãéå§ããåã«ãæåã®éšåã®æ瀺ã«åŸã£ãŠèªåã§äœæããŸãã
ã質åããæèŠããããŸããããäžã«èªç±ã«æ®ããŠãã ããã
ãã²ã«