ð§Ÿ Flaskãã©ãŒã ã®äœ¿ãæ¹ããããã解説ïŒ
ãã®èšäºã§ã¯ããFlaskããšããPythonã§Webã¢ããªãäœããšãã«ãã䜿ãããããŒã«ã䜿ã£ãŠããŠãŒã¶ãŒããã®å
¥åïŒãã©ãŒã ïŒãã©ããã£ãŠåãåããã説æããŸãã
ãã©ãŒã ãšããã®ã¯ããŠãŒã¶ãŒã«ãååãå
¥åããŠãã ããããšãããã¹ã¯ãŒããå
¥åããŠãã ããããšãã£ãæäœãããŠãããããã®ä»çµã¿ã§ãã
ð¡ ãã®èšäºã§åŠã¹ãããš
- HTMLã§ãã©ãŒã ãäœãæ¹æ³ïŒèŠãç®ïŒ
- Flaskã§ãã©ãŒã ããã®ããŒã¿ãåãåãæ¹æ³ïŒäžèº«ïŒ
- å ¥åã«ééãããã£ããšãã®ãšã©ãŒã¡ãã»ãŒãžã®åºãæ¹
- Flask-WTFãšããéå ·ã䜿ã£ãŠããã£ãšå®å šã§äŸ¿å©ãªãã©ãŒã ãäœãæ¹æ³
- å®éã®ã¢ããªã§ã©ã䜿ããããèãæ¹ã®ãã³ã
ð HTMLã§ãã©ãŒã ãäœãã
ãŸãã¯ãèŠãç®ã®éšåããã¹ã¿ãŒãã§ãã
WebããŒãžã«æåãå
¥åãããç®±ãããéä¿¡ãã¿ã³ããäœãã«ã¯ãHTMLã®ãã©ãŒã ã¿ã°ã䜿ããŸãã
<!-- register.html -->
<form action="/register" method="post">
<label>ãŠãŒã¶ãŒå:</label>
<input type="text" name="username" required><br>
<label>ãã¹ã¯ãŒã:</label>
<input type="password" name="password" required><br>
<input type="submit" value="ç»é²">
</form>
ãã®ã³ãŒãã®æå³ïŒ
- action="/register"ïŒããŒã¿ãã©ãã«éãããä»å㯠/register ãšããURLã«éãã
- method="post"ïŒããŒã¿ãéãæ¹æ³ãPOSTã ãšç»é¢ã«è¡šç€ºããããå®å šã
- requiredïŒãã®é ç®ãå ¥åããªããšéä¿¡ã§ããªãããã«ããã
ãã©ãŒã ã¯ãååããã¹ã¯ãŒãã®å ¥å以å€ã«ãããã§ãã¯ããã¯ã¹ãã©ãžãªãã¿ã³ãæ¥ä»ããã¡ã€ã«éžæãªã©ããããããªçš®é¡ã®å ¥åãã§ããŸãã
𧪠Flaskã§ãã©ãŒã ãåãåãã
ãã©ãŒã ããéãããŠããããŒã¿ãFlaskã§åãåãæ¹æ³ãèŠãŠã¿ãŸãããã
# app.py
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route("/register", methods=["GET", "POST"])
def register():
if request.method == "POST":
name = request.form["username"]
pw = request.form["password"]
return f"{name}ãããç»é²ããããšãããããŸãïŒ"
return render_template("register.html")
ãã®ã³ãŒãã®åãïŒ
- æåã«ã¢ã¯ã»ã¹ãããšãïŒGETïŒãHTMLã®å ¥åç»é¢ãèŠããã
- å
¥åããŠéä¿¡ãããšïŒPOSTïŒãäžã®å€ïŒååãšãã¹ã¯ãŒãïŒãåãåã£ãŠã¡ãã»ãŒãžãè¿ãã
ããã§ã¯ request.form ã䜿ã£ãŠããã©ãŒã ã®äžã®ããŒã¿ãåãåºããŠããŸãã
HTMLãšPythonã®é¢ä¿ïŒ
ãã® register.html ã«ãããã©ãŒã ã¯ãFlaskã® app.py ã«ãã /register ã®ã«ãŒããšã€ãªãã£ãŠããŸãã
- HTMLã® form action="/register" ãšãFlaskã® @app.route("/register", ...) ãäžèŽããŠããããšããã€ã³ãã§ãã
- å ¥åæ¬ã® name="username" ã name="password" ã¯ãPythonåŽã® request.form["username"] ã request.form["password"] ã«å¯Ÿå¿ããŠããŸãã
ð Flask-WTFã§å®å šã§äŸ¿å©ãªãã©ãŒã ãäœãã
ãFlask-WTFããšããéå ·ã䜿ããšãå ¥åã®ãã§ãã¯ãã»ãã¥ãªãã£å¯Ÿçãç°¡åã«ã§ããŸãã
ã€ã³ã¹ããŒã«
ãŸãã¯ãFlask-WTFãã€ã³ã¹ããŒã«ããŸãïŒ
pip install flask-wtf
Pythonã§ãã©ãŒã ã®åœ¢ãäœã
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired
class RegisterForm(FlaskForm):
username = StringField('ãŠãŒã¶ãŒå', validators=[DataRequired()])
password = PasswordField('ãã¹ã¯ãŒã', validators=[DataRequired()])
submit = SubmitField('ç»é²')
- validators=[DataRequired()] ãšæžãããšã§ããå¿ ãå ¥åããŠãã ããããšããã«ãŒã«ãã§ããŸãã
Flaskã§äœ¿ãã³ãŒã
app.config['SECRET_KEY'] = 'ã²ã¿ã€ã®ããŒ'
@app.route("/register", methods=["GET", "POST"])
def register():
form = RegisterForm()
if form.validate_on_submit():
return f"{form.username.data}ãããç»é²ã§ããŸããïŒ"
return render_template("register.html", form=form)
- ãã®ã³ãŒãã§ã¯ãå ¥åãããããŒã¿ããã¡ããšã«ãŒã«ã«åã£ãŠãããïŒïŒããªããŒã·ã§ã³ïŒããã§ãã¯ããŠãããæ¬¡ã®åŠçã«é²ãã§ããŸãã
HTMLïŒãã³ãã¬ãŒãïŒåŽã®æžãæ¹
<form method="POST">
{{ form.hidden_tag() }}
{{ form.username.label }}<br>{{ form.username }}<br>
{{ form.password.label }}<br>{{ form.password }}<br>
{{ form.submit }}
</form>
- form.hidden_tag() ã¯ããã©ãŒã ãæ£ããéãããããšããã§ãã¯ããããã®æ å ±ãå ¥ããŠãããŸãïŒCSRF察çãšãããŸãïŒã
â ïž å ¥åãšã©ãŒãèŠããæ¹æ³
ãã©ãŒã ã§å ¥åãã¹ããã£ããšãããŠãŒã¶ãŒã«æããŠãããæ¹æ³ã§ãã
{% for field in form %}
{% for error in field.errors %}
<div style="color:red">{{ error }}</div>
{% endfor %}
{% endfor %}
ããšãã°ããã¹ã¯ãŒããå
¥åããªãã£ãå Žåãããã®ãã£ãŒã«ãã¯å¿
é ã§ãããšãã£ãã¡ãã»ãŒãžã衚瀺ã§ããŸãã
ãŠãŒã¶ãŒã«ãšã£ãŠãäœãééã£ãŠããã®ããããã«ãããããã«ããã®ã¯ããšãŠã倧åãªããšã§ãã
â ãŸãšã
- HTMLã䜿ã£ãŠãWebããŒãžã«å ¥åæ¬ãäœããïŒ
- Flaskã§ããŠãŒã¶ãŒã®å ¥åãåãåã£ãŠäœ¿ããïŒ
- Flask-WTFã䜿ãã°ããã£ãšå®å šã§äœ¿ãããããã©ãŒã ãäœããïŒ
- å ¥åãã¹ããã£ãããã¡ãããšãšã©ãŒã¡ãã»ãŒãžãåºããïŒ
æ ªåŒäŒç€ŸONE WEDGE
ãServerlessã§äžã®äžããã£ãšæ¥œããã ONE WEDGEã¯Serverlessã·ã¹ãã éçºãäžæ žæè¡ãšããŠWebç³»ã·ã¹ãã éçºãAWS/GCPãå©çšããæ¥åã·ã¹ãã ã»ãµãŒãã¹éçºãPWAãçšããã¢ãã€ã«éçºãAlexaã¹ãã«éçºãªã©ãå æ°ãšæè¡åãæŠåšã«ã客æ§ã«çæ¯ã«åãåã䟡å€åµé äŒæ¥ã§ãã
Discussion