کتابخانه flask-wtf در پایتون
Flask-WTF یک افزونه محبوب برای فریمورک وب Flask است که امکانات WTForms را بهراحتی در اختیار برنامههای Flask قرار میدهد. این کتابخانه کار با فرمها، مدیریت CSRF، اعتبارسنجی (validation) و پشتیبانی از آپلود فایل را ساده میکند و به توسعهدهندگان فرصت میدهد تا فرمهای امن و قابل نگهداری بسازند.
چرا از Flask-WTF استفاده کنیم؟
- ادغام ساده با Flask و Jinja2
- پشتیبانی خودکار از CSRF و توکن امنیتی
- مجموعهای غنی از فیلدها و اعتبارسنجیها
- قابلیت افزودن اعتبارسنجی سفارشی و پیامهای خطای قابل تنظیم
- پشتیبانی فایل و محدودیتهای مربوطه
نصب و راهاندازی اولیه
برای نصب از pip استفاده کنید:
pip install Flask-WTF
سپس یک پیکربندی پایه در اپلیکیشن Flask تعریف کنید:
from flask import Flask
from flask_wtf import FlaskForm
app = Flask(__name__)
app.config['SECRET_KEY'] = 'replace-with-a-secret-key' # ضروری برای CSRF
کدی که بالا آمد، مقداردهی اولیهٔ اپ و تنظیم SECRET_KEY را نشان میدهد که برای فعالسازی CSRF ضروری است.
مثال کامل: تعریف فرم و مسیر ارسال
from flask import Flask, render_template, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, Email
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired(), Length(min=3, max=25)])
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired(), Length(min=6)])
submit = SubmitField('Register')
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
# پردازش دادهها، ذخیره در پایگاهداده و ...
return redirect(url_for('success'))
return render_template('register.html', form=form)
این کد نمونه یک فرم ثبتنام با سه فیلد و یک دکمه تعریف میکند. تابع validate_on_submit() بررسی میکند که فرم با متد POST ارسال شده و همهٔ اعتبارسنجیها عبور کردهاند.
اعتبارسنجی سفارشی و نکات پیشرفته
میتوانید ولیدیتورهای سفارشی بسازید یا متدهای validate_ در کلاس فرم تعریف کنید:
from wtforms.validators import ValidationError
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
# ...
def validate_username(self, username):
if username.data.lower() == 'admin':
raise ValidationError('نام کاربری نامعتبر است.')
اینجا متد validate_username قبل از سایر ولیدیتورها اجرا شده و در صورت نیاز خطا برمیگرداند. این روش برای قواعد پیچیده مفید است.
آپلود فایل با Flask-WTF
from flask_wtf.file import FileField, FileAllowed, FileRequired
from werkzeug.utils import secure_filename
import os
class UploadForm(FlaskForm):
photo = FileField('Profile Photo', validators=[FileRequired(), FileAllowed(['jpg','png'],'Images only!')])
submit = SubmitField('Upload')
@app.route('/upload', methods=['GET','POST'])
def upload():
form = UploadForm()
if form.validate_on_submit():
f = form.photo.data
filename = secure_filename(f.filename)
f.save(os.path.join('uploads', filename))
return 'Uploaded'
return render_template('upload.html', form=form)
در مثال بالا از FileAllowed برای محدود کردن نوع فایل و از secure_filename برای جلوگیری از آسیبپذیری مسیر فایل استفاده شده است. همچنین مطمئن شوید پوشهٔ uploads وجود داشته و دسترسی نوشتن دارد.
پیکربندی امنیتی و نکات عملی
- SECRET_KEY را همیشه از محیط (ENV) بارگذاری کنید، هرگز مقدار ثابت در سورس نباشد.
- از CSRF محافظت میکند؛ اگر API با JSON میسازید، ممکن است CSRF را به صورت متفاوت هندل کنید.
- برای امنیت فایلها از allowed extensions و بررسیهای MIME استفاده کنید.
- حداکثر اندازه درخواست را با config[‘MAX_CONTENT_LENGTH’] محدود کنید تا حملات آپلود حجیم کنترل شود.
مقایسه Flask-WTF و WTForms
| موضوع | Flask-WTF | WTForms |
|---|---|---|
| ادغام با Flask | بله (ساده) | خیر (کتابخانه پایه) |
| CSRF | خودکار و ساده | نیاز به راهاندازی دستی |
| پشتیبانی فایل | بله (flask_wtf.file) | بله (wtforms چه به صورت پایه) |
نکات و توصیههای حرفهای
- فرمها را در فایلهای جداگانه نگه دارید تا کد تمیز و تستپذیر بماند.
- از پیامهای خطای کاربرپسند و قابل ترجمه استفاده کنید (i18n/Localization).
- برای اعتبارسنجیهای پیچیده، منطق را به لایهٔ سرویس یا مدل منتقل کنید تا فرم سبک بماند.
- در پروژههای بزرگ از Blueprint و فرمهای modular بهره ببرید.
جمعبندی
Flask-WTF ابزاری قدرتمند برای مدیریت فرمها در اپلیکیشنهای Flask است. با پشتیبانی از CSRF، ولیدیتور متعدد، آپلود فایل و امکان افزودن اعتبارسنجی سفارشی، توسعه فرمهای امن و قابل نگهداری را ساده میکند. رعایت نکات امنیتی و سازماندهی مناسب کد تجربهٔ توسعه را بهطور چشمگیری بهبود میبخشد.
آیا این مطلب برای شما مفید بود ؟




