flask

اعتبارسنجی داده‌های فرم

اعتبارسنجی داده‌های فرم در Flask-WTF

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

چرا اعتبارسنجی داده‌های فرم مهم است؟

  • امنیت: جلوگیری از تزریق کدهای مخرب، حملات XSS و سایر تهدیدات امنیتی.
  • کارایی: اطمینان از اینکه داده‌های وارد شده توسط کاربر صحیح و معتبر هستند و از بروز خطاهای غیرمنتظره جلوگیری می‌کند.
  • تجربه کاربری بهتر: نمایش پیام‌های خطای مناسب به کاربر در صورت وارد کردن داده‌های نامعتبر، باعث بهبود تجربه کاربری می‌شود.

اعتبارسنجی‌های رایج در Flask-WTF

  • DataRequired

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

    نحوه استفاده
    Python
    from flask_wtf import FlaskForm
    from wtforms import StringField
    from wtforms.validators import DataRequired
    
    class MyForm(FlaskForm):
        name = StringField('نام', validators=[DataRequired()])
    

    در این مثال، فیلد name به عنوان الزامی مشخص شده است. اگر کاربر این فیلد را خالی بگذارد، یک پیام خطا نمایش داده می‌شود.

    پیام‌های خطا

    به طور پیش‌فرض، Flask-WTF پیام‌های خطای عمومی برای اعتبارسنج‌ها ارائه می‌دهد. شما می‌توانید پیام‌های سفارشی را با استفاده از آرگومان message به اعتبارسنج اضافه کنید.

    Python
    from flask_wtf import FlaskForm
    from wtforms import StringField
    from wtforms.validators import DataRequired
    
    class MyForm(FlaskForm):
        name = StringField('نام', validators=[DataRequired(message='نام الزامی است.')])
    
    ترکیب با سایر اعتبارسنج‌ها

    می‌توانید چندین اعتبارسنج را برای یک فیلد ترکیب کنید. به عنوان مثال، می‌توانید هم DataRequired و هم Length را برای یک فیلد استفاده کنید تا اطمینان حاصل کنید که فیلد الزامی است و طول آن در محدوده مشخصی قرار دارد.

    Python
    from 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 است که طول رشته وارد شده در یک فیلد را بررسی می‌کند. این اعتبارسنج می‌تواند برای اطمینان از اینکه ورودی‌های کاربر در محدوده طول مشخصی قرار دارند، استفاده شود.

    نحوه استفاده
    Python
    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)])
    

    در این مثال، فیلد 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 است که بررسی می‌کند آیا آدرس ایمیل وارد شده معتبر است یا خیر. این اعتبارسنج از یک الگوی عبارات منظم برای بررسی فرمت آدرس ایمیل استفاده می‌کند.

    نحوه استفاده
    Python
    from 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 به اعتبارسنج اضافه کنید.

    Python
    from 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 است که بررسی می‌کند آیا مقدار دو فیلد برابر است یا خیر. این اعتبارسنج معمولاً برای تأیید رمز عبور استفاده می‌شود، اما می‌توان آن را برای مقایسه هر دو فیلد دیگر نیز به کار برد.

    نحوه استفاده
    Python
    from 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) استفاده می‌کند که یک زبان قدرتمند برای توصیف الگوهای متنی هستند.

    نحوه استفاده
    Python
    from 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 است که بررسی می‌کند آیا مقدار عددی وارد شده در یک بازه مشخص قرار دارد یا خیر. این اعتبارسنج برای محدود کردن مقادیر عددی ورودی بسیار مفید است.

    نحوه استفاده
    Python
    from 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 است که یک فیلد را اختیاری می‌کند. این بدان معنی است که کاربر مجبور نیست مقداری برای این فیلد وارد کند. اگر کاربر فیلد را خالی بگذارد، هیچ خطایی نمایش داده نمی‌شود.

    نحوه استفاده
    Python
    from 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 است. این اعتبارسنج اطمینان حاصل می‌کند که کاربر یک فایل را انتخاب کرده است و آن را خالی نگذاشته است.

    نحوه استفاده
    Python
    from flask_wtf import FlaskForm
    from wtforms import FileField
    from wtforms.validators import FileRequired
    
    class UploadForm(FlaskForm):
        file = FileField('فایل', validators=[FileRequired()])
    

    در این مثال، فیلد file به عنوان الزامی مشخص شده است و کاربر باید یک فایل را انتخاب کند.

    پیام‌های خطا

    اگر کاربر فایلی انتخاب نکند، اعتبارسنج FileRequired یک پیام خطا نمایش می‌دهد. شما می‌توانید پیام خطای سفارشی را با استفاده از آرگومان message به اعتبارسنج اضافه کنید.

    Python
    from 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 است که بررسی می‌کند آیا پسوند فایل انتخاب شده در لیست پسوندهای مجاز قرار دارد یا خیر. این اعتبارسنج برای محدود کردن انواع فایل‌های قابل آپلود بسیار مفید است.

    نحوه استفاده
    Python
    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'])])
    

    در این مثال، فیلد file به عنوان الزامی مشخص شده است و اعتبارسنج FileAllowed بررسی می‌کند که پسوند فایل انتخاب شده یکی از pdf, doc یا docx باشد.

    ویژگی‌ها
    • allowed_extensions: لیستی از پسوندهای مجاز.
    پیام‌های خطا

    اگر پسوند فایل انتخاب شده در لیست مجاز نباشد، اعتبارسنج FileAllowed یک پیام خطا نمایش می‌دهد. شما می‌توانید پیام خطای سفارشی را با استفاده از آرگومان message به اعتبارسنج اضافه کنید.

    Python
    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'], message='فقط فایل‌های PDF، DOC و DOCX مجاز هستند.')])
    
    ترکیب با سایر اعتبارسنج‌ها

    می‌توانید FileAllowed را با سایر اعتبارسنج‌های مخصوص فایل مانند FileRequired و FileSize ترکیب کنید تا اعتبارسنجی‌های پیچیده‌تری ایجاد کنید.

    با استفاده از اعتبارسنج FileAllowed، می‌توانید محدودیت‌هایی برای انواع فایل‌های قابل آپلود در برنامه خود ایجاد کنید و از آپلود فایل‌های نامعتبر جلوگیری کنید.

     

  • اعتبارسنج FileSize در Flask-WTF

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

    نحوه استفاده
    Python
    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=1024 * 1024)])
    

    در این مثال، فیلد file به عنوان الزامی مشخص شده است و اعتبارسنج FileSize بررسی می‌کند که اندازه فایل انتخاب شده از 1 مگابایت (1024 * 1024 بایت) بیشتر نباشد.

    ویژگی‌ها
    • max_size: حداکثر اندازه مجاز فایل (به بایت).
    • min_size: حداقل اندازه مجاز فایل (به بایت).
    پیام‌های خطا

    اگر اندازه فایل انتخاب شده از حد مجاز تجاوز کند، اعتبارسنج FileSize یک پیام خطا نمایش می‌دهد. شما می‌توانید پیام خطای سفارشی را با استفاده از آرگومان message به اعتبارسنج اضافه کنید.

    Python
    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=1024 * 1024, message='اندازه فایل نباید از 1 مگابایت بیشتر باشد.')])
    
    ترکیب با سایر اعتبارسنج‌ها

    می‌توانید FileSize را با سایر اعتبارسنج‌های مخصوص فایل مانند FileRequired و FileAllowed ترکیب کنید تا اعتبارسنجی‌های پیچیده‌تری ایجاد کنید.

    با استفاده از اعتبارسنج FileSize، می‌توانید محدودیت‌هایی برای اندازه فایل‌های قابل آپلود در برنامه خود ایجاد کنید و از آپلود فایل‌های بسیار بزرگ جلوگیری کنید.

     

مثال عملی

Python
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 برابر باشد.

نمایش پیام‌های خطا

HTML
{% 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 مطرح کنید.

Python
from wtforms import ValidationError

def my_custom_validator(form, field):
    if field.data.lower() != 'correct_value':
        raise ValidationError('مقدار وارد شده صحیح نیست.')

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

Python
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 اضافه شده است.

مثال کامل

Python
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)

اعتبارسنجی‌های سفارشی پیچیده‌تر

شما می‌توانید اعتبارسنجی‌های سفارشی پیچیده‌تری را ایجاد کنید که به چندین فیلد دسترسی داشته باشند یا از پایگاه داده یا منابع خارجی استفاده کنند.

مثال: بررسی وجود یک کاربر در پایگاه داده

Python
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: این اعتبارسنج باعث می‌شود که یک فیلد اختیاری شود و در صورت خالی بودن، خطایی ایجاد نکند.

مثال استفاده از اعتبارسنجی‌ها

Python
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 الزامی هستند و مقادیر آن‌ها باید برابر باشند.

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

  1. ایجاد یک فرم: یک کلاس از FlaskForm ارث‌بری کنید.
  2. تعریف فیلدها: فیلدهای مختلف فرم را با استفاده از کلاس‌های مربوطه (مانند StringField, PasswordField) تعریف کنید.
  3. اضافه کردن اعتبارسنجی‌ها: به هر فیلد، یک یا چند اعتبارسنج اضافه کنید. این کار با استفاده از آرگومان validators انجام می‌شود.

مزایای استفاده از اعتبارسنجی‌های از پیش تعریف شده

  • سرعت توسعه: نیازی به نوشتن کد اعتبارسنجی از ابتدا نیست.
  • امنیت: اطمینان حاصل می‌کند که داده‌های ورودی معتبر هستند و از حملات تزریق جلوگیری می‌کند.
  • کارایی: اعتبارسنجی‌ها به طور خودکار انجام می‌شوند و از خطاهای انسانی جلوگیری می‌کنند.

نکات مهم

  • ترکیب اعتبارسنجی‌ها: می‌توانید چندین اعتبارسنج را برای یک فیلد مشخص استفاده کنید.
  • پیام‌های خطا: برای هر اعتبارسنج می‌توانید پیام خطای سفارشی تعریف کنید.
  • اعتبارسنجی سفارشی: اگر اعتبارسنجی‌های از پیش تعریف شده پاسخگوی نیازهای شما نباشند، می‌توانید اعتبارسنجی‌های سفارشی خود را ایجاد کنید.

با استفاده از اعتبارسنجی‌های از پیش تعریف شده در Flask-WTF، می‌توانید به راحتی فرم‌های وب ایمن و کارآمدی ایجاد کنید.

 

مثال‌های عملی اعتبارسنجی‌های از پیش تعریف شده در Flask-WTF

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

مثال 1: فرم ثبت نام کاربر

Python
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: فرم تماس با ما

Python
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: فرم ورود به سیستم

Python
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: فرم آپلود فایل

Python
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

Python
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-.]+$' یک الگوی ساده برای آدرس‌های ایمیل است.

مثال‌های دیگر

  • اعتبارسنجی شماره تلفن:
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]+$')

مزایای استفاده از Regex در اعتبارسنجی

  • انعطاف‌پذیری: با عبارات منظم می‌توانید الگوهای بسیار پیچیده‌ای را تعریف کنید.
  • دقت: اطمینان حاصل می‌کند که داده‌های ورودی دقیقاً با فرمت مورد نظر مطابقت دارند.
  • بازخوانی‌پذیری: با استفاده از نام‌های مناسب برای گروه‌های مختلف در الگو، می‌توان الگوها را خواناتر کرد.
  • کاهش خطا: از ایجاد خطاهای دستوری در هنگام نوشتن اعتبارسنجی‌های سفارشی جلوگیری می‌کند.

نکات مهم

  • پیچیدگی الگو: هرچه الگوی شما پیچیده‌تر باشد، درک و نگهداری آن سخت‌تر می‌شود.
  • عملکرد: عبارات منظم پیچیده می‌توانند بر عملکرد برنامه تأثیر بگذارند.
  • استانداردها: برای اعتبارسنجی آدرس‌های ایمیل، شماره تلفن و سایر داده‌های استاندارد، بهتر است از الگوهای از پیش تعریف شده استفاده کنید.

منابع برای یادگیری بیشتر درباره عبارات منظم

  • سایت‌های آنلاین: بسیاری از سایت‌ها ابزارهای آنلاین برای آزمایش و یادگیری عبارات منظم ارائه می‌دهند.
  • مستندات زبان برنامه‌نویسی: هر زبان برنامه‌نویسی مستندات جامعی در مورد عبارات منظم دارد.
  • کتاب‌ها و دوره‌های آموزشی: منابع آموزشی زیادی برای یادگیری عمیق عبارات منظم وجود دارد.

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

 

ترکیب چندین اعتبارسنج در Flask-WTF

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

چرا ترکیب اعتبارسنج‌ها مهم است؟

  • اعتبارسنجی جامع‌تر: با ترکیب چندین اعتبارسنج، می‌توانید اطمینان حاصل کنید که داده‌های ورودی از جنبه‌های مختلف معتبر هستند.
  • انعطاف‌پذیری بیشتر: می‌توانید اعتبارسنجی‌های پیچیده‌تری را ایجاد کنید که شامل ترکیبی از اعتبارسنجی‌های از پیش تعریف شده و سفارشی باشند.
  • بهبود امنیت: با اعمال چندین لایه اعتبارسنجی، می‌توانید از ورود داده‌های مخرب جلوگیری کنید.

مثال عملی

Python
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: اطمینان از اینکه رمز عبور شامل حروف بزرگ، کوچک و اعداد باشد

نکات مهم

  • ترتیب اعتبارسنج‌ها: ترتیب قرارگیری اعتبارسنج‌ها مهم نیست، زیرا همه آن‌ها به صورت متوالی اجرا می‌شوند.
  • پیام‌های خطا: برای هر اعتبارسنج می‌توانید یک پیام خطای سفارشی تعریف کنید.
  • اعتبارسنجی سفارشی: می‌توانید اعتبارسنج‌های سفارشی خود را ایجاد کرده و آن‌ها را با اعتبارسنج‌های از پیش تعریف شده ترکیب کنید.

مثال دیگر: اعتبارسنجی شماره تلفن همراه

Python
from wtforms.validators import Regexp

# برای شماره تلفن‌های همراه ایرانی با فرمت 09123456789
Regexp(r'^09[0-9]{9}$')

چه زمانی از ترکیب اعتبارسنج‌ها استفاده کنیم؟

  • هنگامی که یک فیلد باید چندین شرط را برآورده کند: مثلاً یک فیلد ایمیل باید معتبر باشد و همچنین یک دامنه خاص را داشته باشد.
  • هنگامی که می‌خواهید اعتبارسنجی‌های پیچیده‌ای را ایجاد کنید: مثلاً اعتبارسنجی رمز عبوری که شامل حروف بزرگ، کوچک، اعداد و کاراکترهای خاص باشد.
  • هنگامی که می‌خواهید اطمینان حاصل کنید که داده‌های ورودی از جنبه‌های مختلف معتبر هستند: مثلاً یک فیلد تاریخ باید در یک بازه زمانی خاص قرار داشته باشد و همچنین فرمت صحیحی داشته باشد.

با ترکیب چندین اعتبارسنج، می‌توانید فرم‌های وب ایمن‌تر و کاربرپسندتری ایجاد کنید.

 

اعتبارسنجی فایل‌های آپلود شده در Flask-WTF

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

چرا اعتبارسنجی فایل مهم است؟

  • امنیت: جلوگیری از آپلود فایل‌های مخرب مانند فایل‌های اجرایی، اسکریپت‌ها و …
  • کنترل کیفیت: اطمینان از اینکه فایل‌های آپلود شده دارای فرمت و اندازه مناسب هستند.
  • بهینه‌سازی منابع: جلوگیری از آپلود فایل‌های بسیار بزرگ که ممکن است باعث اشغال فضای دیسک و کند شدن سرور شود.

اعتبارسنج‌های اصلی برای فایل‌ها در Flask-WTF

  • FileRequired: اطمینان حاصل می‌کند که کاربر فایلی را انتخاب کرده است.
  • FileAllowed: بررسی می‌کند که پسوند فایل آپلود شده در لیست پسوندهای مجاز باشد.
  • FileSize: محدود کردن اندازه فایل آپلود شده.

