ساخت فرمهای HTML با Flask-WTF
Flask-WTF یک افزونهی قدرتمند برای فریمورک Flask در پایتون است که فرآیند ساخت، اعتبارسنجی و رندر کردن فرمهای HTML را به شدت ساده میکند. این مقاله به بررسی جامع این افزونه، مفاهیم کلیدی و نحوهی استفاده از آن میپردازد. این آموزش برای توسعهدهندگان وب پایتون که به دنبال راهی کارآمد برای مدیریت فرمها در برنامههای خود هستند، مناسب است.
پیشنیازها
قبل از شروع، اطمینان حاصل کنید که موارد زیر را نصب کردهاید:
- پایتون (نسخهی 3.6 یا بالاتر)
- Flask
- Flask-WTF
- HTML و CSS (آشنایی اولیه)
برای نصب Flask و Flask-WTF از pip استفاده کنید:
pip install flask flask-wtf
مقدمهای بر Flask-WTF
Flask-WTF بر اساس WTForms ساخته شده است، یک کتابخانهی فرمسازی پایتون. Flask-WTF با ادغام WTForms با Flask، امکان ایجاد فرمها را به صورت شیگرا فراهم میکند. این افزونه به شما کمک میکند تا:
- فرمها را به صورت کلاسهای پایتون تعریف کنید.
- فیلدهای فرم را با انواع مختلف (متنی، ایمیل، رمز عبور و غیره) مشخص کنید.
- اعتبارسنجی فرم را به راحتی انجام دهید (مثلاً بررسی اینکه یک فیلد خالی نباشد یا یک ایمیل معتبر باشد).
- فرمها را به صورت HTML رندر کنید.
- دادههای ارسالی فرم را به راحتی پردازش کنید.
ایجاد یک فرم ساده
بیایید با یک مثال ساده شروع کنیم. فرض کنید میخواهیم یک فرم برای جمعآوری نام کاربری و ایمیل ایجاد کنیم.
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, EmailField, SubmitField
from wtforms.validators import DataRequired, Email
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key' # کلید امنیتی را تغییر دهید!
class RegistrationForm(FlaskForm):
username = StringField('نام کاربری', validators=[DataRequired()])
email = EmailField('ایمیل', validators=[DataRequired(), Email()])
submit = SubmitField('ثبت نام')
@app.route('/', methods=['GET', 'POST'])
def index():
form = RegistrationForm()
if form.validate_on_submit():
username = form.username.data
email = form.email.data
# در اینجا میتوانید دادهها را پردازش کنید (مثلاً ذخیره در پایگاه داده)
return f"ثبت نام با موفقیت انجام شد! نام کاربری: {username}, ایمیل: {email}"
return render_template('index.html', form=form)
if __name__ == '__main__':
app.run(debug=True)
در این مثال:
- `FlaskForm` کلاس پایه برای فرمهای ما است.
- `StringField` و `EmailField` فیلدهای فرم را تعریف میکنند.
- `DataRequired` و `Email` اعتبارسنجیها را مشخص میکنند.
- `SubmitField` یک دکمهی ارسال را ایجاد میکند.
- `validate_on_submit()` بررسی میکند که فرم به درستی ارسال شده و اعتبارسنجیها موفقیتآمیز بودهاند.
- `form.username.data` و `form.email.data` به دادههای ارسالی فرم دسترسی پیدا میکنند.
رندر کردن فرم در HTML
برای رندر کردن فرم در یک فایل HTML، از متغیر `form` که به تابع `render_template` ارسال شده است، استفاده میکنیم.
ایجاد فایل `templates/index.html`:
<!DOCTYPE html>
<html>
<head>
<title>فرم ثبت نام</title>
</head>
<body>
<form method="POST" action="/">
<{{ form.csrf_token }}>
<p>{{ form.username.label }}<br>
<{{ form.username }}>
{% for error in form.username.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>
<p>{{ form.email.label }}<br>
<{{ form.email }}>
{% for error in form.email.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>
<p>{{ form.submit }}</p>
</form>
</body>
</html>
در این فایل HTML:
- `{{ form.csrf_token }}` یک توکن امنیتی را برای جلوگیری از حملات CSRF (Cross-Site Request Forgery) اضافه میکند.
- `{{ form.username.label }}` برچسب فیلد نام کاربری را نمایش میدهد.
- `{{ form.username }}` خود فیلد نام کاربری را نمایش میدهد.
- `{% for error in form.username.errors %}` پیامهای خطا را در صورت وجود نمایش میدهد.
انواع فیلدهای فرم
Flask-WTF انواع مختلفی از فیلدهای فرم را ارائه میدهد. برخی از رایجترین آنها عبارتند از:
- `StringField`: برای فیلدهای متنی.
- `EmailField`: برای فیلدهای ایمیل.
- `PasswordField`: برای فیلدهای رمز عبور.
- `IntegerField`: برای فیلدهای عدد صحیح.
- `FloatField`: برای فیلدهای عدد اعشاری.
- `BooleanField`: برای فیلدهای بولی (درست/نادرست).
- `DateField`: برای فیلدهای تاریخ.
- `DateTimeField`: برای فیلدهای تاریخ و زمان.
- `SelectField`: برای فیلدهای انتخاب از لیست.
- `TextAreaField`: برای فیلدهای متنی بزرگ.
- `SubmitField`: برای دکمههای ارسال.
اعتبارسنجی فرم
Flask-WTF امکان اعتبارسنجی فرم را به روشهای مختلفی فراهم میکند:
- اعتبارسنجیهای داخلی WTForms: مانند `DataRequired` (فیلد اجباری است)، `Email` (فیلد باید یک ایمیل معتبر باشد)، `Length` (طول فیلد باید در محدوده مشخصی باشد)، `NumberRange` (مقدار فیلد باید در محدوده مشخصی باشد) و غیره.
- اعتبارسنجیهای سفارشی: میتوانید اعتبارسنجیهای سفارشی خود را با استفاده از توابع پایتون ایجاد کنید.
مثال اعتبارسنجی سفارشی:
from wtforms import validators
def is_valid_username(form, field):
if len(field.data) < 5:
raise validators.ValidationError('نام کاربری باید حداقل 5 کاراکتر داشته باشد.')
class RegistrationForm(FlaskForm):
username = StringField('نام کاربری', validators=[DataRequired(), is_valid_username])
# ...
ویژگیهای پیشرفته
Flask-WTF ویژگیهای پیشرفتهتری نیز ارائه میدهد، از جمله:
- فرمهای پویا: میتوانید فرمها را به صورت پویا بر اساس دادههای موجود ایجاد کنید.
- فرمهای تودرتو: میتوانید فرمهایی را در داخل فرمهای دیگر قرار دهید.
- ادغام با ORM: میتوانید فرمها را با مدلهای پایگاه داده خود ادغام کنید.
- Localization: میتوانید فرمها را برای زبانهای مختلف بومیسازی کنید.
نکات مهم
در هنگام استفاده از Flask-WTF، به نکات زیر توجه کنید:
- کلید امنیتی: حتماً یک کلید امنیتی قوی و تصادفی برای برنامه Flask خود تنظیم کنید.
- CSRF Protection: از توکن CSRF برای محافظت از فرمهای خود در برابر حملات CSRF استفاده کنید.
- اعتبارسنجی دادهها: همیشه دادههای ارسالی فرم را قبل از پردازش اعتبارسنجی کنید.
- مدیریت خطاها: پیامهای خطای مناسب را به کاربران نمایش دهید تا به آنها کمک کنید تا فرم را به درستی پر کنند.
نتیجهگیری
Flask-WTF یک افزونهی قدرتمند و انعطافپذیر برای ساخت فرمهای HTML در برنامههای Flask است. با استفاده از این افزونه، میتوانید فرآیند ساخت، اعتبارسنجی و رندر کردن فرمها را به شدت ساده کنید و برنامههای وب خود را با فرمهای کارآمد و امن تجهیز کنید. این مقاله یک مقدمهی جامع بر Flask-WTF ارائه داد و به شما کمک میکند تا با مفاهیم کلیدی و نحوهی استفاده از آن آشنا شوید.

بدون دیدگاه