Flask یک فریمورک وب سبک و انعطافپذیر در پایتون است که برای توسعه سریع وب اپلیکیشنها بسیار مناسب است. در این آموزش، شما را با مراحل ایجاد یک اپلیکیشن Flask ساده آشنا میکنیم.
نصب Flask
نصب Flask در محیط مجازی (Virtual Environment)
محیطهای مجازی (Virtual Environments) در پایتون به شما امکان میدهند تا پروژههای مختلف خود را با وابستگیهای جداگانه مدیریت کنید. این روش باعث جلوگیری از تداخل بین پروژهها و تضمین اجرای صحیح هر پروژه با وابستگیهای مورد نیاز آن میشود.
مراحل نصب Flask در یک محیط مجازی:
-
-
ایجاد محیط مجازی:
- Windows: Bash
python -m venv my_env
- macOS/Linux: Bash
python3 -m venv my_env
جایگزین کنید
my_env
با نام دلخواه برای محیط مجازی خود. - Windows:
-
فعال کردن محیط مجازی:
- Windows: Bash
my_env\Scripts\activate
- macOS/Linux: Bash
source my_env/bin/activate
- Windows:
-
نصب Flask: در محیط مجازی فعال شده، دستور زیر را اجرا کنید:
Bashpip install Flask
-
تأیید نصب: برای اطمینان از نصب صحیح Flask، میتوانید نسخه نصب شده آن را با دستور زیر بررسی کنید:
Bashflask --version
-
مثال کامل:
# ایجاد محیط مجازی
python -m venv my_flask_app
# فعال کردن محیط مجازی
source my_flask_app/bin/activate
# نصب Flask
pip install Flask
# تأیید نصب
flask --version
مزایای استفاده از محیطهای مجازی:
-
- جدا نگه داشتن وابستگیها: هر پروژه میتواند مجموعه وابستگیهای منحصر به فرد خود را داشته باشد.
- مدیریت نسخهها: میتوانید نسخههای مختلفی از یک پکیج را برای پروژههای مختلف نصب کنید.
- پاکسازی آسان: با حذف محیط مجازی، همه وابستگیهای آن نیز حذف میشوند.
با استفاده از محیطهای مجازی، میتوانید پروژههای Flask خود را به صورت ایزوله و قابل مدیریت نگه دارید.
ساخت یک اپلیکیشن ساده
یک فایل پایتون جدید با نام دلخواه (مثلاً app.py
) ایجاد کنید و کد زیر را در آن وارد کنید:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
توضیح کد:
-
from flask import Flask
: این خط کتابخانه Flask را وارد میکند.app = Flask(__name__)
: یک نمونه از کلاس Flask ایجاد میکند. آرگومان__name__
به Flask میگوید که کجا به دنبال فایلهای قالب و استاتیک بگردد.@app.route('/')
: این دکوراتور یک Route تعریف میکند. هر درخواست به آدرس/
به تابعhello_world
هدایت میشود.def hello_world():
: این تابع یک رشته ساده را برمیگرداند که در مرورگر نمایش داده میشود.if __name__ == '__main__':
: این شرط تضمین میکند که سرور توسعه فقط زمانی اجرا میشود که فایل به صورت مستقیم اجرا شود و نه زمانی که به عنوان یک ماژول وارد میشود.app.run()
: این خط سرور توسعه Flask را شروع میکند.
اجرای برنامه
برای اجرای این اپلیکیشن، ترمینال خود را باز کنید، به دایرکتوری حاوی فایل app.py
بروید و دستور زیر را اجرا کنید:
python app.py
پس از اجرای این دستور، پیامی مبنی بر اینکه سرور در آدرس http://127.0.0.1:5000/
در حال اجرا است، نمایش داده میشود. در مرورگر خود این آدرس را وارد کنید تا پیام “Hello, World!” را مشاهده کنید.
مفهوم Route در Flask
در Flask، روت (Route) به آدرس URLای گفته میشود که به یک تابع خاص در برنامه شما مرتبط است. هر زمانی که یک درخواست با این آدرس به سرور ارسال میشود، تابع مربوط به آن روت اجرا میشود و پاسخ مناسب را برمیگرداند. به عبارت سادهتر، روتها نقشهای هستند که مشخص میکنند هر درخواست به کدام قسمت از برنامه شما هدایت شود.
مثال ساده:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
در این مثال:
@app.route('/')
: این دکوراتور یک روت تعریف میکند. هر زمانی که کاربری آدرسhttp://127.0.0.1:5000/
(آدرس پیشفرض سرور توسعه Flask) را در مرورگر خود وارد کند، تابعhello()
اجرا میشود.def hello():
: این تابع یک پاسخ ساده (متن “Hello, World!”) را برمیگرداند.
اهمیت روتها:
-
روتها در Flask نقش نقشه راه را برای برنامه شما ایفا میکنند. آنها تعیین میکنند که هر درخواست ورودی از سمت کاربر به کدام قسمت از برنامه شما هدایت شود. به عبارت سادهتر، روتها ارتباط بین آدرسهای URL و توابعی که وظیفه پردازش آن درخواستها را بر عهده دارند، برقرار میکنند.
چرا روتها اهمیت دارند؟
- ساختاردهی برنامه: روتها به برنامه شما ساختار و نظم میدهند. با تعریف روتها، شما در واقع یک نقشه از بخشهای مختلف برنامه خود ایجاد میکنید.
- مدیریت درخواستها: هر درخواست ورودی به یک روت خاص هدایت میشود و تابع مربوط به آن روت برای پردازش درخواست فراخوانی میشود. این امر باعث میشود که بتوانید به راحتی درخواستهای مختلف را از هم تفکیک کرده و پاسخهای مناسب را ارائه دهید.
- ایجاد صفحات دینامیک: با استفاده از روتهای متغیر، میتوانید صفحات دینامیکی ایجاد کنید که بر اساس ورودی کاربر تغییر میکنند.
- بهبود SEO: روتهای مناسب به موتورهای جستجو کمک میکنند تا محتوای وبسایت شما را بهتر ایندکس کنند.
مثالهای کاربردی:
- وبلاگ:
/posts/
: لیست تمام پستها/posts/<int:post_id>
: نمایش جزئیات یک پست خاص
- فروشگاه آنلاین:
/products/
: لیست تمام محصولات/products/<int:product_id>
: نمایش جزئیات یک محصول/categories/<category>
: نمایش محصولات یک دسته بندی خاص
- شبکه اجتماعی:
/users/
: لیست تمام کاربران/users/<username>
: پروفایل کاربر/posts/<int:post_id>/comments
: کامنتهای یک پست خاص
انواع روتها:
فلَسک یک میکروفریمورک سبک وزن و محبوب پایتون برای ساخت وباپلیکیشنها است. یکی از مفاهیم مهم در فلَسک، مفهوم روت است. روتها در واقع آدرسهای URL هستند که به قسمتهای مختلف اپلیکیشن ما مرتبط میشوند و تعیین میکنند که وقتی کاربر یک آدرس خاص را در مرورگر خود تایپ میکند، چه کدی اجرا شود.
روت ساده در فلَسک (Simple Route)
روت ساده در فلَسک، پایه و اساس ارتباط بین یک آدرس اینترنتی (URL) و یک تابع خاص در اپلیکیشن شما است. به عبارت دیگر، هرگاه کاربری آدرس مشخصی را در مرورگر خود تایپ میکند، فلَسک به دنبال روتی میگردد که با آن آدرس مطابقت داشته باشد و سپس تابع مرتبط با آن روت را اجرا میکند.
ساختار یک روت ساده
یک روت ساده در فلَسک به صورت زیر تعریف میشود:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, World!'
-
app.route('/')
: این دکوریتور (decorator) به تابعindex
متصل میشود و مشخص میکند که این تابع به روت/
(صفحه اصلی) متصل است.def index():
: این تابع، وظیفه پردازش درخواست و تولید پاسخ را بر عهده دارد. در این مثال، تابع به سادگی عبارت “Hello, World!” را برمیگرداند.
اجزای اصلی یک روت
-
- دکوریتور
@app.route()
: این دکوریتور، تابع را به یک روت متصل میکند. - URL: آدرس اینترنتی که به روت متصل است.
- تابع: تابعی که هنگام درخواست به این آدرس اجرا میشود.
- دکوریتور
انواع روتهای ساده
-
- روتهای دقیق: به یک آدرس خاص متصل میشوند. مانند مثال بالا که روت
/
به تابعindex
متصل است. - روتهای متغیر: شامل قسمتهایی هستند که میتوانند مقادیر مختلفی را بگیرند. برای مثال:
- روتهای دقیق: به یک آدرس خاص متصل میشوند. مانند مثال بالا که روت
@app.route('/user/<username>')
def show_user_profile(username):
return f'User profile for {username}'
در این مثال، <username>
یک متغیر است که میتواند هر نام کاربری باشد.
مزایای استفاده از روتهای ساده
-
- سادگی و خوانایی: روتهای ساده، ساختار کد را سادهتر و خواناتر میکنند.
- انعطافپذیری: با استفاده از روتهای متغیر، میتوانیم آدرسهای متنوعی را پوشش دهیم.
- سازماندهی بهتر: روتها به ما کمک میکنند تا کد خود را به بخشهای کوچکتر و قابل مدیریتتر تقسیم کنیم.
مثالهای بیشتر
@app.route('/about')
def about():
return 'This is the about page.'
@app.route('/products/<int:product_id>')
def product_details(product_id):
return f'Details for product with ID {product_id}'
جمعبندی
روتهای ساده، پایه و اساس ساخت اپلیکیشنهای وب با فلَسک هستند. با درک کامل روتها، میتوانید اپلیکیشنهای وب پویا و تعاملی ایجاد کنید.
روتهای دارای متغیر در فلَسک (Route with Variables)
روتهای دارای متغیر در فلَسک به شما اجازه میدهند تا آدرسهای URL دینامیک و انعطافپذیرتری ایجاد کنید. این روتها شامل قسمتهایی هستند که میتوانند مقادیر مختلفی را بگیرند. این ویژگی به شما امکان میدهد تا با یک رول واحد، چندین درخواست مختلف را مدیریت کنید.
ساختار یک روت دارای متغیر:
@app.route('/users/<username>')
def user_profile(username):
# ...
در این مثال، <username>
یک متغیر است که میتواند هر نام کاربری باشد. وقتی کاربری آدرس http://your_domain.com/users/ali
را تایپ کند، مقدار username
برابر با ali
شده و تابع user_profile
اجرا میشود.
چطور فلَسک متغیرها را از URL استخراج میکند؟
فلَسک از قسمتهایی از URL که بین علامتهای <
و >
قرار دارند به عنوان متغیر استفاده میکند. این متغیرها سپس به عنوان آرگومان به تابع مرتبط با روت منتقل میشوند.
تبدیلکنندههای داده (Converters):
برای کنترل نوع دادهای متغیرها، از تبدیلکنندههای داده استفاده میشود. برای مثال:
-
<int:post_id>
: مقدارpost_id
باید یک عدد صحیح باشد.<float:price>
: مقدارprice
باید یک عدد اعشاری باشد.<path:file_path>
: مقدارfile_path
میتواند شامل اسلش باشد.
مثالهای بیشتر:
@app.route('/posts/<int:post_id>/comments')
def post_comments(post_id):
# ...
@app.route('/products/<string:product_name>')
def product_details(product_name):
# ...
مزایای استفاده از روتهای دارای متغیر:
-
- انعطافپذیری: با یک رول، میتوانید چندین درخواست را مدیریت کنید.
- URLهای معنیدار: ایجاد URLهای قابل فهم برای کاربران.
- کاهش تعداد روتها: کاهش پیچیدگی کد.
موارد استفاده:
-
- نمایش پروفایل کاربران
- نمایش جزئیات محصولات
- مدیریت منابع دینامیک
- ساخت APIهای RESTful
نکات مهم:
-
- ترتیب متغیرها: ترتیب متغیرها در URL مهم است.
- امنیت: همیشه ورودیهای کاربر را اعتبارسنجی کنید.
- تبدیلکنندههای داده: از تبدیلکنندههای داده مناسب برای جلوگیری از خطا استفاده کنید.
جمعبندی:
روتهای دارای متغیر، ابزاری قدرتمند برای ایجاد اپلیکیشنهای وب دینامیک و انعطافپذیر با فلَسک هستند. با استفاده از این روتها، میتوانید URLهای معنیدار و قابل فهمی برای کاربران ایجاد کنید و کد خود را بهینه کنید.
روتهایی با چندین متغیر در فلَسک
چگونه روتهای چند متغیره کار میکنند؟
-
- تبدیلکنندهها (Converters): بخشهای متغیر یک URL با استفاده از تبدیلکنندهها مشخص میشوند. این تبدیلکنندهها تعیین میکنند که چه نوع دادهای از آن بخش استخراج شود. به عنوان مثال،
<int:user_id>
نشان میدهد که یک عدد صحیح از این بخش استخراج خواهد شد. - توابع نماینده (View Functions): زمانی که یک درخواست با یک URL مطابق با یک روت انجام میشود، تابع نماینده مربوط به آن روت فراخوانی میشود. متغیرهای استخراج شده از URL به عنوان آرگومان به این تابع ارسال میشوند.
- تبدیلکنندهها (Converters): بخشهای متغیر یک URL با استفاده از تبدیلکنندهها مشخص میشوند. این تبدیلکنندهها تعیین میکنند که چه نوع دادهای از آن بخش استخراج شود. به عنوان مثال،
مثالهای بیشتر
۱. نمایش پروفایل کاربر:
@app.route('/users/<int:user_id>')
def user_profile(user_id):
# کدهایی برای نمایش پروفایل کاربر با شناسه user_id
return f"پروفایل کاربر با شناسه {user_id}"
در این مثال، URLهایی مانند /users/123
یا /users/456
به این روت مطابقت داده میشوند و تابع user_profile
با شناسه کاربر به عنوان آرگومان فراخوانی میشود.
۲. ویرایش یک پست:
@app.route('/posts/<int:post_id>/edit')
def edit_post(post_id):
# کدهایی برای نمایش فرم ویرایش پست با شناسه post_id
return f"فرم ویرایش پست با شناسه {post_id}"
۳. جستجوی محصولات:
@app.route('/search/<string:query>')
def search_products(query):
# کدهایی برای جستجوی محصولات با عبارت query
return f"نتایج جستجو برای عبارت: {query}"
مزایای روتهای چند متغیره
-
- URLهای تمیز و معنیدار: با استفاده از روتهای چند متغیره میتوانید URLهایی ایجاد کنید که به راحتی قابل درک باشند و ساختار منطقی وباپلیکیشن شما را نشان دهند.
- کاهش تکرار کد: با استفاده از روتهای چند متغیره میتوانید کدهای تکراری را کاهش داده و کد خود را تمیزتر و قابل نگهداریتر کنید.
- انعطافپذیری بیشتر: روتهای چند متغیره به شما اجازه میدهند تا وباپلیکیشن خود را به راحتی گسترش دهید و ویژگیهای جدید به آن اضافه کنید.
نکات مهم
-
- امنیت: همیشه دادههای استخراج شده از URL را قبل از استفاده اعتبارسنجی کنید تا از حملات تزریق و سایر تهدیدات امنیتی جلوگیری کنید.
- تبدیلکنندههای سفارشی: اگر به تبدیلکنندههای پیشفرض فلاسک نیاز ندارید، میتوانید تبدیلکنندههای سفارشی خود را ایجاد کنید.
- ساختار URL: سعی کنید ساختار URLهای خود را ساده و منطقی نگه دارید تا برای کاربران و موتورهای جستجو قابل درک باشد.
جمعبندی
روتهای چند متغیره یکی از ویژگیهای قدرتمند فلاسک است که به شما اجازه میدهد تا وباپلیکیشنهای دینامیک و انعطافپذیر بسازید. با درک نحوه کار این روتها و استفاده صحیح از آنها، میتوانید وباپلیکیشنهای حرفهایتری ایجاد کنید.
روتها با روشهای HTTP در فلاسک: پاسخگویی به درخواستهای مختلف
درک مفهوم
در فلاسک، هر روت نه تنها یک آدرس URL را مشخص میکند، بلکه به یک یا چند روش HTTP (مانند GET، POST، PUT، DELETE، و …) مرتبط است. این روشها تعیین میکنند که چه عملی باید در پاسخ به یک درخواست خاص انجام شود. برای مثال، یک درخواست GET معمولاً برای دریافت اطلاعات استفاده میشود، در حالی که یک درخواست POST برای ارسال داده به سرور به کار میرود.
تعریف روتهای با روشهای مختلف
برای تعریف یک روت با یک روش HTTP خاص، از دکوراتورهای مربوطه استفاده میکنیم. به عنوان مثال:
from flask import Flask, request
app = Flask(__name__)
@app.route('/users', methods=['GET'])
def get_users():
# این تابع در پاسخ به درخواست GET به آدرس /users فراخوانی میشود
# ... کد برای دریافت لیست کاربران ...
return jsonify({'users': users})
@app.route('/users', methods=['POST'])
def create_user():
# این تابع در پاسخ به درخواست POST به آدرس /users فراخوانی میشود
# ... کد برای ایجاد کاربر جدید ...
return jsonify({'message': 'user created'})
در این مثال:
-
@app.route('/users', methods=['GET'])
: این دکوراتور روتی را تعریف میکند که به آدرس/users
و فقط به روش GET پاسخ میدهد.@app.route('/users', methods=['POST'])
: این دکوراتور روتی را تعریف میکند که به آدرس/users
و فقط به روش POST پاسخ میدهد.
چندین روش HTTP برای یک روت
شما میتوانید برای یک روت، چندین روش HTTP را مشخص کنید:
@app.route('/users/<int:user_id>', methods=['GET', 'PUT', 'DELETE'])
def user_operations(user_id):
if request.method == 'GET':
# ... کد برای دریافت اطلاعات کاربر با شناسه user_id ...
elif request.method == 'PUT':
# ... کد برای ویرایش اطلاعات کاربر با شناسه user_id ...
elif request.method == 'DELETE':
# ... کد برای حذف کاربر با شناسه user_id ...
دلایل استفاده از روشهای HTTP مختلف
-
- عملکردهای مختلف: هر روش HTTP یک عمل مشخص را نشان میدهد. با استفاده از روشهای مختلف، میتوانید عملکردهای مختلفی را برای یک آدرس URL تعریف کنید.
- RESTful API: روشهای HTTP یکی از اصول اصلی در طراحی APIهای RESTful هستند.
- امنیت: با استفاده از روشهای HTTP مناسب، میتوانید امنیت برنامه خود را افزایش دهید. برای مثال، عملیات حساس مانند حذف دادهها معمولاً با روش DELETE انجام میشوند.
نکات مهم
-
request.method
: این متغیر حاوی روش HTTP درخواست ورودی است.- روشهای HTTP دیگر: علاوه بر GET، POST، PUT و DELETE، روشهای دیگری مانند HEAD، OPTIONS و TRACE نیز وجود دارند.
- HTTP Status Codes: برای نشان دادن نتیجه عملیات، از کدهای وضعیت HTTP استفاده کنید (مانند ۲۰۰ برای موفقیت، ۴۰۴ برای یافت نشدن، و ۵۰۰ برای خطاهای سرور).
مثال کاربردی: API برای مدیریت مقالات
@app.route('/articles', methods=['GET', 'POST'])
def articles():
if request.method == 'GET':
# ... کد برای دریافت لیست مقالات ...
elif request.method == 'POST':
# ... کد برای ایجاد مقاله جدید ...
@app.route('/articles/<int:article_id>', methods=['GET', 'PUT', 'DELETE'])
def article(article_id):
if request.method == 'GET':
# ... کد برای دریافت اطلاعات یک مقاله خاص ...
elif request.method == 'PUT':
# ... کد برای ویرایش یک مقاله خاص ...
elif request.method == 'DELETE':
# ... کد برای حذف یک مقاله خاص ...
با استفاده از روتهای با روشهای HTTP مختلف، میتوانید APIهای RESTful قدرتمند و قابل فهمی ایجاد کنید.
مثال جامع روتها با روشهای HTTP در فلاسک
فرض کنید میخواهیم یک API ساده برای مدیریت کاربران ایجاد کنیم. این API امکاناتی مانند دریافت لیست کاربران، ایجاد کاربر جدید، ویرایش اطلاعات کاربر و حذف کاربر را فراهم میکند.
from flask import Flask, request, jsonify
app = Flask(__name__)
# لیست نمونهای از کاربران
users = [
{'id': ۱, 'name': 'علی'},
{'id': ۲, 'name': 'حسین'},
{'id': ۳, 'name': 'فاطمه'}
]
@app.route('/users', methods=['GET', 'POST'])
def users_list():
if request.method == 'GET':
return jsonify({'users': users})
elif request.method == 'POST':
new_user = request.get_json()
users.append(new_user)
return jsonify({'message': 'کاربر جدید با موفقیت ایجاد شد'})
@app.route('/users/<int:user_id>', methods=['GET', 'PUT', 'DELETE'])
def user(user_id):
user = next((user for user in users if user['id'] == user_id), None)
if not user:
return jsonify({'error': 'کاربر یافت نشد'}), ۴۰۴
if request.method == 'GET':
return jsonify({'user': user})
elif request.method == 'PUT':
data = request.get_json()
user.update(data)
return jsonify({'message': 'اطلاعات کاربر با موفقیت ویرایش شد'})
elif request.method == 'DELETE':
users.remove(user)
return jsonify({'message': 'کاربر با موفقیت حذف شد'})
if __name__ == '__main__':
app.run(debug=True)
توضیح کد:
-
@app.route('/users', methods=['GET', 'POST'])
:- این روت به آدرس
/users
پاسخ میدهد و از روشهای GET و POST پشتیبانی میکند. - در حالت GET، لیست کامل کاربران را برمیگرداند.
- در حالت POST، یک کاربر جدید به لیست اضافه میکند.
- این روت به آدرس
@app.route('/users/<int:user_id>', methods=['GET', 'PUT', 'DELETE'])
:- این روت به آدرس
/users/<user_id>
پاسخ میدهد و از روشهای GET، PUT و DELETE پشتیبانی میکند. - در حالت GET، اطلاعات یک کاربر خاص را برمیگرداند.
- در حالت PUT، اطلاعات یک کاربر را ویرایش میکند.
- در حالت DELETE، یک کاربر را حذف میکند.
- این روت به آدرس
request.get_json()
: برای دریافت دادههای ارسال شده در قالب JSON استفاده میشود.next()
: برای پیدا کردن کاربر با شناسه مشخص در لیست استفاده میشود.update()
: برای بهروزرسانی اطلاعات یک دیکشنری استفاده میشود.- کدهای وضعیت HTTP: از کدهای وضعیت HTTP مانند ۴۰۴ برای نشان دادن خطاهای NotFound استفاده میشود.
نکات مهم:
-
- امنیت: این مثال صرفاً برای آموزش است و در دنیای واقعی باید اقدامات امنیتی بیشتری انجام شود.
- پایگاه داده: در یک برنامه واقعی، بهتر است از یک پایگاه داده برای ذخیره اطلاعات کاربران استفاده شود.
- اعتبارسنجی دادهها: قبل از انجام هرگونه عملیات، دادههای ورودی را اعتبارسنجی کنید.
- خطایابی: برای هر سناریو، خطاهای احتمالی را پیشبینی کرده و آنها را مدیریت کنید.
کاربردهای دیگر:
-
- API برای وبلاگ: ایجاد، خواندن، بهروزرسانی و حذف مقالات.
- API برای فروشگاه آنلاین: مدیریت محصولات، سبد خرید و کاربران.
- API برای برنامههای موبایل: ایجاد بکاند برای برنامههای موبایل.
روتها با پارامترهای آدرس در فلاسک: ایجاد URLهای دینامیک
روتهای با پارامترهای آدرس به شما اجازه میدهند تا URLهای پویا و انعطافپذیر ایجاد کنید. این روتها شامل قسمتهای ثابت و متغیر هستند و به شما امکان میدهند تا بر اساس مقدار متغیرهای URL، پاسخهای مختلفی را به کاربر ارائه دهید.
سینتکس روتهای با پارامتر
یک روت با پارامتر به شکل زیر تعریف میشود:
@app.route('/users/<int:user_id>')
def get_user(user_id):
# ...
در این مثال:
-
/users
قسمت ثابت URL است.<int:user_id>
قسمت متغیر URL است که یک عدد صحیح را نشان میدهد. مقدار این متغیر به عنوان آرگومانuser_id
به تابعget_user
منتقل میشود.
انواع تبدیلکنندهها
فلاسک از تبدیلکنندههای مختلفی برای استخراج مقادیر از قسمتهای متغیر URL پشتیبانی میکند:
-
int
: برای اعداد صحیحfloat
: برای اعداد اعشاریpath
: برای مسیرهای فایلuuid
: برای شناسههای جهانی یکتا (UUID)- تبدیلکنندههای سفارشی: شما میتوانید تبدیلکنندههای سفارشی خود را برای انواع دادههای خاص ایجاد کنید.
مثالهای بیشتر
# روت با پارامتر رشتهای
@app.route('/posts/<string:slug>')
def get_post(slug):
# ...
# روت با چندین پارامتر
@app.route('/products/<int:category_id>/<int:product_id>')
def get_product(category_id, product_id):
# ...
# روت با پارامتر اختیاری
@app.route('/users/<int:user_id>/comments/<int:comment_id>')
def get_comment(user_id, comment_id=None):
# ...
کاربردهای روتهای با پارامتر
-
- ایجاد URLهای پویا: برای نمایش صفحات مختلف بر اساس پارامترهای URL.
- ساخت APIهای RESTful: برای شناسایی منابع مختلف با استفاده از شناسههای منحصر به فرد.
- مسیریابی داخلی در SPAها: برای مدیریت مسیرهای مختلف در برنامههای تک صفحهای.
نکات مهم
-
- امنیت: همیشه ورودیهای کاربر را قبل از استفاده اعتبارسنجی کنید تا از تزریق SQL و سایر حملات جلوگیری شود.
- خوانایی: نام متغیرها و روتها را به گونهای انتخاب کنید که کد شما قابل فهم باشد.
- عملکرد: از تبدیلکنندههای ساده و بهینه استفاده کنید تا عملکرد برنامه را کاهش ندهید.
مثال جامع: وبلاگ
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'صفحه اصلی'
@app.route('/posts/<int:post_id>')
def show_post(post_id):
# اینجا کدی برای دریافت اطلاعات پست با شناسه post_id از پایگاه داده
return f'شما پست با شناسه {post_id} را درخواست کردید'
if __name__ == '__main__':
app.run(debug=True)
در این مثال:
-
/
روت اصلی سایت است./posts/<int:post_id>
روتی است که برای نمایش یک پست خاص استفاده میشود. پارامترpost_id
یک عدد صحیح است که شناسه پست را مشخص میکند.
با استفاده از روتهای با پارامترهای آدرس، میتوانید وباپلیکیشنهای پویا و انعطافپذیری ایجاد کنید.
روتهایی که دادههای JSON را پردازش میکنند در فلاسک
درک مفهوم
روتهایی که دادههای JSON را پردازش میکنند، به شما این امکان را میدهند تا با دادههای ساختیافته در فرمت JSON کار کنید. JSON (JavaScript Object Notation) یک فرمت سبک و خوانا برای تبادل داده است و به طور گستردهای در توسعه وب استفاده میشود.
ارسال دادههای JSON به سرور
به طور معمول، دادههای JSON در بدنه درخواستهای HTTP POST یا PUT ارسال میشوند. فلاسک با استفاده از request.get_json()
میتواند این دادهها را به یک شیء پایتون تبدیل کند.
مثال
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/users', methods=['POST'])
def create_user():
user_data = request.get_json()
# ... کد برای ذخیره اطلاعات کاربر در پایگاه داده ...
return jsonify({'message': 'کاربر جدید با موفقیت ایجاد شد'}), ۲۰۱
در این مثال:
-
request.get_json()
دادههای JSON ارسال شده در بدنه درخواست را به یک دیکشنری پایتون تبدیل میکند.user_data
حاوی اطلاعات کاربر جدید است که میتوان از آن برای ذخیره در پایگاه داده استفاده کرد.
دریافت دادههای JSON از سرور
برای ارسال پاسخ در قالب JSON، از تابع jsonify
استفاده میشود.
@app.route('/users/<int:user_id>')
def get_user(user_id):
# ... کد برای دریافت اطلاعات کاربر از پایگاه داده ...
return jsonify({'user': user})
مثال جامعتر: API برای مدیریت کتابها
from flask import Flask, request, jsonify
app = Flask(__name__)
books = [
{'id': ۱, 'title': 'کتاب اول', 'author': 'نویسنده اول'},
{'id': ۲, 'title': 'کتاب دوم', 'author': 'نویسنده دوم'}
]
@app.route('/books', methods=['GET', 'POST'])
def books_list():
if request.method == 'GET':
return jsonify({'books': books})
elif request.method == 'POST':
new_book = request.get_json()
books.append(new_book)
return jsonify({'message': 'کتاب جدید با موفقیت اضافه شد'}), ۲۰۱
@app.route('/books/<int:book_id>', methods=['GET', 'PUT', 'DELETE'])
def book(book_id):
# ... کد برای انجام عملیات روی کتاب خاص ...
نکات مهم
-
- اعتبارسنجی دادهها: همیشه دادههای دریافتی از کاربر را اعتبارسنجی کنید تا از تزریق کد و سایر حملات جلوگیری کنید.
- خطایابی: برای خطاهایی مانند دادههای نامعتبر یا عدم وجود داده، پیامهای خطای مناسب ارسال کنید.
- استانداردهای JSON: از استانداردهای JSON برای ساختار دادهها استفاده کنید تا اطمینان حاصل کنید که دادهها به درستی تفسیر میشوند.
کاربردهای روتهای با دادههای JSON
-
- APIهای RESTful: برای ساخت APIهایی که دادهها را در قالب JSON تبادل میکنند.
- برنامههای تک صفحهای (SPA): برای برقراری ارتباط بین فرانتاند و بکاند.
- وب سرویسها: برای ایجاد وب سرویسهایی که دادهها را به صورت JSON ارائه میدهند.
با استفاده از روتهایی که دادههای JSON را پردازش میکنند، میتوانید برنامههای وب پویا و قدرتمندی ایجاد کنید که با سایر سیستمها به خوبی تعامل میکنند.
روتهای با آپلود فایل در فلاسک: مدیریت فایلهای آپلود شده توسط کاربران
درک مفهوم
روتهایی با آپلود فایل، به شما امکان میدهند تا در برنامه وب خود، امکان آپلود فایل توسط کاربران را فراهم کنید. این قابلیت در بسیاری از برنامههای وب، از جمله سیستمهای مدیریت محتوا، شبکههای اجتماعی و فروشگاههای آنلاین، ضروری است.
نحوه کار
-
- فرم HTML: یک فرم HTML با یک فیلد ورودی از نوع
file
ایجاد میشود تا کاربر بتواند فایل خود را انتخاب کند. - ارسال درخواست: وقتی کاربر روی دکمه ارسال کلیک میکند، دادههای فرم به همراه فایل آپلود شده به سرور ارسال میشود.
- پردازش در فلاسک: روت مربوطه در فلاسک، فایل آپلود شده را از درخواست HTTP دریافت کرده و آن را پردازش میکند. این پردازش میتواند شامل ذخیره فایل در یک مکان مشخص، اعتبارسنجی فایل، تغییر اندازه تصویر، و … باشد.
- فرم HTML: یک فرم HTML با یک فیلد ورودی از نوع
مثال عملی
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
if 'file' not in request.files:
return 'No file part'
file = request.files['file']
if file.filename == '':
return 'No selected file'
if file:
file.save('uploads/' + file.filename)
return 'File uploaded successfully'
return render_template('upload.html')
توضیح کد
-
- فرم HTML: HTML
<form method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload"> </form>
- کد پایتون:
request.files
: این دیکشنری حاوی فایلهای آپلود شده است.file.filename
: نام فایل آپلود شده را برمیگرداند.file.save()
: فایل را در مسیر مشخص شده ذخیره میکند.
- فرم HTML:
نکات مهم
-
- امنیت:
- اعتبارسنجی فایل: قبل از ذخیره فایل، نوع فایل، اندازه فایل و پسوند آن را بررسی کنید تا از آپلود فایلهای مخرب جلوگیری شود.
- مسیر ذخیرهسازی: فایلها را در یک دایرکتوری امن و خارج از دایرکتوری ریشه وبسایت ذخیره کنید.
- کارایی:
- تغییر اندازه تصویر: اگر فایل آپلود شده یک تصویر است، میتوانید از کتابخانههایی مانند Pillow برای تغییر اندازه آن استفاده کنید.
- تجربه کاربری:
- پیامهای خطا: در صورت بروز خطا، پیامهای خطای واضح و آموزنده به کاربر نمایش دهید.
- نوار پیشرفت: برای آپلود فایلهای بزرگ، یک نوار پیشرفت نمایش دهید تا کاربر از پیشرفت آپلود آگاه باشد.
- امنیت:
کاربردهای آپلود فایل
-
- سیستمهای مدیریت محتوا: آپلود تصاویر، اسناد و سایر فایلها برای ایجاد محتوا.
- شبکههای اجتماعی: آپلود تصاویر، ویدئوها و سایر فایلهای رسانهای.
- فروشگاههای آنلاین: آپلود تصاویر محصولات.
- فرمهای تماس: آپلود فایلهای رزومه یا نمونه کار.
مثال پیشرفتهتر
from werkzeug.utils import secure_filename
from flask import Flask, request, render_template
# ...
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', ۱)[۱].lower() in ALLOWED_EXTENSIONS
@app.route('/', methods=['GET', 'POST'])
def upload_file():
# ...
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
# ...
در این مثال، از تابع secure_filename
برای امن کردن نام فایل و از ALLOWED_EXTENSIONS
برای محدود کردن انواع فایلهای مجاز استفاده شده است.
با استفاده از روتهای با آپلود فایل، میتوانید برنامههای وب کاربردی و تعاملی ایجاد کنید.
روتهای هدایت کننده (Redirect) در فلاسک: تغییر مسیر کاربران
درک مفهوم
روتهای هدایت کننده، روتهایی هستند که به جای نمایش محتوای خود، کاربر را به آدرس دیگری هدایت میکنند. این نوع روتها در بسیاری از سناریوها مفید هستند، مانند:
-
- تغییر ساختار آدرسها: وقتی آدرس یک صفحه تغییر میکند، میتوان از یک روت هدایت کننده برای هدایت کاربران قدیمی به آدرس جدید استفاده کرد.
- حذف صفحات: اگر میخواهید یک صفحه را حذف کنید، میتوانید یک روت هدایت کننده ایجاد کنید تا کاربران به یک صفحه مرتبط دیگر هدایت شوند.
- پارک دامنه: اگر چندین دامنه دارید، میتوانید از روتهای هدایت کننده برای هدایت همه ترافیک به یک دامنه اصلی استفاده کنید.
نحوه پیادهسازی
برای ایجاد یک روت هدایت کننده در فلاسک، از تابع redirect
استفاده میکنیم. این تابع یک پاسخ HTTP با کد وضعیت ۳۰۲ (Found) یا ۳۰۱ (Moved Permanently) ایجاد میکند و سرآیند Location
را به آدرس مقصد تنظیم میکند.
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/old-page')
def old_page():
return redirect(url_for('new_page'))
@app.route('/new-page')
def new_page():
return 'این صفحه جدید است'
در این مثال:
-
- روت
/old-page
کاربر را به روت/new-page
هدایت میکند. url_for('new_page')
آدرس کامل روتnew_page
را برمیگرداند.
- روت
انواع هدایت
-
- هدایت موقت (۳۰۲): برای هدایتهای موقت استفاده میشود.
- هدایت دائمی (۳۰۱): برای هدایتهای دائمی استفاده میشود و به موتورهای جستجو سیگنال میدهد که صفحه به طور دائم جابجا شده است.
from flask import redirect
return redirect('https://example.com', code=۳۰۱) # هدایت دائمی به یک دامنه خارجی
کاربردهای دیگر
-
- صفحههای ورود و ثبتنام: پس از موفقیتآمیز بودن ورود یا ثبتنام، کاربر میتواند به صفحه اصلی یا صفحه پروفایل هدایت شود.
- صفحات ۴۰۴: اگر کاربری به صفحهای که وجود ندارد، هدایت شود، میتوان آن را به صفحه اصلی یا صفحه خطای ۴۰۴ هدایت کرد.
نکات مهم
-
- کد وضعیت مناسب: انتخاب کد وضعیت مناسب (۳۰۱ یا ۳۰۲) برای سئو بسیار مهم است.
- پارامترها: میتوانید پارامترها را در URL هدایت قرار دهید.
- تابع
url_for
: این تابع برای ساخت آدرسهای URL به صورت دینامیک بسیار مفید است.
مثال پیشرفتهتر: هدایت با پارامتر
@app.route('/users/<int:user_id>')
def user_profile(user_id):
# ... کد برای بررسی وجود کاربر ...
if user_exists:
return redirect(url_for('profile', user_id=user_id))
else:
return 'کاربر یافت نشد', ۴۰۴
در این مثال، اگر کاربر وجود داشته باشد، به صفحه پروفایل کاربر هدایت میشود.
با استفاده از روتهای هدایت کننده، میتوانید تجربه کاربری بهتری را برای کاربران خود فراهم کنید و بهینه سازی موتورهای جستجو (SEO) را بهبود بخشید.
روتها با مدیریت خطا در فلاسک: برخورد با خطاهای پیشبینی نشده
درک مفهوم
در هر برنامه وب، ممکن است خطاهایی رخ دهد. فلاسک مکانیزمهایی را فراهم میکند تا بتوان خطاهای رخ داده در هنگام پردازش درخواستها را به صورت سفارشی مدیریت کرد. این کار به شما امکان میدهد تا به جای نمایش پیغامهای خطای پیشفرض، پیامهای خطای سفارشی و آموزندهتری را به کاربر ارائه دهید.
روشهای مدیریت خطا
۱. دکوراتور @app.errorhandler
این دکوراتور برای ثبت یک تابع به عنوان هندلر خطا برای یک نوع خطای خاص استفاده میشود.
from flask import Flask, abort
app = Flask(__name__)
@app.errorhandler(۴۰۴)
def page_not_found(error):
return 'صفحه مورد نظر یافت نشد', ۴۰۴
در این مثال، هر زمان که خطای ۴۰۴ (Not Found) رخ دهد، تابع page_not_found
فراخوانی میشود و پیام خطای سفارشی را نمایش میدهد.
۲. افزایش دادن استثناها
شما میتوانید استثناهای سفارشی ایجاد کرده و آنها را در کد خود افزایش دهید. سپس، یک هندلر خطا برای آن استثنا تعریف کنید.
from flask import Flask, abort
class InsufficientFunds(Exception):
pass
app = Flask(__name__)
@app.errorhandler(InsufficientFunds)
def handle_insufficient_funds(e):
return 'موجودی حساب شما کافی نیست', ۴۰۳
۳. استفاده از try-except
برای مدیریت خطاهای عمومیتر، میتوانید از بلوکهای try-except
استفاده کنید.
from flask import Flask
app = Flask(__name__)
@app.route('/users/<int:user_id>')
def get_user(user_id):
try:
# کد برای دریافت اطلاعات کاربر از پایگاه داده
except Exception as e:
return 'خطایی رخ داده است', ۵۰۰
مثال جامعتر
from flask import Flask, abort, jsonify
app = Flask(__name__)
@app.route('/products/<int:product_id>')
def get_product(product_id):
try:
# کد برای دریافت محصول از پایگاه داده
if not product:
abort(۴۰۴)
return jsonify({'product': product})
except Exception as e:
return jsonify({'error': 'خطایی در سرور رخ داده است'}), ۵۰۰
نکات مهم
-
- کدهای وضعیت HTTP: از کدهای وضعیت HTTP مناسب برای نشان دادن انواع مختلف خطا استفاده کنید.
- پیامهای خطای مفید: پیامهای خطا را به گونهای بنویسید که برای کاربر قابل فهم باشد و اطلاعات مفیدی در مورد علت خطا ارائه دهد.
- ثبت خطا: خطاها را در یک لاگ ثبت کنید تا بتوانید آنها را بررسی و رفع کنید.
- امنیت: در هنگام نمایش پیامهای خطا، اطلاعات حساس را افشا نکنید.
کاربردهای مدیریت خطا
-
- بهبود تجربه کاربری: ارائه پیامهای خطای واضح و مفید به کاربران
- دفع خطاها: شناسایی و رفع خطاهای برنامه
- امنیت: جلوگیری از افشای اطلاعات حساس در صورت رخ دادن خطا
با مدیریت صحیح خطاها، میتوانید برنامههای وب پایدارتر و قابل اعتمادتری ایجاد کنید.
نکات مهم در مورد روتها:
- ترتیب تعریف روتها: ترتیبی که روتها تعریف میشوند مهم است. Flask از اولین روتی که با درخواست مطابقت داشته باشد استفاده میکند.
- تبدیلکنندههای نوع: میتوانید برای پارامترهای روت، تبدیلکنندههای نوع تعریف کنید تا اطمینان حاصل کنید که داده ورودی از نوع صحیح است.
- روشهای HTTP: از دکوراتورهای
@app.route()
با روشهای HTTP مختلف مانندGET
,POST
,PUT
,DELETE
برای تعریف روتهای مختلف استفاده کنید.
در کل، روتها قلب تپنده هر برنامه Flask هستند و به شما امکان میدهند تا درخواستهای کاربران را مدیریت کرده و پاسخهای مناسب را ارائه دهید.