وبلاگ
Flask-WTF: فرمسازی قدرتمند در Flask
فهرست مطالب
“تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”
"تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"
"با شرکت در این دوره جامع و کاربردی، به راحتی مهارتهای برنامهنویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر میسازد تا به سرعت الگوریتمهای پیچیده را درک کرده و اپلیکیشنهای هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفهای و امکان دانلود و تماشای آنلاین."
ویژگیهای کلیدی:
بدون نیاز به تجربه قبلی برنامهنویسی
زیرنویس فارسی با ترجمه حرفهای
۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان
0 تا 100 عطرسازی + (30 فرمولاسیون اختصاصی حامی صنعت)
دوره فوق فشرده مکالمه زبان انگلیسی (ویژه بزرگسالان)
شمع سازی و عودسازی با محوریت رایحه درمانی
صابون سازی (دستساز و صنعتی)
صفر تا صد طراحی دارو
متخصص طب سنتی و گیاهان دارویی
متخصص کنترل کیفی شرکت دارویی
“`html
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”
"تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"
"با شرکت در این دوره جامع و کاربردی، به راحتی مهارتهای برنامهنویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر میسازد تا به سرعت الگوریتمهای پیچیده را درک کرده و اپلیکیشنهای هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفهای و امکان دانلود و تماشای آنلاین."
ویژگیهای کلیدی:
بدون نیاز به تجربه قبلی برنامهنویسی
زیرنویس فارسی با ترجمه حرفهای
۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان