Flask-WTF: فرم‌سازی قدرتمند در Flask

فهرست مطالب

“`html





Flask-WTF: فرم‌سازی قدرتمند در Flask



Flask-WTF: فرم‌سازی قدرتمند در Flask

در دنیای توسعه وب، فرم‌ها نقش حیاتی در جمع‌آوری داده‌ها از کاربران و تعامل با آن‌ها ایفا می‌کنند. ساخت فرم‌های ایمن، قابل اعتماد و کاربرپسند می‌تواند چالش‌برانگیز باشد، به خصوص زمانی که با آسیب‌پذیری‌های امنیتی مانند حملات CSRF (Cross-Site Request Forgery) مواجه هستیم. Flask-WTF به عنوان یک افزونه قدرتمند برای فریم‌ورک Flask Python، این فرآیند را ساده‌سازی کرده و امکان ساخت فرم‌های پیشرفته را با کمترین تلاش فراهم می‌کند. این مقاله به بررسی عمیق Flask-WTF، از نصب و پیکربندی اولیه تا استفاده از ویژگی‌های پیشرفته آن می‌پردازد.

چرا Flask-WTF؟

Flask-WTF یک لایه انتزاعی بر روی کتابخانه WTForms ارائه می‌دهد که به طور خاص برای استفاده آسان‌تر در محیط Flask طراحی شده است. این افزونه مزایای متعددی را به همراه دارد:

  • یکپارچگی با Flask: Flask-WTF به طور یکپارچه با فریم‌ورک Flask ادغام می‌شود و استفاده از فرم‌ها را در برنامه‌های Flask بسیار آسان می‌کند.
  • امنیت: به طور خودکار از برنامه‌های شما در برابر حملات CSRF محافظت می‌کند. CSRF یک نوع حمله است که در آن مهاجم می‌تواند درخواست‌های مخرب را از طرف کاربر احراز هویت شده به سرور ارسال کند.
  • اعتبارسنجی آسان: Flask-WTF امکان تعریف قوانین اعتبارسنجی سفارشی را فراهم می‌کند و به شما کمک می‌کند تا داده‌های ورودی کاربر را به طور دقیق اعتبارسنجی کنید.
  • رندر خودکار فرم‌ها: Flask-WTF می‌تواند به طور خودکار فرم‌ها را در قالب‌های HTML رندر کند و در زمان و تلاش شما صرفه‌جویی کند.
  • ادغام با فیلدهای HTML5: از فیلدهای HTML5 مانند فیلدهای ایمیل، تاریخ و عدد پشتیبانی می‌کند.
  • قابل توسعه: Flask-WTF بسیار قابل توسعه است و می‌توانید فیلدها و اعتبارسنج‌های سفارشی خود را ایجاد کنید.

نصب و پیکربندی Flask-WTF

برای شروع کار با Flask-WTF، ابتدا باید آن را با استفاده از pip نصب کنید:

pip install Flask-WTF

پس از نصب، باید یک کلید مخفی (Secret Key) را در تنظیمات Flask خود پیکربندی کنید. این کلید برای تولید توکن‌های CSRF استفاده می‌شود. اطمینان حاصل کنید که کلید مخفی شما قوی و منحصر به فرد باشد و در جای امن نگهداری شود.

می‌توانید کلید مخفی را به روش‌های مختلفی تنظیم کنید، به عنوان مثال از طریق متغیر محیطی یا در فایل پیکربندی Flask.

تنظیم کلید مخفی از طریق متغیر محیطی:

import os
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY')

تنظیم کلید مخفی در فایل پیکربندی Flask:

app.config['SECRET_KEY'] = 'your_secret_key_here'

نکته امنیتی: هرگز کلید مخفی خود را در کد منبع خود (به خصوص در مخزن Git) قرار ندهید. از متغیرهای محیطی یا روش‌های امن دیگر برای نگهداری کلید مخفی استفاده کنید.

ایجاد یک فرم ساده با Flask-WTF

برای ایجاد یک فرم با Flask-WTF، باید یک کلاس ایجاد کنید که از کلاس FlaskForm ارث‌بری کند. در این کلاس، می‌توانید فیلدهای فرم و قوانین اعتبارسنجی مربوط به آن‌ها را تعریف کنید.

به عنوان مثال، یک فرم ساده برای ثبت‌نام کاربر را در نظر بگیرید که شامل فیلدهای نام کاربری، ایمیل و رمز عبور است:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email, EqualTo

class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
    submit = SubmitField('Sign Up')

در این مثال:

  • StringField، PasswordField و SubmitField انواع مختلف فیلدهای فرم هستند.
  • DataRequired، Email و EqualTo اعتبارسنج‌هایی هستند که برای اطمینان از معتبر بودن داده‌های ورودی کاربر استفاده می‌شوند.
  • DataRequired اطمینان حاصل می‌کند که فیلد خالی نباشد.
  • Email اطمینان حاصل می‌کند که مقدار وارد شده یک آدرس ایمیل معتبر باشد.
  • EqualTo اطمینان حاصل می‌کند که مقدار وارد شده در فیلد confirm_password با مقدار وارد شده در فیلد password برابر باشد.

استفاده از فرم در یک Route Flask

پس از تعریف فرم، باید آن را در یک Route Flask ایجاد کرده و به قالب HTML ارسال کنید. سپس می‌توانید داده‌های ارسالی توسط کاربر را پردازش کرده و نتیجه را به کاربر نمایش دهید.

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, Email, EqualTo

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key_here'  # Replace with a strong secret key

class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
    submit = SubmitField('Sign Up')

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        # Process the form data
        username = form.username.data
        email = form.email.data
        password = form.password.data

        # Here you would typically save the user to a database
        # For this example, we'll just print the data

        print(f"Username: {username}, Email: {email}, Password: {password}")

        # Redirect to a success page or login page
        return redirect(url_for('success'))  # Replace 'success' with your actual route name

    return render_template('register.html', form=form)

@app.route('/success')
def success():
    return "Registration successful!"

if __name__ == '__main__':
    app.run(debug=True)

در این مثال:

  • ما یک Route به نام /register تعریف کرده‌ایم که از هر دو متد GET و POST پشتیبانی می‌کند.
  • در متد GET، یک نمونه از فرم RegistrationForm ایجاد کرده و آن را به قالب HTML ارسال می‌کنیم.
  • در متد POST، متد validate_on_submit() را فراخوانی می‌کنیم. این متد بررسی می‌کند که آیا فرم ارسال شده است و آیا تمام قوانین اعتبارسنجی برآورده شده‌اند.
  • اگر فرم معتبر باشد، داده‌های فرم را پردازش کرده و کاربر را به یک صفحه موفقیت یا صفحه ورود هدایت می‌کنیم.
  • اگر فرم معتبر نباشد، قالب HTML را دوباره رندر می‌کنیم و پیام‌های خطا را به کاربر نمایش می‌دهیم.

نمایش فرم در قالب HTML

برای نمایش فرم در قالب HTML، می‌توانید از ویژگی‌های Jinja2، موتور قالب‌سازی Flask، استفاده کنید. Flask-WTF به طور خودکار فیلدهای فرم را با تگ‌های HTML مناسب رندر می‌کند. همچنین می‌توانید از ویژگی‌های اضافی برای سفارشی‌سازی ظاهر فرم استفاده کنید.

یک نمونه قالب HTML (register.html) به شکل زیر است:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Registration Form</title>
</head>
<body>
    <h1>Register</h1>
    <form method="POST" action="">
        {{ form.csrf_token }}
        <p>{{ form.username.label }} {{ form.username(size=20) }}</p>
        {% if form.username.errors %}
            <ul class="errors">
                {% for error in form.username.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}
        <p>{{ form.email.label }} {{ form.email(size=30) }}</p>
        {% if form.email.errors %}
            <ul class="errors">
                {% for error in form.email.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}
        <p>{{ form.password.label }} {{ form.password }}</p>
        {% if form.password.errors %}
            <ul class="errors">
                {% for error in form.password.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}
        <p>{{ form.confirm_password.label }} {{ form.confirm_password }}</p>
        {% if form.confirm_password.errors %}
            <ul class="errors">
                {% for error in form.confirm_password.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}
        <p>{{ form.submit }}</p>
    </form>
</body>
</html>

در این قالب:

  • {{ form.csrf_token }} توکن CSRF را رندر می‌کند که برای محافظت از فرم در برابر حملات CSRF ضروری است.
  • {{ form.username.label }} برچسب (Label) فیلد نام کاربری را رندر می‌کند.
  • {{ form.username(size=20) }} فیلد نام کاربری را با اندازه 20 کاراکتر رندر می‌کند.
  • {% if form.username.errors %} یک بلوک شرطی است که بررسی می‌کند آیا خطایی در فیلد نام کاربری وجود دارد یا خیر.
  • {% for error in form.username.errors %} یک حلقه است که بر روی تمام خطاهای موجود در فیلد نام کاربری تکرار می‌شود و هر خطا را در یک لیست نمایش می‌دهد.

سفارشی‌سازی فیلدها و اعتبارسنج‌ها

Flask-WTF امکان سفارشی‌سازی فیلدها و اعتبارسنج‌ها را فراهم می‌کند. می‌توانید فیلدهای سفارشی خود را ایجاد کنید و اعتبارسنج‌های موجود را تغییر دهید یا اعتبارسنج‌های جدیدی ایجاد کنید.

ایجاد فیلد سفارشی

برای ایجاد یک فیلد سفارشی، باید یک کلاس ایجاد کنید که از کلاس Field ارث‌بری کند. در این کلاس، می‌توانید منطق رندر و اعتبارسنجی فیلد را تعریف کنید.

به عنوان مثال، یک فیلد سفارشی برای شماره تلفن را در نظر بگیرید:

from wtforms import StringField, ValidationError
from wtforms.widgets import TextInput

class TelephoneField(StringField):
    widget = TextInput()

    def __init__(self, label=None, validators=None, **kwargs):
        super(TelephoneField, self).__init__(label, validators, **kwargs)

    def process_formdata(self, valuelist):
        if valuelist:
            self.data = valuelist[0].replace(' ', '').replace('-', '')

    def validate(self, form, field):
        if not field.data.isdigit():
            raise ValidationError('Please enter a valid telephone number.')

در این مثال:

  • ما یک کلاس به نام TelephoneField ایجاد کرده‌ایم که از کلاس StringField ارث‌بری می‌کند.
  • ما ویجت فیلد را به TextInput تنظیم کرده‌ایم.
  • متد process_formdata داده‌های ورودی کاربر را پردازش می‌کند و تمام فاصله‌ها و خط تیره‌ها را حذف می‌کند.
  • متد validate بررسی می‌کند که آیا داده‌های ورودی کاربر فقط شامل ارقام است یا خیر. اگر داده‌ها معتبر نباشند، یک استثنای ValidationError ایجاد می‌شود.

ایجاد اعتبارسنج سفارشی

برای ایجاد یک اعتبارسنج سفارشی، باید یک تابع ایجاد کنید که یک فرم و یک فیلد را به عنوان ورودی دریافت کند و اگر فیلد معتبر نباشد، یک استثنای ValidationError ایجاد کند.

به عنوان مثال، یک اعتبارسنج سفارشی برای بررسی اینکه آیا یک نام کاربری از قبل در پایگاه داده وجود دارد یا خیر را در نظر بگیرید:

from wtforms import ValidationError

def username_exists(form, field):
    # Query the database to check if the username already exists
    user = User.query.filter_by(username=field.data).first()
    if user:
        raise ValidationError('This username is already taken.')

برای استفاده از این اعتبارسنج در فرم خود، می‌توانید آن را به لیست اعتبارسنج‌های فیلد مورد نظر اضافه کنید:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email, EqualTo

class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired(), username_exists])
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
    submit = SubmitField('Sign Up')

استفاده از Captcha

Captcha یک تکنیک برای جلوگیری از ارسال فرم توسط ربات‌ها است. Flask-WTF از Captcha پشتیبانی می‌کند و می‌توانید به راحتی یک Captcha را به فرم‌های خود اضافه کنید.

برای استفاده از Captcha، ابتدا باید یک کتابخانه Captcha را نصب کنید. به عنوان مثال، می‌توانید از کتابخانه recaptcha استفاده کنید:

pip install recaptcha

سپس باید یک کلید سایت و یک کلید مخفی از Google reCAPTCHA دریافت کنید. می‌توانید این کلیدها را از وب‌سایت Google reCAPTCHA دریافت کنید.

پس از دریافت کلیدها، باید آن‌ها را در تنظیمات Flask خود پیکربندی کنید:

app.config['RECAPTCHA_PUBLIC_KEY'] = 'your_recaptcha_public_key'
app.config['RECAPTCHA_PRIVATE_KEY'] = 'your_recaptcha_private_key'

سپس می‌توانید یک فیلد Captcha را به فرم خود اضافه کنید:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email, EqualTo
from flask_recaptcha import RecaptchaField

class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
    recaptcha = RecaptchaField()
    submit = SubmitField('Sign Up')

در نهایت، باید فیلد Captcha را در قالب HTML خود رندر کنید:

<form method="POST" action="">
    {{ form.csrf_token }}
    <p>{{ form.username.label }} {{ form.username(size=20) }}</p>
    <p>{{ form.email.label }} {{ form.email(size=30) }}</p>
    <p>{{ form.password.label }} {{ form.password }}</p>
    <p>{{ form.confirm_password.label }} {{ form.confirm_password }}</p>
    <p>{{ form.recaptcha }}</p>
    <p>{{ form.submit }}</p>
</form>

حفاظت از CSRF در Flask-WTF

همانطور که قبلاً ذکر شد، Flask-WTF به طور خودکار از برنامه‌های شما در برابر حملات CSRF محافظت می‌کند. CSRF یک نوع حمله است که در آن مهاجم می‌تواند درخواست‌های مخرب را از طرف کاربر احراز هویت شده به سرور ارسال کند.

Flask-WTF با استفاده از توکن‌های CSRF از حملات CSRF محافظت می‌کند. توکن CSRF یک رشته تصادفی است که در هر درخواست فرم ایجاد می‌شود و در قالب HTML و در جلسه کاربر ذخیره می‌شود. هنگامی که کاربر فرم را ارسال می‌کند، Flask-WTF توکن CSRF ارسالی را با توکن CSRF ذخیره شده در جلسه کاربر مقایسه می‌کند. اگر توکن‌ها با هم مطابقت نداشته باشند، درخواست رد می‌شود.

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

همچنین، باید اطمینان حاصل کنید که توکن CSRF را در تمام فرم‌های HTML خود رندر می‌کنید. می‌توانید این کار را با استفاده از ویژگی csrf_token فرم انجام دهید:

<form method="POST" action="">
    {{ form.csrf_token }}
    <p>{{ form.username.label }} {{ form.username(size=20) }}</p>
    <p>{{ form.email.label }} {{ form.email(size=30) }}</p>
    <p>{{ form.password.label }} {{ form.password }}</p>
    <p>{{ form.confirm_password.label }} {{ form.confirm_password }}</p>
    <p>{{ form.submit }}</p>
</form>

با انجام این مراحل، می‌توانید از برنامه‌های Flask خود در برابر حملات CSRF محافظت کنید.

نکات پیشرفته در Flask-WTF

علاوه بر ویژگی‌های اساسی که در بالا توضیح داده شد، Flask-WTF امکانات پیشرفته‌تری را نیز برای ساخت فرم‌های پیچیده ارائه می‌دهد. برخی از این امکانات عبارتند از:

  • Form Inheritance: می‌توانید فرم‌ها را از یکدیگر ارث ببرید تا کد خود را سازماندهی کنید و از تکرار کد جلوگیری کنید.
  • FieldList: می‌توانید از FieldList برای ایجاد لیست‌های پویا از فیلدها استفاده کنید.
  • Inline Form Validation: می‌توانید از اعتبارسنجی فرم درون‌خطی (Inline) برای نمایش پیام‌های خطا در زمان واقعی به کاربر استفاده کنید.
  • File Uploads: می‌توانید از Flask-WTF برای مدیریت آپلود فایل‌ها استفاده کنید.

نتیجه‌گیری

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



“`

“تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”

قیمت اصلی 2.290.000 ریال بود.قیمت فعلی 1.590.000 ریال است.

"تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"

"با شرکت در این دوره جامع و کاربردی، به راحتی مهارت‌های برنامه‌نویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر می‌سازد تا به سرعت الگوریتم‌های پیچیده را درک کرده و اپلیکیشن‌های هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفه‌ای و امکان دانلود و تماشای آنلاین."

ویژگی‌های کلیدی:

بدون نیاز به تجربه قبلی برنامه‌نویسی

زیرنویس فارسی با ترجمه حرفه‌ای

۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان