اعتبارسنجی دادههای فرم در Flask-WTF
اعتبارسنجی دادههای فرم یکی از مهمترین جنبههای امنیت و کارایی یک وب اپلیکیشن است. Flask-WTF ابزاری قدرتمند برای تعریف و اعتبارسنجی فرمهای وب در فلاسک فراهم میکند.
چرا اعتبارسنجی دادههای فرم مهم است؟
- امنیت: جلوگیری از تزریق کدهای مخرب، حملات XSS و سایر تهدیدات امنیتی.
- کارایی: اطمینان از اینکه دادههای وارد شده توسط کاربر صحیح و معتبر هستند و از بروز خطاهای غیرمنتظره جلوگیری میکند.
- تجربه کاربری بهتر: نمایش پیامهای خطای مناسب به کاربر در صورت وارد کردن دادههای نامعتبر، باعث بهبود تجربه کاربری میشود.
اعتبارسنجیهای رایج در Flask-WTF
- DataRequired
یک اعتبارسنج در Flask-WTF است که اطمینان حاصل میکند که فیلد مورد نظر الزامی است و نمیتوان آن را خالی گذاشت. این اعتبارسنج برای اطمینان از اینکه کاربر تمام اطلاعات ضروری را وارد کرده است، بسیار مفید است.
نحوه استفاده
Pythonfrom flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import DataRequired class MyForm(FlaskForm): name = StringField('نام', validators=[DataRequired()])
در این مثال، فیلد
name
به عنوان الزامی مشخص شده است. اگر کاربر این فیلد را خالی بگذارد، یک پیام خطا نمایش داده میشود.پیامهای خطا
به طور پیشفرض، Flask-WTF پیامهای خطای عمومی برای اعتبارسنجها ارائه میدهد. شما میتوانید پیامهای سفارشی را با استفاده از آرگومان
message
به اعتبارسنج اضافه کنید.Pythonfrom flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import DataRequired class MyForm(FlaskForm): name = StringField('نام', validators=[DataRequired(message='نام الزامی است.')])
ترکیب با سایر اعتبارسنجها
میتوانید چندین اعتبارسنج را برای یک فیلد ترکیب کنید. به عنوان مثال، میتوانید هم
DataRequired
و همLength
را برای یک فیلد استفاده کنید تا اطمینان حاصل کنید که فیلد الزامی است و طول آن در محدوده مشخصی قرار دارد.Pythonfrom flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import DataRequired, Length class MyForm(FlaskForm): name = StringField('نام', validators=[DataRequired(), Length(min=2, max=30)])
نکات مهم
- پیامهای خطا: برای پیامهای خطای سفارشی، از آرگومان
message
استفاده کنید. - ترکیب با سایر اعتبارسنجها: میتوانید
DataRequired
را با سایر اعتبارسنجها ترکیب کنید تا اعتبارسنجیهای پیچیدهتری ایجاد کنید. - استفاده در فرمهای مختلف: میتوانید
DataRequired
را در هر فرمی که نیاز دارید استفاده کنید.
با استفاده از
DataRequired
، میتوانید اطمینان حاصل کنید که فیلدهای مهم در فرمهای خود الزامی هستند و کاربر باید اطلاعات مورد نیاز را وارد کند. - پیامهای خطا: برای پیامهای خطای سفارشی، از آرگومان
- اعتبارسنج Length در Flask-WTF
Length یک اعتبارسنج در Flask-WTF است که طول رشته وارد شده در یک فیلد را بررسی میکند. این اعتبارسنج میتواند برای اطمینان از اینکه ورودیهای کاربر در محدوده طول مشخصی قرار دارند، استفاده شود.
نحوه استفاده
Pythonfrom flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import Length class MyForm(FlaskForm): username = StringField('نام کاربری', validators=[Length(min=6, max=20)])
در این مثال، فیلد
username
باید حداقل 6 و حداکثر 20 کاراکتر داشته باشد.ویژگیها
- min: حداقل طول رشته.
- max: حداکثر طول رشته.
مثالهای بیشتر
- حداقل طول 8 کاراکتر: Python
from flask_wtf import FlaskForm from wtforms import PasswordField from wtforms.validators import Length class MyForm(FlaskForm): password = PasswordField('رمز عبور', validators=[Length(min=8)])
- حداکثر طول 100 کاراکتر: Python
from flask_wtf import FlaskForm from wtforms import TextAreaField from wtforms.validators import Length class MyForm(FlaskForm): comment = TextAreaField('نظر', validators=[Length(max=100)])
- حداقل و حداکثر طول مشخص:
from flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import Length
class MyForm(FlaskForm): username = StringField(‘نام کاربری’, validators=[Length(min=6, max=20)])
### نکات مهم * **پیامهای خطا:** میتوانید پیامهای خطای سفارشی را برای اعتبارسنج `Length` تعریف کنید. * **ترکیب با سایر اعتبارسنجها:** میتوانید `Length` را با سایر اعتبارسنجها مانند `DataRequired` ترکیب کنید. * **اعتبارسنجی سمت کلاینت:** میتوانید از JavaScript یا HTML5 برای اعتبارسنجی اولیه طول رشته در سمت کلاینت استفاده کنید، اما همیشه اعتبارسنجی سمت سرور نیز انجام دهید. **با استفاده از اعتبارسنج `Length`، میتوانید اطمینان حاصل کنید که دادههای ورودی کاربر در محدوده طول مشخصی قرار دارند و از خطاهای ناشی از ورودیهای نامعتبر جلوگیری کنید.** **آیا سوالی در مورد اعتبارسنج `Length` دارید؟**
- اعتبارسنج Email در Flask-WTF
Email یک اعتبارسنج از پیش تعریف شده در Flask-WTF است که بررسی میکند آیا آدرس ایمیل وارد شده معتبر است یا خیر. این اعتبارسنج از یک الگوی عبارات منظم برای بررسی فرمت آدرس ایمیل استفاده میکند.
نحوه استفاده
Pythonfrom flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import Email class MyForm(FlaskForm): email = StringField('ایمیل', validators=[Email()])
در این مثال، فیلد
email
به عنوان الزامی مشخص شده است و اعتبارسنجEmail
برای اطمینان از صحت آدرس ایمیل اعمال شده است.الگوی عبارات منظم
اعتبارسنج
Email
از الگوی عبارات منظم زیر برای بررسی آدرس ایمیل استفاده میکند:Code snippet^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$
این الگو بررسی میکند که آدرس ایمیل شامل بخش قبل از علامت
@
، علامت@
و بخش بعد از علامت@
باشد. بخش قبل از@
میتواند شامل حروف، اعداد، نقاط، خط تیره و زیرخط باشد. بخش بعد از@
باید شامل حروف، اعداد، نقاط و خط تیره باشد و حداقل یک نقطه داشته باشد.پیامهای خطا
اگر آدرس ایمیل وارد شده معتبر نباشد، اعتبارسنج
Email
یک پیام خطا نمایش میدهد. شما میتوانید پیامهای خطای سفارشی را با استفاده از آرگومانmessage
به اعتبارسنج اضافه کنید.Pythonfrom flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import Email class MyForm(FlaskForm): email = StringField('ایمیل', validators=[Email(message='لطفا یک آدرس ایمیل معتبر وارد کنید.')])
نکات مهم
- اعتبارسنجی سمت سرور: همیشه اعتبارسنجی ایمیل را در سمت سرور انجام دهید، حتی اگر در سمت کلاینت نیز اعتبارسنجی انجام شود.
- ترکیب با سایر اعتبارسنجها: میتوانید
Email
را با سایر اعتبارسنجها مانندDataRequired
وLength
ترکیب کنید. - الگوی عبارات منظم: اگر نیاز به تنظیم الگوی عبارات منظم برای آدرسهای ایمیل خاص دارید، میتوانید آن را سفارشی کنید.
با استفاده از اعتبارسنج
Email
در Flask-WTF، میتوانید اطمینان حاصل کنید که آدرسهای ایمیل وارد شده توسط کاربران معتبر هستند. - اعتبارسنج EqualTo در Flask-WTF
EqualTo یک اعتبارسنج در Flask-WTF است که بررسی میکند آیا مقدار دو فیلد برابر است یا خیر. این اعتبارسنج معمولاً برای تأیید رمز عبور استفاده میشود، اما میتوان آن را برای مقایسه هر دو فیلد دیگر نیز به کار برد.
نحوه استفاده
Pythonfrom flask_wtf import FlaskForm from wtforms import PasswordField from wtforms.validators import EqualTo class MyForm(FlaskForm): password = PasswordField('رمز عبور') confirm_password = PasswordField('تکرار رمز عبور', validators=[EqualTo('password', message='رمزهای عبور باید مطابقت داشته باشند.')])
در این مثال، فیلد
confirm_password
باید با مقدار فیلدpassword
برابر باشد. اگر این دو فیلد متفاوت باشند، یک پیام خطا نمایش داده میشود.ویژگیها
- other_field: نام فیلدی که باید با آن مقایسه شود.
- message: پیام خطایی که در صورت عدم تطابق نمایش داده میشود.
مثالهای بیشتر
- مقایسه دو فیلد دلخواه: Python
from flask_wtf import FlaskForm from wtforms import StringField class MyForm(FlaskForm): first_name = StringField('نام') last_name = StringField('نام خانوادگی', validators=[EqualTo('first_name', message='نام و نام خانوادگی باید یکسان باشند.')])
- مقایسه فیلد با یک مقدار ثابت: Python
from flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import EqualTo class MyForm(FlaskForm): terms_and_conditions = StringField('شرایط و قوانین', validators=[EqualTo('agree', message='لطفا شرایط و قوانین را قبول کنید.')])
نکات مهم
- پیامهای خطا: برای پیامهای خطای سفارشی، از آرگومان
message
استفاده کنید. - ترکیب با سایر اعتبارسنجها: میتوانید
EqualTo
را با سایر اعتبارسنجها ترکیب کنید. - استفاده در فرمهای پیچیدهتر:
EqualTo
میتواند در فرمهای پیچیدهتر برای مقایسه مقادیر مختلف استفاده شود.
با استفاده از اعتبارسنج
EqualTo
، میتوانید اطمینان حاصل کنید که دو فیلد در فرم شما مقادیر یکسانی دارند. - اعتبارسنج Regexp در Flask-WTF
Regexp یک اعتبارسنج قدرتمند در Flask-WTF است که به شما امکان میدهد الگوهای پیچیدهتری را برای اعتبارسنجی دادههای ورودی تعریف کنید. این اعتبارسنج از عبارات منظم (Regular Expressions) استفاده میکند که یک زبان قدرتمند برای توصیف الگوهای متنی هستند.
نحوه استفاده
Pythonfrom flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import Regexp class MyForm(FlaskForm): email = StringField('ایمیل', validators=[ Regexp(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', message='آدرس ایمیل وارد شده معتبر نیست.') ])
در این مثال، اعتبارسنج
Regexp
با الگوی مشخص شده، بررسی میکند که آدرس ایمیل وارد شده معتبر باشد.الگوهای عبارات منظم
- .: مطابقت با هر کاراکتر به جز خط جدید (\n).
- ^: مطابقت با شروع رشته.
- $:: مطابقت با پایان رشته.
- *: صفر یا چند تکرار از الگوی قبلی.
- +: یک یا چند تکرار از الگوی قبلی.
- ?: صفر یا یک تکرار از الگوی قبلی.
- [abc]: مطابقت با یکی از کاراکترهای a، b یا c.
- [^abc]: مطابقت با هر کاراکتر به جز a، b یا c.
- \d: مطابقت با یک رقم عددی.
- \w: مطابقت با یک حرف یا رقم یا زیرخط.
- \s: مطابقت با یک کاراکتر فضای سفید.
مثالهای بیشتر
- اعتبارسنجی شماره تلفن همراه: Python
from wtforms.validators import Regexp # برای شماره تلفنهای ایرانی با فرمت 09123456789 Regexp(r'^09[0-9]{9}$')
- اعتبارسنجی کد پستی: Python
from wtforms.validators import Regexp # برای کد پستی 5 رقمی Regexp(r'^\d{5}$')
- اعتبارسنجی نام کاربری: Python
from wtforms.validators import Regexp # فقط حروف و اعداد Regexp(r'^[a-zA-Z0-9]+$')
نکات مهم
- پیچیدگی الگو: هرچه الگوی شما پیچیدهتر باشد، درک و نگهداری آن سختتر میشود.
- عملکرد: عبارات منظم پیچیده میتوانند بر عملکرد برنامه تأثیر بگذارند.
- استانداردها: برای اعتبارسنجی آدرسهای ایمیل، شماره تلفن و سایر دادههای استاندارد، از الگوهای از پیش تعریف شده استفاده کنید.
با استفاده از اعتبارسنج
Regexp
، میتوانید الگوهای پیچیدهتری را برای اعتبارسنجی دادههای ورودی تعریف کنید و اطمینان حاصل کنید که دادهها با فرمت مورد نظر مطابقت دارند. - اعتبارسنج NumberRange در Flask-WTF
NumberRange یک اعتبارسنج در Flask-WTF است که بررسی میکند آیا مقدار عددی وارد شده در یک بازه مشخص قرار دارد یا خیر. این اعتبارسنج برای محدود کردن مقادیر عددی ورودی بسیار مفید است.
نحوه استفاده
Pythonfrom flask_wtf import FlaskForm from wtforms import IntegerField from wtforms.validators import NumberRange class MyForm(FlaskForm): age = IntegerField('سن', validators=[NumberRange(min=18, max=120)])
در این مثال، فیلد
age
به عنوان یک عدد صحیح تعریف شده است و اعتبارسنجNumberRange
اطمینان حاصل میکند که مقدار وارد شده بین 18 تا 120 باشد.ویژگیها
- min: حداقل مقدار مجاز.
- max: حداکثر مقدار مجاز.
مثالهای بیشتر
- محدوده سنی: Python
from flask_wtf import FlaskForm from wtforms import IntegerField from wtforms.validators import NumberRange class MyForm(FlaskForm): age = IntegerField('سن', validators=[NumberRange(min=0, max=120)])
- محدوده قیمت: Python
from flask_wtf import FlaskForm from wtforms import DecimalField from wtforms.validators import NumberRange class MyForm(FlaskForm): price = DecimalField('قیمت', validators=[NumberRange(min=0)])
- محدوده درصد: Python
from flask_wtf import FlaskForm from wtforms import DecimalField from wtforms.validators import NumberRange class MyForm(FlaskForm): discount = DecimalField('تخفیف', validators=[NumberRange(min=0, max=100)])
نکات مهم
- نوع داده: اطمینان حاصل کنید که فیلدی که از آن استفاده میکنید، نوع داده مناسب برای مقادیر عددی است (مثلاً
IntegerField
یاDecimalField
). - پیامهای خطا: میتوانید پیامهای خطای سفارشی را برای اعتبارسنج
NumberRange
تعریف کنید. - ترکیب با سایر اعتبارسنجها: میتوانید
NumberRange
را با سایر اعتبارسنجها مانندDataRequired
ترکیب کنید.
با استفاده از اعتبارسنج
NumberRange
، میتوانید اطمینان حاصل کنید که مقادیر عددی وارد شده توسط کاربران در محدوده مشخصی قرار دارند و از خطاهای ناشی از مقادیر نامعتبر جلوگیری کنید. - اعتبارسنج Optional در Flask-WTF
Optional یک اعتبارسنج در Flask-WTF است که یک فیلد را اختیاری میکند. این بدان معنی است که کاربر مجبور نیست مقداری برای این فیلد وارد کند. اگر کاربر فیلد را خالی بگذارد، هیچ خطایی نمایش داده نمیشود.
نحوه استفاده
Pythonfrom flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import Optional class MyForm(FlaskForm): address = StringField('آدرس', validators=[Optional()])
در این مثال، فیلد
address
اختیاری شده است. کاربر میتواند این فیلد را پر کند یا خالی بگذارد.ویژگیها
- message: پیام خطایی که در صورت عدم رعایت الزامات اعتبارسنجی نمایش داده میشود.
مثالهای بیشتر
- فیلد اختیاری با پیام خطا: Python
from flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import Optional class MyForm(FlaskForm): email = StringField('ایمیل', validators=[Optional(message='ایمیل اختیاری است.')])
- ترکیب با سایر اعتبارسنجها: Python
from flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import Optional, Length class MyForm(FlaskForm): comment = StringField('نظر', validators=[Optional(), Length(min=10, max=200)])
نکات مهم
- پیامهای خطا: اگر میخواهید پیام خطایی را برای فیلد اختیاری در صورت خالی بودن نمایش دهید، میتوانید از آرگومان
message
استفاده کنید. - ترکیب با سایر اعتبارسنجها: میتوانید
Optional
را با سایر اعتبارسنجها ترکیب کنید.
با استفاده از اعتبارسنج
Optional
، میتوانید فیلدهای فرم خود را اختیاری کنید و به کاربران اجازه دهید تا فقط اطلاعات ضروری را وارد کنند. - اعتبارسنج FileRequired در Flask-WTF
FileRequired یک اعتبارسنج مخصوص فیلدهای آپلود فایل در Flask-WTF است. این اعتبارسنج اطمینان حاصل میکند که کاربر یک فایل را انتخاب کرده است و آن را خالی نگذاشته است.
نحوه استفاده
Pythonfrom flask_wtf import FlaskForm from wtforms import FileField from wtforms.validators import FileRequired class UploadForm(FlaskForm): file = FileField('فایل', validators=[FileRequired()])
در این مثال، فیلد
file
به عنوان الزامی مشخص شده است و کاربر باید یک فایل را انتخاب کند.پیامهای خطا
اگر کاربر فایلی انتخاب نکند، اعتبارسنج
FileRequired
یک پیام خطا نمایش میدهد. شما میتوانید پیام خطای سفارشی را با استفاده از آرگومانmessage
به اعتبارسنج اضافه کنید.Pythonfrom flask_wtf import FlaskForm from wtforms import FileField from wtforms.validators import FileRequired class UploadForm(FlaskForm): file = FileField('فایل', validators=[FileRequired(message='لطفا یک فایل انتخاب کنید.')])
ترکیب با سایر اعتبارسنجها
میتوانید
FileRequired
را با سایر اعتبارسنجهای مخصوص فایل مانندFileAllowed
وFileSize
ترکیب کنید تا اعتبارسنجیهای پیچیدهتری ایجاد کنید.با استفاده از اعتبارسنج
FileRequired
، میتوانید اطمینان حاصل کنید که کاربر یک فایل را انتخاب کرده است و از خطاهای ناشی از عدم انتخاب فایل جلوگیری کنید. - اعتبارسنج FileAllowed در Flask-WTF
FileAllowed یک اعتبارسنج مخصوص فیلدهای آپلود فایل در Flask-WTF است که بررسی میکند آیا پسوند فایل انتخاب شده در لیست پسوندهای مجاز قرار دارد یا خیر. این اعتبارسنج برای محدود کردن انواع فایلهای قابل آپلود بسیار مفید است.
نحوه استفاده
Pythonfrom flask_wtf import FlaskForm from wtforms import FileField from wtforms.validators import FileRequired, FileAllowed class UploadForm(FlaskForm): file = FileField('فایل', validators=[FileRequired(), FileAllowed(['pdf', 'doc', 'docx'])])
در این مثال، فیلد
file
به عنوان الزامی مشخص شده است و اعتبارسنجFileAllowed
بررسی میکند که پسوند فایل انتخاب شده یکی ازpdf
,doc
یاdocx
باشد.ویژگیها
- allowed_extensions: لیستی از پسوندهای مجاز.
پیامهای خطا
اگر پسوند فایل انتخاب شده در لیست مجاز نباشد، اعتبارسنج
FileAllowed
یک پیام خطا نمایش میدهد. شما میتوانید پیام خطای سفارشی را با استفاده از آرگومانmessage
به اعتبارسنج اضافه کنید.Pythonfrom flask_wtf import FlaskForm from wtforms import FileField from wtforms.validators import FileRequired, FileAllowed class UploadForm(FlaskForm): file = FileField('فایل', validators=[FileRequired(), FileAllowed(['pdf', 'doc', 'docx'], message='فقط فایلهای PDF، DOC و DOCX مجاز هستند.')])
ترکیب با سایر اعتبارسنجها
میتوانید
FileAllowed
را با سایر اعتبارسنجهای مخصوص فایل مانندFileRequired
وFileSize
ترکیب کنید تا اعتبارسنجیهای پیچیدهتری ایجاد کنید.با استفاده از اعتبارسنج
FileAllowed
، میتوانید محدودیتهایی برای انواع فایلهای قابل آپلود در برنامه خود ایجاد کنید و از آپلود فایلهای نامعتبر جلوگیری کنید. - اعتبارسنج FileSize در Flask-WTF
FileSize یک اعتبارسنج مخصوص فیلدهای آپلود فایل در Flask-WTF است که بررسی میکند آیا اندازه فایل انتخاب شده از حد مجاز تجاوز میکند یا خیر. این اعتبارسنج برای محدود کردن اندازه فایلهای قابل آپلود بسیار مفید است.
نحوه استفاده
Pythonfrom flask_wtf import FlaskForm from wtforms import FileField from wtforms.validators import FileRequired, FileAllowed, FileSize class UploadForm(FlaskForm): file = FileField('فایل', validators=[FileRequired(), FileAllowed(['pdf', 'doc', 'docx']), FileSize(max_size=1024 * 1024)])
در این مثال، فیلد
file
به عنوان الزامی مشخص شده است و اعتبارسنجFileSize
بررسی میکند که اندازه فایل انتخاب شده از 1 مگابایت (1024 * 1024 بایت) بیشتر نباشد.ویژگیها
- max_size: حداکثر اندازه مجاز فایل (به بایت).
- min_size: حداقل اندازه مجاز فایل (به بایت).
پیامهای خطا
اگر اندازه فایل انتخاب شده از حد مجاز تجاوز کند، اعتبارسنج
FileSize
یک پیام خطا نمایش میدهد. شما میتوانید پیام خطای سفارشی را با استفاده از آرگومانmessage
به اعتبارسنج اضافه کنید.Pythonfrom flask_wtf import FlaskForm from wtforms import FileField from wtforms.validators import FileRequired, FileAllowed, FileSize class UploadForm(FlaskForm): file = FileField('فایل', validators=[FileRequired(), FileAllowed(['pdf', 'doc', 'docx']), FileSize(max_size=1024 * 1024, message='اندازه فایل نباید از 1 مگابایت بیشتر باشد.')])
ترکیب با سایر اعتبارسنجها
میتوانید
FileSize
را با سایر اعتبارسنجهای مخصوص فایل مانندFileRequired
وFileAllowed
ترکیب کنید تا اعتبارسنجیهای پیچیدهتری ایجاد کنید.با استفاده از اعتبارسنج
FileSize
، میتوانید محدودیتهایی برای اندازه فایلهای قابل آپلود در برنامه خود ایجاد کنید و از آپلود فایلهای بسیار بزرگ جلوگیری کنید.
مثال عملی
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Email, Length
class RegistrationForm(FlaskForm):
username = StringField('نام کاربری', validators=[DataRequired(), Length(min=6, max=20)])
email = StringField('ایمیل', validators=[DataRequired(), Email()])
password = PasswordField('رمز عبور', validators=[DataRequired(), Length(min=8)])
confirm_password = PasswordField('تکرار رمز عبور', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('ثبت نام')
در این مثال:
- username: حداقل 6 و حداکثر 20 کاراکتر باشد.
- email: یک آدرس ایمیل معتبر باشد.
- password: حداقل 8 کاراکتر باشد.
- confirm_password: با password برابر باشد.
نمایش پیامهای خطا
{% for error in form.username.errors %}
<span style="color: red;">{{ error }}</span>
{% endfor %}
مزایای استفاده از Flask-WTF
- سادگی استفاده: تعریف و اعتبارسنجی فرمها بسیار ساده است.
- انعطافپذیری: با استفاده از اعتبارسنجهای مختلف و عبارات منظم، میتوان اعتبارسنجیهای پیچیده ایجاد کرد.
- یکپارچگی با فلاسک: به خوبی با فلاسک ادغام میشود.
- امنیت: به طور خودکار بسیاری از تهدیدات امنیتی را کاهش میدهد.
نکات مهم
- پیامهای خطای سفارشی: برای هر اعتبارسنج میتوان پیام خطای سفارشی تعریف کرد.
- اعتبارسنجی سمت سرور: همیشه اعتبارسنجی را در سمت سرور انجام دهید، حتی اگر در سمت کلاینت نیز انجام شود.
- ترکیب اعتبارسنجها: میتوان چندین اعتبارسنج را برای یک فیلد تعریف کرد.
- اعتبارسنجی فایلها: برای اعتبارسنجی فایلهای آپلود شده از اعتبارسنجهای
FileRequired
,FileAllowed
وFileSize
استفاده کنید.
با استفاده از Flask-WTF میتوانید به راحتی فرمهای وب ایمن و کاربرپسندی ایجاد کنید.
اعتبارسنجیهای سفارشی در Flask-WTF
در Flask-WTF، علاوه بر اعتبارسنجیهای از پیش تعریف شدهای که برای فیلدهای مختلف وجود دارد، امکان ایجاد اعتبارسنجیهای سفارشی نیز وجود دارد. این به شما اجازه میدهد تا قوانین اعتبارسنجی خاص خود را برای اطمینان از صحت و یکپارچگی دادههای ورودی ایجاد کنید.
ایجاد یک اعتبارسنجی سفارشی
برای ایجاد یک اعتبارسنجی سفارشی، باید یک کلاس از کلاس Validator
ارثبری کنید و متد validate
را پیادهسازی کنید. این متد یک مقدار ورودی را به عنوان آرگومان میگیرد و باید یک مقدار بولی برگرداند که نشان میدهد آیا مقدار ورودی معتبر است یا خیر. همچنین، در صورت نامعتبر بودن مقدار، میتوانید یک پیام خطا را به عنوان استثناء ValidationError
مطرح کنید.
from wtforms import ValidationError
def my_custom_validator(form, field):
if field.data.lower() != 'correct_value':
raise ValidationError('مقدار وارد شده صحیح نیست.')
استفاده از اعتبارسنجی سفارشی در یک فیلد
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired
class MyForm(FlaskForm):
username = StringField('نام کاربری', validators=[DataRequired(), my_custom_validator])
در این مثال، اعتبارسنجی سفارشی my_custom_validator
به عنوان یک اعتبارسنج اضافی برای فیلد username
اضافه شده است.
مثال کامل
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
def my_custom_validator(form, field):
if field.data.lower() != 'admin':
raise ValidationError('نام کاربری باید admin باشد.')
class MyForm(FlaskForm):
username = StringField('نام کاربری', validators=[DataRequired(), my_custom_validator])
submit = SubmitField('ارسال')
@app.route('/', methods=['GET', 'POST'])
def index():
form = MyForm()
if form.validate_on_submit():
return 'نام کاربری معتبر است.'
return render_template('index.html', form=form)
اعتبارسنجیهای سفارشی پیچیدهتر
شما میتوانید اعتبارسنجیهای سفارشی پیچیدهتری را ایجاد کنید که به چندین فیلد دسترسی داشته باشند یا از پایگاه داده یا منابع خارجی استفاده کنند.
مثال: بررسی وجود یک کاربر در پایگاه داده
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired
class MyForm(FlaskForm):
username = StringField('نام کاربری', validators=[DataRequired()])
def validate_username(self):
user = User.query.filter_by(username=self.username.data).first()
if user:
raise ValidationError('این نام کاربری قبلاً استفاده شده است.')
در این مثال، متد validate_username
یک اعتبارسنجی سفارشی برای فیلد username
است که بررسی میکند آیا نام کاربری وارد شده قبلاً در پایگاه داده وجود دارد یا خیر.
نکات مهم
- پیامهای خطا: پیامهای خطای سفارشی را واضح و آموزنده بنویسید تا کاربر بتواند به راحتی مشکل را تشخیص دهد.
- کارایی: اگر اعتبارسنجیهای شما به پایگاه داده یا منابع خارجی دسترسی دارند، سعی کنید آنها را بهینه کنید تا عملکرد برنامه را کاهش ندهد.
- تست: اعتبارسنجیهای سفارشی خود را به خوبی تست کنید تا از صحت عملکرد آنها اطمینان حاصل کنید.
مزایای استفاده از اعتبارسنجیهای سفارشی:
- انعطافپذیری: شما میتوانید هر نوع اعتبارسنجی که نیاز دارید را ایجاد کنید.
- کنترل کامل: شما بر روی منطق اعتبارسنجی کاملاً کنترل دارید.
- شخصیسازی: میتوانید پیامهای خطای سفارشی را برای کاربران خود ایجاد کنید.
جمعبندی
اعتبارسنجیهای سفارشی به شما امکان میدهند تا فرمهای خود را با قوانین خاص خود ایمنتر و قابل اعتمادتر کنید. با استفاده از این ویژگی، میتوانید اطمینان حاصل کنید که دادههای ورودی کاربر معتبر و مطابق با نیازهای برنامه شما هستند.
اعتبارسنجیهای از پیش تعریف شده در Flask-WTF
Flask-WTF مجموعهای از اعتبارسنجیهای از پیش تعریف شده را ارائه میدهد که به شما امکان میدهند انواع مختلف دادههای ورودی را به طور موثر اعتبارسنجی کنید. این اعتبارسنجیها به شما کمک میکنند تا اطمینان حاصل کنید که دادههای وارد شده توسط کاربر معتبر و مطابق با فرمت مورد انتظار هستند.
انواع اعتبارسنجیهای از پیش تعریف شده:
- DataRequired: این اعتبارسنج اطمینان حاصل میکند که فیلد الزامی است و نمیتوان آن را خالی گذاشت.
- Length: این اعتبارسنج طول رشته را بررسی میکند و اطمینان حاصل میکند که طول رشته بین حداقل و حداکثر طول مشخص شده باشد.
- Email: این اعتبارسنج بررسی میکند که مقدار وارد شده یک آدرس ایمیل معتبر باشد.
- EqualTo: این اعتبارسنج بررسی میکند که مقدار یک فیلد برابر با مقدار فیلد دیگری باشد (برای مثال، برای تأیید کلمه عبور).
- Regexp: این اعتبارسنج با استفاده از عبارات منظم، یک الگوی مشخص را در دادههای ورودی بررسی میکند.
- NumberRange: این اعتبارسنج بررسی میکند که مقدار عددی وارد شده در یک بازه مشخص قرار داشته باشد.
- Optional: این اعتبارسنج باعث میشود که یک فیلد اختیاری شود و در صورت خالی بودن، خطایی ایجاد نکند.
مثال استفاده از اعتبارسنجیها
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Email, EqualTo, Length
class RegistrationForm(FlaskForm):
username = StringField('نام کاربری', validators=[DataRequired(), Length(min=6, max=20)])
email = StringField('ایمیل', validators=[DataRequired(), Email()])
password = PasswordField('رمز عبور', validators=[DataRequired()])
confirm_password = PasswordField('تکرار رمز عبور', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('ثبت نام')
در مثال بالا:
- فیلد
username
الزامی است و طول آن باید بین 6 تا 20 کاراکتر باشد. - فیلد
email
الزامی است و باید یک آدرس ایمیل معتبر باشد. - فیلدهای
password
وconfirm_password
الزامی هستند و مقادیر آنها باید برابر باشند.
نحوه استفاده از اعتبارسنجیها
- ایجاد یک فرم: یک کلاس از
FlaskForm
ارثبری کنید. - تعریف فیلدها: فیلدهای مختلف فرم را با استفاده از کلاسهای مربوطه (مانند
StringField
,PasswordField
) تعریف کنید. - اضافه کردن اعتبارسنجیها: به هر فیلد، یک یا چند اعتبارسنج اضافه کنید. این کار با استفاده از آرگومان
validators
انجام میشود.
مزایای استفاده از اعتبارسنجیهای از پیش تعریف شده
- سرعت توسعه: نیازی به نوشتن کد اعتبارسنجی از ابتدا نیست.
- امنیت: اطمینان حاصل میکند که دادههای ورودی معتبر هستند و از حملات تزریق جلوگیری میکند.
- کارایی: اعتبارسنجیها به طور خودکار انجام میشوند و از خطاهای انسانی جلوگیری میکنند.
نکات مهم
- ترکیب اعتبارسنجیها: میتوانید چندین اعتبارسنج را برای یک فیلد مشخص استفاده کنید.
- پیامهای خطا: برای هر اعتبارسنج میتوانید پیام خطای سفارشی تعریف کنید.
- اعتبارسنجی سفارشی: اگر اعتبارسنجیهای از پیش تعریف شده پاسخگوی نیازهای شما نباشند، میتوانید اعتبارسنجیهای سفارشی خود را ایجاد کنید.
با استفاده از اعتبارسنجیهای از پیش تعریف شده در Flask-WTF، میتوانید به راحتی فرمهای وب ایمن و کارآمدی ایجاد کنید.
مثالهای عملی اعتبارسنجیهای از پیش تعریف شده در Flask-WTF
Flask-WTF مجموعهای از اعتبارسنجیهای از پیش تعریف شده را ارائه میدهد که به طور چشمگیری فرآیند اعتبارسنجی دادههای ورودی در فرمهای وب را سادهتر میکند. در این بخش، چند مثال عملی از کاربرد این اعتبارسنجیها را بررسی میکنیم:
مثال 1: فرم ثبت نام کاربر
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Email, Length, EqualTo
class RegistrationForm(FlaskForm):
username = StringField('نام کاربری', validators=[DataRequired(), Length(min=6, max=20)])
email = StringField('ایمیل', validators=[DataRequired(), Email()])
password = PasswordField('رمز عبور', validators=[DataRequired()])
confirm_password = PasswordField('تکرار رمز عبور', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('ثبت نام')
در این مثال:
- DataRequired: اطمینان حاصل میکند که فیلدهای نام کاربری، ایمیل و رمز عبور الزامی هستند.
- Length: طول نام کاربری باید بین 6 تا 20 کاراکتر باشد.
- Email: بررسی میکند که ایمیل وارد شده معتبر باشد.
- EqualTo: اطمینان حاصل میکند که رمز عبور و تکرار رمز عبور یکسان هستند.
مثال 2: فرم تماس با ما
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField
from wtforms.validators import DataRequired, Email
class ContactForm(FlaskForm):
name = StringField('نام', validators=[DataRequired()])
email = StringField('ایمیل', validators=[DataRequired(), Email()])
message = TextAreaField('پیام', validators=[DataRequired()])
submit = SubmitField('ارسال')
در این مثال:
- DataRequired: اطمینان حاصل میکند که فیلدهای نام، ایمیل و پیام الزامی هستند.
- Email: بررسی میکند که ایمیل وارد شده معتبر باشد.
مثال 3: فرم ورود به سیستم
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired
class LoginForm(FlaskForm):
username = StringField('نام کاربری', validators=[DataRequired()])
password = PasswordField('رمز عبور', validators=[DataRequired()])
submit = SubmitField('ورود')
در این مثال:
- DataRequired: اطمینان حاصل میکند که فیلدهای نام کاربری و رمز عبور الزامی هستند.
مثال 4: فرم آپلود فایل
from flask_wtf import FlaskForm
from wtforms import FileField
from wtforms.validators import FileRequired, FileAllowed
class UploadForm(FlaskForm):
file = FileField('فایل', validators=[FileRequired(), FileAllowed(['pdf', 'doc', 'docx'])])
submit = SubmitField('آپلود')
در این مثال:
- FileRequired: اطمینان حاصل میکند که یک فایل انتخاب شده است.
- FileAllowed: بررسی میکند که فرمت فایل انتخاب شده در لیست مجاز باشد.
نکات مهم
- ترکیب اعتبارسنجیها: میتوانید چندین اعتبارسنج را برای یک فیلد مشخص استفاده کنید.
- پیامهای خطا: برای هر اعتبارسنج میتوانید پیام خطای سفارشی تعریف کنید.
- اعتبارسنجی سفارشی: اگر اعتبارسنجیهای از پیش تعریف شده پاسخگوی نیازهای شما نباشند، میتوانید اعتبارسنجیهای سفارشی خود را ایجاد کنید.
مزایای استفاده از اعتبارسنجیهای از پیش تعریف شده:
- سرعت توسعه: نیازی به نوشتن کد اعتبارسنجی از ابتدا نیست.
- امنیت: اطمینان حاصل میکند که دادههای ورودی معتبر هستند و از حملات تزریق جلوگیری میکند.
- کارایی: اعتبارسنجیها به طور خودکار انجام میشوند و از خطاهای انسانی جلوگیری میکنند.
با استفاده از این مثالها، میتوانید به راحتی اعتبارسنجیهای مختلف را در فرمهای وب خود پیادهسازی کنید و اطمینان حاصل کنید که دادههای ورودی کاربر معتبر و مطابق با نیازهای برنامه شما هستند.
استفاده از عبارات منظم (Regular Expressions) در اعتبارسنجی با Flask-WTF
عبارات منظم یا RegEx ابزار قدرتمندی برای تطبیق الگوهای متنی هستند. در Flask-WTF، میتوانیم از اعتبارسنج Regexp
برای اطمینان از اینکه دادههای ورودی با یک الگوی خاص مطابقت دارند، استفاده کنیم. این امر به ویژه برای اعتبارسنجی فرمتهای خاص مانند آدرسهای ایمیل، شماره تلفن، کد پستی و … مفید است.
نحوه استفاده از اعتبارسنج Regex
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired, Regexp
class MyForm(FlaskForm):
email = StringField('ایمیل', validators=[
DataRequired(),
Regexp(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$',
message='آدرس ایمیل وارد شده معتبر نیست.')
])
در مثال بالا:
- DataRequired: اطمینان حاصل میکند که فیلد ایمیل الزامی است.
- Regexp: بررسی میکند که مقدار وارد شده با الگوی آدرس ایمیل مطابقت داشته باشد. الگوی
r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
یک الگوی ساده برای آدرسهای ایمیل است.
مثالهای دیگر
- اعتبارسنجی شماره تلفن:
from wtforms.validators import Regexp
# برای شماره تلفنهای ایرانی با فرمت 09123456789
Regexp(r'^09[0-9]{9}$')
- اعتبارسنجی کد پستی:
from wtforms.validators import Regexp
# برای کد پستی 5 رقمی
Regexp(r'^\d{5}$')
- اعتبارسنجی نام کاربری:
from wtforms.validators import Regexp
# فقط حروف و اعداد
Regexp(r'^[a-zA-Z0-9]+$')
مزایای استفاده از Regex در اعتبارسنجی
- انعطافپذیری: با عبارات منظم میتوانید الگوهای بسیار پیچیدهای را تعریف کنید.
- دقت: اطمینان حاصل میکند که دادههای ورودی دقیقاً با فرمت مورد نظر مطابقت دارند.
- بازخوانیپذیری: با استفاده از نامهای مناسب برای گروههای مختلف در الگو، میتوان الگوها را خواناتر کرد.
- کاهش خطا: از ایجاد خطاهای دستوری در هنگام نوشتن اعتبارسنجیهای سفارشی جلوگیری میکند.
نکات مهم
- پیچیدگی الگو: هرچه الگوی شما پیچیدهتر باشد، درک و نگهداری آن سختتر میشود.
- عملکرد: عبارات منظم پیچیده میتوانند بر عملکرد برنامه تأثیر بگذارند.
- استانداردها: برای اعتبارسنجی آدرسهای ایمیل، شماره تلفن و سایر دادههای استاندارد، بهتر است از الگوهای از پیش تعریف شده استفاده کنید.
منابع برای یادگیری بیشتر درباره عبارات منظم
- سایتهای آنلاین: بسیاری از سایتها ابزارهای آنلاین برای آزمایش و یادگیری عبارات منظم ارائه میدهند.
- مستندات زبان برنامهنویسی: هر زبان برنامهنویسی مستندات جامعی در مورد عبارات منظم دارد.
- کتابها و دورههای آموزشی: منابع آموزشی زیادی برای یادگیری عمیق عبارات منظم وجود دارد.
با استفاده از عبارات منظم در Flask-WTF، میتوانید اعتبارسنجیهای قدرتمند و سفارشی برای فرمهای وب خود ایجاد کنید.
ترکیب چندین اعتبارسنج در Flask-WTF
Flask-WTF به شما اجازه میدهد تا برای هر فیلد فرم، چندین اعتبارسنج را به صورت همزمان تعریف کنید. این قابلیت بسیار مفید است زمانی که میخواهید چندین شرط را برای یک فیلد مشخص کنید.
چرا ترکیب اعتبارسنجها مهم است؟
- اعتبارسنجی جامعتر: با ترکیب چندین اعتبارسنج، میتوانید اطمینان حاصل کنید که دادههای ورودی از جنبههای مختلف معتبر هستند.
- انعطافپذیری بیشتر: میتوانید اعتبارسنجیهای پیچیدهتری را ایجاد کنید که شامل ترکیبی از اعتبارسنجیهای از پیش تعریف شده و سفارشی باشند.
- بهبود امنیت: با اعمال چندین لایه اعتبارسنجی، میتوانید از ورود دادههای مخرب جلوگیری کنید.
مثال عملی
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Length, Email, Regexp
class RegistrationForm(FlaskForm):
username = StringField('نام کاربری', validators=[
DataRequired(),
Length(min=6, max=20),
Regexp(r'^[a-zA-Z0-9_]+$', message='نام کاربری باید شامل حروف، اعداد و زیرخط باشد.')
])
email = StringField('ایمیل', validators=[DataRequired(), Email()])
password = PasswordField('رمز عبور', validators=[
DataRequired(),
Length(min=8),
Regexp(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z\d]{8,}$',
message='رمز عبور باید حداقل 8 کاراکتر شامل حروف بزرگ، کوچک و اعداد باشد.')
])
submit = SubmitField('ثبت نام')
در این مثال:
- فیلد username:
DataRequired
: الزامی بودن فیلدLength
: حداقل و حداکثر طول نام کاربریRegexp
: اطمینان از اینکه نام کاربری فقط شامل حروف، اعداد و زیرخط باشد
- فیلد password:
DataRequired
: الزامی بودن فیلدLength
: حداقل طول رمز عبورRegexp
: اطمینان از اینکه رمز عبور شامل حروف بزرگ، کوچک و اعداد باشد
نکات مهم
- ترتیب اعتبارسنجها: ترتیب قرارگیری اعتبارسنجها مهم نیست، زیرا همه آنها به صورت متوالی اجرا میشوند.
- پیامهای خطا: برای هر اعتبارسنج میتوانید یک پیام خطای سفارشی تعریف کنید.
- اعتبارسنجی سفارشی: میتوانید اعتبارسنجهای سفارشی خود را ایجاد کرده و آنها را با اعتبارسنجهای از پیش تعریف شده ترکیب کنید.
مثال دیگر: اعتبارسنجی شماره تلفن همراه
from wtforms.validators import Regexp
# برای شماره تلفنهای همراه ایرانی با فرمت 09123456789
Regexp(r'^09[0-9]{9}$')
چه زمانی از ترکیب اعتبارسنجها استفاده کنیم؟
- هنگامی که یک فیلد باید چندین شرط را برآورده کند: مثلاً یک فیلد ایمیل باید معتبر باشد و همچنین یک دامنه خاص را داشته باشد.
- هنگامی که میخواهید اعتبارسنجیهای پیچیدهای را ایجاد کنید: مثلاً اعتبارسنجی رمز عبوری که شامل حروف بزرگ، کوچک، اعداد و کاراکترهای خاص باشد.
- هنگامی که میخواهید اطمینان حاصل کنید که دادههای ورودی از جنبههای مختلف معتبر هستند: مثلاً یک فیلد تاریخ باید در یک بازه زمانی خاص قرار داشته باشد و همچنین فرمت صحیحی داشته باشد.
با ترکیب چندین اعتبارسنج، میتوانید فرمهای وب ایمنتر و کاربرپسندتری ایجاد کنید.
اعتبارسنجی فایلهای آپلود شده در Flask-WTF
اعتبارسنجی فایلهای آپلود شده یکی از جنبههای بسیار مهم در توسعه وباپلیکیشنها است. با استفاده از Flask-WTF، میتوانیم به راحتی انواع مختلفی از اعتبارسنجیها را روی فایلهای آپلود شده توسط کاربران اعمال کنیم.
چرا اعتبارسنجی فایل مهم است؟
- امنیت: جلوگیری از آپلود فایلهای مخرب مانند فایلهای اجرایی، اسکریپتها و …
- کنترل کیفیت: اطمینان از اینکه فایلهای آپلود شده دارای فرمت و اندازه مناسب هستند.
- بهینهسازی منابع: جلوگیری از آپلود فایلهای بسیار بزرگ که ممکن است باعث اشغال فضای دیسک و کند شدن سرور شود.
اعتبارسنجهای اصلی برای فایلها در Flask-WTF
- FileRequired: اطمینان حاصل میکند که کاربر فایلی را انتخاب کرده است.
- FileAllowed: بررسی میکند که پسوند فایل آپلود شده در لیست پسوندهای مجاز باشد.
- FileSize: محدود کردن اندازه فایل آپلود شده.
مثال عملی
from flask_wtf import FlaskForm
from wtforms import FileField
from wtforms.validators import FileRequired, FileAllowed
class UploadForm(FlaskForm):
file = FileField('فایل', validators=[
FileRequired(),
FileAllowed(['pdf', 'doc', 'docx'], 'فقط فایلهای PDF، DOC و DOCX مجاز هستند.')
])
submit = SubmitField('آپلود')
در این مثال:
- FileRequired: کاربر ملزم به انتخاب یک فایل است.
- FileAllowed: فقط فایلهای با پسوند PDF، DOC و DOCX مجاز هستند. پیام خطا نیز مشخص شده است.
مثال با محدودیت اندازه فایل
from flask_wtf import FlaskForm
from wtforms import FileField
from wtforms.validators import FileRequired, FileAllowed, FileSize
class UploadForm(FlaskForm):
file = FileField('فایل', validators=[
FileRequired(),
FileAllowed(['pdf', 'doc', 'docx']),
FileSize(max_size=16 * 1024 * 1024, message='اندازه فایل نباید از 16 مگابایت بیشتر باشد.')
])
submit = SubmitField('آپلود')
در این مثال، علاوه بر اعتبارسنجی نوع فایل، اندازه فایل نیز به 16 مگابایت محدود شده است.
نکات مهم در اعتبارسنجی فایلها
- تنظیمات سرور: برای امنیت بیشتر، تنظیمات سرور خود را به گونهای پیکربندی کنید که از آپلود فایلهای اجرایی و اسکریپتها جلوگیری کند.
- مسیر ذخیره فایل: مسیری امن و مناسب برای ذخیره فایلهای آپلود شده انتخاب کنید.
- نامگذاری فایلها: برای جلوگیری از مشکلات امنیتی، نام فایلهای آپلود شده را قبل از ذخیره سازی تغییر دهید.
- اعتبارسنجی محتویات فایل: در برخی موارد، ممکن است نیاز به بررسی محتویات فایل داشته باشید. برای این کار میتوانید از کتابخانههای پایتون مانند
filetype
یاmagic
استفاده کنید.
مثال پیشرفتهتر با بررسی محتویات فایل
import magic
def allowed_file(filename):
if not '.' in filename:
return False
ext = filename.rsplit('.', 1)[1].lower()
if ext not in ALLOWED_EXTENSIONS:
return False
# بررسی محتویات فایل با استفاده از کتابخانه magic
mime = magic.from_file(filename, mime=True)
if mime not in ALLOWED_MIME_TYPES:
return False
return True
در این مثال، تابع allowed_file
علاوه بر بررسی پسوند فایل، نوع MIME فایل را نیز بررسی میکند تا از مطابقت آن با انواع مجاز اطمینان حاصل کند.
جمعبندی
اعتبارسنجی فایلهای آپلود شده یک مرحله ضروری در توسعه وباپلیکیشنها است. Flask-WTF ابزارهای قدرتمندی را برای این منظور در اختیار شما قرار میدهد. با استفاده از این ابزارها و رعایت نکات امنیتی، میتوانید اطمینان حاصل کنید که فقط فایلهای مجاز و ایمن به سیستم شما آپلود میشوند.
بهترین روشها برای اعتبارسنجی فرمها
اعتبارسنجی فرمها یکی از مهمترین جنبههای امنیت و کارایی یک وب اپلیکیشن است. با اعتبارسنجی دقیق، میتوانید از ورود دادههای نامعتبر، مخرب و خطاآمیز جلوگیری کنید و تجربه کاربری بهتری را برای کاربران خود فراهم کنید.
چرا اعتبارسنجی فرمها مهم است؟
- امنیت: جلوگیری از حملات تزریق مانند SQL Injection، XSS و سایر تهدیدات امنیتی.
- کارایی: اطمینان از اینکه دادههای ورودی صحیح و معتبر هستند و از بروز خطاهای غیرمنتظره جلوگیری میکند.
- تجربه کاربری: نمایش پیامهای خطای مناسب به کاربر در صورت وارد کردن دادههای نامعتبر، باعث بهبود تجربه کاربری میشود.
روشهای اعتبارسنجی فرمها
-
اعتبارسنجی سمت کلاینت:
- JavaScript: با استفاده از کتابخانههایی مانند jQuery Validation یا جاوا اسکریپت خالص، میتوانید اعتبارسنجی اولیه را در سمت کلاینت انجام دهید. این کار باعث میشود تا کاربر بلافاصله از خطاهای خود مطلع شود و تجربه کاربری بهبود یابد.
- HTML5: HTML5 قابلیتهای جدیدی برای اعتبارسنجی فرمها مانند
required
,pattern
,minlength
,maxlength
و … ارائه میدهد.
-
اعتبارسنجی سمت سرور:
- فریمورکها: فریمورکهایی مانند Flask-WTF، Django Forms و … ابزارهای قدرتمندی برای تعریف و اعتبارسنجی فرمها ارائه میدهند.
- کد نویسی دستی: میتوانید با استفاده از زبان برنامهنویسی خود (مانند Python، PHP) اعتبارسنجی را به صورت دستی پیادهسازی کنید.
بهترین روشها
- اعتبارسنجی در هر دو سمت کلاینت و سرور:
- اعتبارسنجی سمت کلاینت برای بهبود تجربه کاربری و ارائه بازخورد سریع به کاربر.
- اعتبارسنجی سمت سرور به عنوان لایه امنیتی نهایی برای جلوگیری از حملات.
- استفاده از ابزارها و کتابخانهها:
- ابزارها و کتابخانههای موجود برای اعتبارسنجی فرمها، کار را سادهتر و ایمنتر میکنند.
- تعریف پیامهای خطای واضح و مفید:
- پیامهای خطا باید به زبان ساده و قابل فهم برای کاربر باشند و به او بگویند که چه مشکلی وجود دارد.
- اعتبارسنجی ورودیهای مختلف:
- علاوه بر فیلدهای متنی، باید ورودیهای دیگر مانند فایلها، تاریخها و اعداد را نیز اعتبارسنجی کنید.
- استفاده از عبارات منظم:
- برای اعتبارسنجی الگوهای پیچیده مانند آدرس ایمیل، شماره تلفن و … از عبارات منظم استفاده کنید.
- بهروزرسانی مداوم: با تغییر نیازها و تهدیدات امنیتی، اعتبارسنجی فرمهای خود را بهروز نگه دارید.
مثال با Flask-WTF
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Email, Length
class RegistrationForm(FlaskForm):
username = StringField('نام کاربری', validators=[DataRequired(), Length(min=6, max=20)])
email = StringField('ایمیل', validators=[DataRequired(), Email()])
password = PasswordField('رمز عبور', validators=[DataRequired(), Length(min=8)])
confirm_password = PasswordField('تکرار رمز عبور', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('ثبت نام')
نکات اضافی
- امنیت:
- از فیلتر کردن دادههای ورودی برای جلوگیری از تزریق کد استفاده کنید.
- از کوکیهای ایمن و HTTPS برای محافظت از دادهها استفاده کنید.
- کارایی:
- از اعتبارسنجیهای پیچیده و زمانبر پرهیز کنید.
- از کش کردن نتایج اعتبارسنجی برای بهبود عملکرد استفاده کنید.
- تجربه کاربری:
- پیامهای خطا را به صورت واضح و در کنار فیلدهای مربوطه نمایش دهید.
- از اعتبارسنجی زنده استفاده کنید تا کاربر بلافاصله از خطاهای خود مطلع شود.
با رعایت این نکات، میتوانید فرمهای وب ایمن و کاربرپسندی ایجاد کنید که از ورود دادههای نامعتبر جلوگیری کرده و تجربه کاربری بهتری را فراهم کنند.