30-05-2017, Saat: 17:14
flask-wtf eklentisi ile web form tanımlamayı görmüştük. Şimdi bu formdan veri nasıl alırız ona bakalım.
Kod:
#hello.py
from flask import Flask, render_template, redirect
from flask_bootstrap import Bootstrap
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
bootstrap = Bootstrap(app)
class NameForm(FlaskForm):
name = StringField("Enter your name", validators=[DataRequired()])
submit = SubmitField("Submit")
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
name = form.name.data
print(name)
return redirect(url_for('index'))
render_template('index.html', form=form)
#index.html
{% import 'bootstrap/wtf.html' as wtf %}
{{wtf.quick_form(form)}}
Form elemanlarından post edilen veriyi almak için:
Kod:
form_ismi.alan_ismi.data
şeklinde erişilir. Örnekte yeni gördüğünüz
Kod:
validate_on_submit()
metodu
Kod:
FlaskForm
sınıfının metodudur. Bu metot validatorlar aracılığıyla bir alana girilen verinin geçerli olup olmadığını kontrol eder. Eğer metot True dönerse
Kod:
if
bloğuna girip name alanına girilen datayı alıyoruz.
redirect(): bu fonksiyon parametre olarak aldığı adrese yönlendirme yapar. Örneğimizde form gönderildikten sonra tekrardan kendi üzerinde dönderiyoruz.
Kod:
url_for()
fonksiyonuna parametre olara
Kod:
index
view fonksiyonunu verdik. Bu view fonksiyonundan
Kod:
url_for()
bir url oluşturur ve
Kod:
redirect
fonksiyonu bunu kullanır.
Sayfa yeniden kendi üzerinde yenilendiğinden veriler uçup gider. Bu form verilerini veritabanına veya
Kod:
session
'a eklemeliyiz ki url'ler arasında gezindiğimizde veriler hatırlansın. Session kullanarak
Kod:
form.name.data
değerini kaydedelim:
Kod:
from flask import session
...
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
session["name"] = "anonymous"
if form.validate_on_submit():
session["name"] = form.name.data
redirect(url_for('user'))
return render_template('index.html', form=form, name=session.get("name")
@app.route('/user')
def user():
name = session.get("name")
return name
Form post edildiğinde
Kod:
session["name"]
değeri
Kod:
name
alanındaki değerle dolacaktır. Eğer form gönderilmezse
Kod:
session["name"] = "anonymous"
olarak kalacaktır. Form'u göndermeden tarayıcıdan localhost:5000/user adresine kendiniz giderseniz "anonymous" yazısını görürsünüz. Form post edildikten sonra user sayfasına yönlendirme yapılıyor. Artık name değeri post verisindeki name değeri olacaktır. Sessionda saklanan veriler tüm view fonksiyonları tarafında görünürdür.
Not:
Bir form post edildiğinde eğer bu post işleminden sonra sayfa başka bir yere veya sayfanın kendisi yenilenmezse tarayıcıyı yenilediğizde yeniden gönderilsin diye bir uyarı çıkacaktır. İleride veritabanına veri eklerken iki kez ekleme sorunuyla karşılaşabilirsiniz. Bunun için en iyi yöndem her post işleminden sonra sayfayı bir yere yönlendirin veya yenileyin: post/redirect/get tasarımı(pattern) olarak geçer.