ویژگی تصویر

معرفی کتابخانه Flask-WTF در پایتون

  /  پایتون   /  کتابخانه 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-WTFWTForms
ادغام با Flaskبله (ساده)خیر (کتابخانه پایه)
CSRFخودکار و سادهنیاز به راه‌اندازی دستی
پشتیبانی فایلبله (flask_wtf.file)بله (wtforms چه به صورت پایه)

نکات و توصیه‌های حرفه‌ای

  • فرم‌ها را در فایل‌های جداگانه نگه دارید تا کد تمیز و تست‌پذیر بماند.
  • از پیام‌های خطای کاربرپسند و قابل ترجمه استفاده کنید (i18n/Localization).
  • برای اعتبارسنجی‌های پیچیده، منطق را به لایهٔ سرویس یا مدل منتقل کنید تا فرم سبک بماند.
  • در پروژه‌های بزرگ از Blueprint و فرم‌های modular بهره ببرید.

جمع‌بندی

Flask-WTF ابزاری قدرتمند برای مدیریت فرم‌ها در اپلیکیشن‌های Flask است. با پشتیبانی از CSRF، ولیدیتور متعدد، آپلود فایل و امکان افزودن اعتبارسنجی سفارشی، توسعه فرم‌های امن و قابل نگهداری را ساده می‌کند. رعایت نکات امنیتی و سازمان‌دهی مناسب کد تجربهٔ توسعه را به‌طور چشمگیری بهبود می‌بخشد.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: