وباپلیکیشن یا برنامه تحتوب، نرمافزاری است که کاربران از طریق مرورگر و با کمک اینترنت یا شبکههای محلی از آن استفاده میکنند. برخلاف نرمافزارهای سنتی، این برنامهها به دانلود یا نصب روی سیستم کاربر نیاز ندارند و بهصورت خودکار بهروزرسانی میشوند. استفاده از یک پایگاه داده مشترک نیز نگهداری از آنها را سادهتر میکند. اگر تا امروز فقط اسکریپتها و الگوریتمهایی مینوشتید که در محیط ترمینال اجرا میشدند، ساخت وباپلیکیشن کوتاهترین مسیر برای تبدیل کدهای شما به محصولی واقعی است که میتوانید آن را در مرورگر با دیگران به اشتراک بگذارید.
سینتکس خوانا و مجموعه گسترده کتابخانههای پایتون امکان توسعه برنامههای تحتوب را با خطوط کد کمتری نسبت به سایر زبانها فراهم میکند. برای راهاندازی یک سرور پایه در این زبان تنها چند خط کد لازم است. پیش از کار با فریمورکهای وب، باید به مفاهیم و سینتکس پایه پایتون مسلط باشید؛ گذراندن یک دوره آموزش پایتون نقطه شروع مناسبی برای کسب این آمادگی است. پس از بررسی و مقایسه پلتفرمهای وب پایتون، از جمله Django و Flask، یک وباپلیکیشن پویا را گامبهگام با فلاسک کدنویسی و اجرا میکنیم.
چرا برای ساخت وباپلیکیشن با پایتون از فریمورک استفاده میکنیم؟
یکی از تصورات رایج میان برنامهنویسان تازهکار این است که برای ساخت یک برنامه تحتوب باید تمام بخشهای آن را از ابتدا کدنویسی کنند. «پلتفرمهای توسعه تحتوب» (Web Frameworks) مجموعهای از ماژولها و بستههای آماده هستند که زیرساختهای لازم را در اختیار شما میگذارند. دلایل اصلی استفاده از این فریمورکها عبارتاند از:
- پلتفرمهای وب جزئیات سطح پایین را پنهان میکنند. آنها تمام ارتباطات سطح پایین شبکه میان لایه برنامه کاربردی و لایههای زیرین را مدیریت میکنند تا بدون درگیر شدن با جزئیات فنی پروتکلها، روی منطق اصلی برنامه تمرکز کنید.
- این ابزارها حاصل کار هزاران توسعهدهنده هستند که قابلیتهای پرتکرار وب را از قبل پیادهسازی و تست کردهاند. استفاده از بستههای آماده در زمان صرفهجویی میکند و سرعت برنامهنویسی وب را، بهویژه هنگام ساخت الگوهای اولیه (Prototype) در زمان محدود، افزایش میدهد.
- جامعه بزرگی از برنامهنویسان بهطور مداوم از این پلتفرمها پشتیبانی میکنند و آنها را بهروزرسانی میکنند. به همین دلیل، فریمورکها مسائل امنیتی رایج را بهشکل پیشفرض مدیریت میکنند و ریسک آسیبپذیریهای ناشی از کدنویسی دستی از صفر را کاهش میدهند.
- برنامهای که از پایه و بهصورت دستی پیادهسازی میکنید، اغلب هنگام افزودن ویژگیهای جدید یا افزایش کاربران با مشکلات مقیاسپذیری روبهرو میشود. فریمورکهای پایتون مانند Django و Pyramid در مقیاسهای بزرگ آزموده شدهاند. شرکتهایی نظیر Instagram، Pinterest، Dropbox و Bitbucket از این ابزارها استفاده میکنند و سرویس Disqus با تکیه بر Django بیش از ۸ میلیارد بازدید صفحه و ۴۵ هزار درخواست (Request) در ثانیه را مدیریت میکند.
مقایسه Django و Flask؛ کدام فریمورک پایتون برای پروژه شما مناسب است؟
برای انتخاب پلتفرم مناسب جهت ساخت وباپلیکیشن با پایتون، ابتدا باید ابعاد و نیازمندیهای پروژه خود را مشخص کنید. فریمورکهای پایتون هرکدام برای سناریوهای متفاوتی طراحی شدهاند؛ مهمترین آنها را بررسی میکنیم.
فریمورک Django؛ پلتفرم کامل برای پروژههای متوسط تا بزرگ
Django یک فریمورک فولاستک (Full-stack) است که برای ساخت برنامههای کاربردی بزرگ و وبسایتهای محتوامحور طراحی شده است. جنگو تمام ابزارهای لازم را در یک پکیج یکپارچه ارائه میدهد. این فریمورک وظایفی مانند مدیریت پایگاه داده (ORM)، مسیریابی (Routing)، قالبسازی (Templating)، احراز هویت کاربران و پنل مدیریت (Admin Interface) را بهطور خودکار مدیریت میکند.

با وجود امکانات کامل بکاند، جنگو بهجز پنل ادمین، کامپوننت آمادهای برای رابط کاربری ندارد. اگر پروژه شما به فرانتاند تعاملی پیچیدهای نیاز دارد، باید در کنار جنگو از فریمورکهای جاوااسکریپت، مانند React یا Vue، استفاده کنید. اگر قصد دارید مستقیماً سراغ پیادهسازی سامانههای جامع و بزرگ بروید، مشاهده یک دوره آموزش Django یادگیری این ابزارها را برایتان آسانتر میکند.
میکروفریمورک Flask؛ سبک، منعطف و مناسب شروع
برخلاف جنگو، Flask یک «ریزپلتفرم» (Microframework) است که روی سادگی و کمحجم بودن تمرکز دارد. فلاسک هستهای پایه و سبک در اختیار شما میگذارد و ساختار یا ابزار اضافهای را به پروژه تحمیل نمیکند. میتوانید کتابخانهها و ماژولهای شخص ثالث را متناسب با نیاز پروژه به آن اضافه کنید.
همین سادگی باعث میشود یادگیری فلاسک برای افرادی که با مبانی پایتون آشنا هستند بسیار سرراست باشد. این فریمورک برای پروژههای کوچک تا متوسط، ساخت سرویسهای سبک، توسعه REST APIها و شروع یادگیری مفاهیم وب انتخابی کاربردی است. در فلاسک نیز برای ساخت رابطهای کاربری پویا و مدرن و آموزش فرانتاند، بخش رابط کاربری بهصورت مجزا با HTML/CSS یا کتابخانههای جاوااسکریپت نوشته میشود.
نگاهی به سایر پلتفرمهای وب پایتون (Pyramid، FastAPI و Reflex)
پایتون علاوه بر Django و Flask، ابزارهای تخصصی دیگری نیز برای پاسخ به نیازهای خاص دارد:

- Pyramid مانند جنگو برای پروژههای متوسط تا بزرگ طراحی شده است. توسعهدهندگان زمانی آن را انتخاب میکنند که احساس کنند جنگو مصرف حافظه و توان پردازشی بالایی به پروژه تحمیل میکند. Pyramid شما را به استفاده از یک راهکار یکپارچه مجبور نمیکند و تنها ویژگیهای ابتدایی مانند مسیریابی و احراز هویت را در اختیار میگذارد. سایر قابلیتها، مثل اتصال به دیتابیس، را فقط در صورت نیاز از طریق کتابخانههای خارجی اضافه میکنید.
- FastAPI فریمورکی مدرن است که بهطور ویژه برای ساخت REST APIهای پرسرعت، مستندسازی خودکار با OpenAPI و Swagger UI و اعتبارسنجی دادهها با Pydantic به کار میرود.
- Reflex یک پلتفرم فولاستک است که نیاز به یادگیری جاوااسکریپت را حذف میکند. در Reflex هم فرانتاند و هم بکاند را با کدهای پایتون خالص مینویسید و فریمورک در پشتصحنه این کدها را به کامپوننتهای React کامپایل میکند. این ابزار بیش از ۶۰ کامپوننت رابط کاربری آماده، از جمله دکمه، جدول، فرم و نمودار، و سیستم مدیریت وضعیت (State Management) مبتنی بر کلاسهای پایتون را در یک کدبیس واحد ارائه میدهد.
جدول زیر تفاوتهای اصلی این فریمورکها را از نظر نوع، زبان فرانتاند، کامپوننتهای آماده و کاربرد مقایسه میکند:
| معیار مقایسه | Django | Flask | Reflex |
|---|---|---|---|
| نوع فریمورک | فولاستک (Full-Stack) | میکروفریمورک (Microframework) | فولاستک پایتون خالص |
| زبان فرانتاند | نیازمند جاوااسکریپت مجزا (برای بخشهای تعاملی) | نیازمند جاوااسکریپت مجزا | پایتون خالص (کامپایلشده به React) |
| کامپوننتهای UI آماده | فقط پنل ادمین | ندارد | بیش از ۶۰ کامپوننت آماده |
| کاربرد اصلی | وبسایتهای محتوامحور و پروژههای بزرگ سنتی | پروژههای کوچک تا متوسط، میکروسرویسها و APIهای سبک | ساخت برنامههای فولاستک و پنلهای داخلی بدون نوشتن JS |
پیشنیازهای برنامهنویسی وب با پایتون
پیش از کدنویسی وباپلیکیشن با Flask، باید ابزارها و دانش پایه زیر را فراهم کنید تا در درک کدها دچار ابهام نشوید:
- مفسر پایتون نسخه ۳ و ابزار مدیریت بسته pip باید روی سیستمعامل شما نصب و فعال باشد.
- برای نوشتن منطق برنامه و مدیریت دادهها، باید با مفاهیم پایه زبان برنامه نویسی پایتون آشنا باشید. این مفاهیم شامل متغیرها، انواع دادهها مانند لیست، دیکشنری در پایتون و تاپل، دستورات شرطی و حلقهها، تعریف توابع، مفاهیم شیءگرایی شامل کلاسها و ماژولها و مدیریت خطاها (Exception Handling) است.
- درک ارتباط کلاینت و سرور ضروری است. باید با نحوه کار وبسرورها، ارسال درخواست (Request) از مرورگر و دریافت پاسخ (Response) از سرور از طریق پروتکل HTTP آشنایی مقدماتی داشته باشید.
- چون مرورگر خروجی نهایی برنامه را نمایش میدهد، برای قالببندی صفحات به شناخت تگهای HTML و اصول پایه استایلدهی با CSS نیاز دارید. این مباحث بخش ابتدایی هر آموزش طراحی وب سایت هستند.
آموزش گامبهگام ساخت وباپلیکیشن با پایتون و Flask
یک وباپلیکیشن پایه را با میکروفریمورک Flask میسازیم، ورودیهای کاربر را از آدرس صفحه دریافت میکنیم و خروجی برنامه را به قالبهای HTML متصل میکنیم.
مرحله اول: ساخت محیط مجازی و نصب Flask
ابتدا یک محیط مجازی (Virtual Environment) بسازید و آن را فعال کنید تا نسخههای پکیجهای پروژه با نصب اصلی پایتون روی سیستم تداخل نداشته باشند. ترمینال را در پوشه پروژه خود باز کنید و دستورات زیر را اجرا کنید:

python -m venv env
source env/bin/activate
در سیستمعامل ویندوز، برای فعالسازی محیط مجازی از دستور env\Scripts\activate استفاده کنید.
اضافه شدن پیشوند (env) به ابتدای خط فرمان ترمینال نشان میدهد که محیط مجازی فعال است. حالا فلاسک را با pip نصب کنید. در لینوکس یا مک، در صورت نیاز از pip3 استفاده کنید:
pip install flask
برای اطمینان از درستی نصب، دستور زیر را در ترمینال اجرا کنید:
python -c "import flask; print(flask.__version__)"
گزینه -c اجازه میدهد یک تکه کد پایتون را مستقیماً از خط فرمان اجرا کنید. این دستور پکیج flask را با استفاده از دستور import در پایتون فراخوانی میکند و نسخه نصبشده آن را در خروجی چاپ میکند. اگر شمارهای مانند ۱.۱.۲ یا نسخههای جدیدتر بدون خطا نمایش داده شود، نصب با موفقیت انجام شده است.
مرحله دوم: نوشتن اولین برنامه پایه (Hello World) و راهاندازی سرور
در پوشه پروژه خود یک فایل پایتون به نام hello.py بسازید و کدهای زیر را در آن قرار دهید:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
توضیح خطبهخط کد:
- from flask import Flask: کلاس Flask را از پکیج فلاسک وارد برنامه میکند.
- app = Flask(__name__): یک نمونه (Instance) از کلاس Flask میسازد تا اپلیکیشن شما در متغیر app ذخیره شود. متغیر توکار __name__ نام ماژول فعلی را به فلاسک میدهد تا مسیر فایلهای پروژه را بشناسد.
- @app.route(‘/’): این خط بر پایه مفهوم دکوراتور در پایتون کار میکند و تابع معمولی پایتون را به یک «تابع نمای فلاسک» (View Function) تبدیل میکند. علامت ‘/’ مشخص میکند که هرگاه کاربر به آدرس اصلی سایت مراجعه کند، تابع زیر این دکوراتور اجرا شود.
- def hello() و return: تابع منطق صفحه را تعریف میکند و رشته ‘Hello, World!’ را بهعنوان پاسخ HTTP به مرورگر برمیگرداند.
برای اجرای برنامه دو روش وجود دارد:
روش اول: استفاده از متغیرهای محیطی و دستور flask run
در ترمینال، در حالی که محیط مجازی فعال است، متغیر محیطی FLASK_APP را تنظیم کنید تا فلاسک بداند کدام فایل را اجرا کند. با FLASK_ENV نیز حالت توسعه را فعال کنید:
export FLASK_APP=hello
export FLASK_ENV=development
flask run
پس از اجرای دستور flask run، خروجی زیر را در ترمینال میبینید:
* Serving Flask app "hello" (lazy loading)
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 813-894-335
عبارت Debug mode: on نشان میدهد که اشکالزدا (Debugger) فعال است و در صورت بروز خطا، جزئیات دقیق آن را به شما نشان میدهد. آدرس http://۱۲۷.۰.۰.۱:۵۰۰۰/ نیز مشخص میکند که سرور روی لوکالهاست دستگاه شما و در پورت ۵۰۰۰ اجرا میشود.
روش دوم: اجرای مستقیم اسکریپت با مفسر پایتون
اگر نخواهید هر بار متغیرهای محیطی را در ترمینال تنظیم کنید، میتوانید دو خط زیر را به انتهای فایل hello.py اضافه کنید:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
بلوک شرطی if __name__ == ‘__main__’: بررسی میکند که آیا فایل بهصورت مستقیم اجرا شده است یا بهعنوان یک ماژول ایمپورتشده. در صورت اجرای مستقیم، متد app.run() سرور محلی را راهاندازی میکند. در این روش کافی است فایل را با دستور python hello.py اجرا کنید.
حالا مرورگر خود را باز کنید و آدرس http://۱۲۷.۰.۰.۱:۵۰۰۰/ یا localhost:۵۰۰۰ را وارد کنید تا عبارت Hello, World! را ببینید. برای توقف سرور نیز میتوانید در ترمینال کلیدهای CTRL+C را فشار دهید.
مرحله سوم: مسیریابی (Routing) و دریافت ورودی از کاربر در URL
یک وباپلیکیشن واقعی علاوه بر نمایش صفحه ایستا، مسیرهای مختلفی را مدیریت میکند و از کاربر ورودی میگیرد. برای افزودن مسیری جدید، مثلاً /test، به برنامه قبلی، کافی است تابع دیگری با دکوراتور جدید به فایل اضافه کنید. کد کامل به شکل زیر میشود:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
@app.route('/test')
def testing():
return 'test'
if __name__ == '__main__':
app.run()
با این کد، مراجعه به آدرس localhost:۵۰۰۰/test متن test را نمایش میدهد.
دریافت پارامتر متنی از URL:
برای اینکه برنامه بر اساس ورودی کاربر در آدرس مرورگر پاسخی پویا تولید کند، نام متغیر را داخل علامتهای < > در مسیر قرار دهید. سپس همان نام را بهعنوان آرگومان به تابع بدهید:
from flask import Flask
app = Flask(__name__)
@app.route('/hello/<name>')
def hello_name(name):
return 'Hello ' + name + '!'
if __name__ == '__main__':
app.run()
اگر کاربر آدرس localhost:۵۰۰۰/hello/Ali را در مرورگر وارد کند، خروجی صفحه Hello Ali! خواهد بود.
دریافت ورودی عددی و تعیین نوع داده:
فلاسک بهطور پیشفرض ورودیهای URL را رشته (String) در نظر میگیرد. اگر بخواهید ورودی حتماً عدد صحیح باشد تا روی آن عملیات ریاضی انجام دهید، میتوانید نوع داده را با int: مشخص کنید:
from flask import Flask
app = Flask(__name__)
@app.route('/square/<int:num>')
def f(num):
# نیازی به تبدیل نوع داده num نیست، چون فلاسک آن را به عدد صحیح تبدیل کرده است
return str(num 2)
if __name__ == '__main__':
app.run()
در این مثال، باز کردن آدرس localhost:۵۰۰۰/square/۴ عدد ۱۶ را پس از تبدیل مجدد نتیجه به رشته با تبدیل داده str در پایتون برای نمایش در خروجی، روی صفحه مرورگر چاپ میکند.
مرحله چهارم: اتصال پایتون به صفحات HTML با موتور قالب Jinja2
برای نمایش صفحات وب استاندارد باید از تگهای HTML استفاده کنیم. یک راه اولیه این است که تگها را مستقیماً داخل دستور return تابع بنویسیم؛ مانند return ‘<h1>Hello</h1>’. این روش برای پروژههای واقعی و صفحات بزرگ منطقی نیست و نگهداری از آن دشوار است.

راهحل استاندارد فلاسک، استفاده از موتور قالب (Template Engine) پیشفرض آن، یعنی Jinja2، و تابع کمکی render_template() است. با این ابزار فایلهای HTML را جداگانه مینویسید و متغیرها و دستورات پایتون را به آنها میفرستید.
۱. ساخت پوشه قالبها (الزامی):
تابع render_template بهصورت پیشفرض در دایرکتوری اصلی پروژه بهدنبال پوشهای دقیقاً با نام templates میگردد. اگر این پوشه وجود نداشته باشد یا فایل HTML را بیرون از آن قرار دهید، فلاسک با خطا مواجه میشود. پس ابتدا پوشهای به نام templates در کنار فایل پایتون خود بسازید.
۲. ارسال متغیر از پایتون به HTML:
فایل پایتون خود، مثلاً app.py، را به شکل زیر ویرایش کنید تا تابع render_template نیز ایمپورت شود:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/<name>')
def show(name):
return render_template('app.html', myname=name)
if __name__ == '__main__':
app.run()
اولین آرگومان تابع render_template نام فایل قالب، یعنی app.html، است. آرگومان دوم، myname=name، مقدار دریافتی از URL را در متغیری به نام myname قرار میدهد و به فایل HTML میفرستد.
۳. نمایش متغیر و نوشتن شرط در فایل HTML:
داخل پوشه templates فایلی به نام app.html بسازید. موتور قالب Jinja2 برای نمایش مقدار یک متغیر از دو آکولاد باز و بسته {{ }} استفاده میکند:
<h1>Hello {{ myname }}</h1>
Jinja2 همچنین اجازه میدهد دستورات شرطی پایتون را با ساختار {% %} مستقیماً داخل HTML بنویسید. کد فایل app.html را به شکل زیر تغییر دهید تا بر اساس نام واردشده، پیام متفاوتی نمایش دهد:
{% if myname == 'arastoo' %}
<h1>Welcome {{ myname }}</h1>
{% else %}
<h1>{{ myname }} you are not admin</h1>
{% endif %}
در پروژههای واقعی، کنترلهای امنیتی و بررسی دسترسی مدیر باید در سمت بکاند و داخل تابع پایتون انجام شود؛ این مثال نحوه اجرای دستورات شرطی در قالب Jinja2 را نشان میدهد.
با اجرای برنامه و رفتن به آدرس localhost:۵۰۰۰/arastoo پیام خوشآمدگویی مدیر را میبینید. اگر هر نام دیگری را در URL وارد کنید، برنامه پیام عدم دسترسی را نمایش میدهد.
گامهای بعدی برای توسعه وباپلیکیشنهای حرفهای در پایتون
پس از اجرای اولین برنامه روی لوکالهاست و آشنایی با مسیریابی و قالبهای HTML، باید سه بخش زیر را یاد بگیرید تا پروژه خود را به یک وباپلیکیشن کامل و آماده بهرهبرداری در محیط واقعی (Production) تبدیل کنید:
- برای ذخیرهسازی دائمی اطلاعات کاربران و محتوای سایت، باید با کمک آموزش پایگاه داده برنامه خود را به یک پایگاه داده (Database) متصل کنید. در پایتون، بسته به ساختار دادههایتان، میتوانید از پایگاههای داده رابطهای و SQL مانند PostgreSQL، MySQL و SQLite یا پایگاههای داده غیررابطهای و NoSQL مانند MongoDB استفاده کنید.
- امنیت و احراز هویت (Authentication & Security) برای مدیریت ورود کاربران و حفاظت از دادهها لازم است. باید مفاهیمی مانند احراز هویت با توکنهای JWT و پروتکل OAuth، هش کردن رمزهای عبور با کتابخانه Bcrypt، کنترل دسترسی مبتنی بر نقش (RBAC) و ایمنسازی فرمها در برابر حملات CSRF را به برنامه اضافه کنید.
- در مرحله آخر، برای کانتینرسازی و استقرار (Deployment) و دسترسی عموم به وباپلیکیشن از طریق اینترنت، باید آن را از سیستم شخصی به یک سرور منتقل کنید. بستهبندی برنامه و وابستگیهای آن در کانتینرهای Docker (و مدیریت مقیاسپذیری آنها با Kubernetes) و سپس استقرار روی سرورها و پلتفرمهای ابری مانند AWS، Azure، Google Cloud یا Render، گام پایانی این مسیر است.