مثال عملی

Python
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 مجاز هستند. پیام خطا نیز مشخص شده است.

مثال با محدودیت اندازه فایل

Python
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 استفاده کنید.

مثال پیشرفته‌تر با بررسی محتویات فایل

Python
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 و سایر تهدیدات امنیتی.
  • کارایی: اطمینان از اینکه داده‌های ورودی صحیح و معتبر هستند و از بروز خطاهای غیرمنتظره جلوگیری می‌کند.
  • تجربه کاربری: نمایش پیام‌های خطای مناسب به کاربر در صورت وارد کردن داده‌های نامعتبر، باعث بهبود تجربه کاربری می‌شود.

روش‌های اعتبارسنجی فرم‌ها

  1. اعتبارسنجی سمت کلاینت:

    • JavaScript: با استفاده از کتابخانه‌هایی مانند jQuery Validation یا جاوا اسکریپت خالص، می‌توانید اعتبارسنجی اولیه را در سمت کلاینت انجام دهید. این کار باعث می‌شود تا کاربر بلافاصله از خطاهای خود مطلع شود و تجربه کاربری بهبود یابد.
    • HTML5: HTML5 قابلیت‌های جدیدی برای اعتبارسنجی فرم‌ها مانند required, pattern, minlength, maxlength و … ارائه می‌دهد.
  2. اعتبارسنجی سمت سرور:

    • فریمورک‌ها: فریمورک‌هایی مانند Flask-WTF، Django Forms و … ابزارهای قدرتمندی برای تعریف و اعتبارسنجی فرم‌ها ارائه می‌دهند.
    • کد نویسی دستی: می‌توانید با استفاده از زبان برنامه‌نویسی خود (مانند Python، PHP) اعتبارسنجی را به صورت دستی پیاده‌سازی کنید.

بهترین روش‌ها

  • اعتبارسنجی در هر دو سمت کلاینت و سرور:
    • اعتبارسنجی سمت کلاینت برای بهبود تجربه کاربری و ارائه بازخورد سریع به کاربر.
    • اعتبارسنجی سمت سرور به عنوان لایه امنیتی نهایی برای جلوگیری از حملات.
  • استفاده از ابزارها و کتابخانه‌ها:
    • ابزارها و کتابخانه‌های موجود برای اعتبارسنجی فرم‌ها، کار را ساده‌تر و ایمن‌تر می‌کنند.
  • تعریف پیام‌های خطای واضح و مفید:
    • پیام‌های خطا باید به زبان ساده و قابل فهم برای کاربر باشند و به او بگویند که چه مشکلی وجود دارد.
  • اعتبارسنجی ورودی‌های مختلف:
    • علاوه بر فیلدهای متنی، باید ورودی‌های دیگر مانند فایل‌ها، تاریخ‌ها و اعداد را نیز اعتبارسنجی کنید.
  • استفاده از عبارات منظم:
    • برای اعتبارسنجی الگوهای پیچیده مانند آدرس ایمیل، شماره تلفن و … از عبارات منظم استفاده کنید.
  • به‌روزرسانی مداوم: با تغییر نیازها و تهدیدات امنیتی، اعتبارسنجی فرم‌های خود را به‌روز نگه دارید.

مثال با Flask-WTF

Python
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 برای محافظت از داده‌ها استفاده کنید.
  • کارایی:
    • از اعتبارسنجی‌های پیچیده و زمان‌بر پرهیز کنید.
    • از کش کردن نتایج اعتبارسنجی برای بهبود عملکرد استفاده کنید.
  • تجربه کاربری:
    • پیام‌های خطا را به صورت واضح و در کنار فیلدهای مربوطه نمایش دهید.
    • از اعتبارسنجی زنده استفاده کنید تا کاربر بلافاصله از خطاهای خود مطلع شود.

با رعایت این نکات، می‌توانید فرم‌های وب ایمن و کاربرپسندی ایجاد کنید که از ورود داده‌های نامعتبر جلوگیری کرده و تجربه کاربری بهتری را فراهم کنند.

 

5/5 ( 1 امتیاز )
نمایش بیشتر

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا