اگر یک پروژه Django را روی لپتاپ خودت اجرا کرده باشی، احتمالاً همیشه برای دیدن آن آدرسی مثل زیر را در مرورگر باز میکنی:
http://127.0.0.1:8000یا:
http://localhost:8000اما فرض کن در دانشگاه، شرکت، کلاس یا حتی یک جمع دوستانه هستی و میخواهی شخص دیگری با موبایل یا لپتاپ خودش سایت Django تو را ببیند.
مثلاً پروژه روی لپتاپ تو اجرا شده و دوستت میخواهد با گوشی خودش وارد آن شود.
لازم نیست پروژه را روی هاست یا سرور اینترنتی آپلود کنی. اگر هر دو دستگاه به یک شبکه محلی متصل باشند، میتوانی پروژه Django را مستقیماً از لپتاپ خودت در اختیار دستگاههای دیگر همان شبکه قرار بدهی.
در این آموزش میبینیم چطور:
- IP محلی لپتاپ را پیدا کنیم.
- دستگاهها را روی یک شبکه قرار دهیم.
- IP را به
ALLOWED_HOSTSاضافه کنیم. - Django را روی
0.0.0.0اجرا کنیم. - سایت را از موبایل یا لپتاپ دیگری باز کنیم.
- مشکلات رایج مثل Firewall را برطرف کنیم.
ایده اصلی این کار چیست؟
بهصورت معمول وقتی دستور زیر را اجرا میکنی:
python manage.py runserver
سرور توسعه Django بهصورت پیشفرض روی آدرس 127.0.0.1 و پورت 8000 اجرا میشود.
مشکل اینجاست که 127.0.0.1 یا localhost فقط از همان دستگاه قابل دسترسی است. طبق مستندات Django، برای اینکه development server از دستگاههای دیگر شبکه قابل مشاهده باشد، میتوان آن را روی IP شبکه یا آدرس 0.0.0.0 اجرا کرد.
ما در این مقاله Django را اینطور اجرا میکنیم:
python manage.py runserver 0.0.0.0:8000
با این کار Django روی تمام رابطهای شبکه IPv4 لپتاپ منتظر اتصال میماند.
اما یک نکته بسیار مهم وجود دارد:
نباید 0.0.0.0:8000 را داخل مرورگر گوشی وارد کنیم.
دستگاههای دیگر باید IP محلی لپتاپ ما را وارد کنند.
مثلاً اگر IP لپتاپ این باشد:
192.168.1.20
آدرس سایت برای بقیه دستگاهها میشود:
http://192.168.1.20:8000در ادامه تمام مراحل را انجام میدهیم.
مرحله اول: همه دستگاهها باید به یک شبکه متصل باشند
اولین شرط این است که لپتاپی که Django روی آن اجرا میشود و دستگاهی که قرار است سایت را باز کند، داخل یک شبکه باشند.
مثلاً:
در حال بارگذاری تصویر...

هر سه دستگاه به یک Wi-Fi متصل هستند.
لزومی ندارد اینترنت داشته باشید. چیزی که برای ما اهمیت دارد این است که دستگاهها بتوانند در Local Network یا LAN با یکدیگر ارتباط برقرار کنند.
یک نکته درباره Guest Wi-Fi
بعضی مودمها در شبکه Guest قابلیتی به نامهایی مثل:
AP Isolation
Client Isolation
Wireless Isolation
دارند.
در این حالت ممکن است دو دستگاه با اینکه به یک Wi-Fi متصلاند، اجازه ارتباط مستقیم با یکدیگر را نداشته باشند.
پس اگر مراحل مقاله را درست انجام دادی ولی دستگاه دیگر همچنان نمیتواند به لپتاپ وصل شود، تنظیمات مودم یا Guest Network را هم بررسی کن.
مرحله دوم: پیدا کردن IP محلی لپتاپ
حالا باید IP لپتاپی را پیدا کنیم که پروژه Django روی آن اجرا میشود.
IP موردنظر ما Public IP اینترنت نیست. دنبال IP داخل شبکه یا همان Private/Local IP هستیم.
این IP معمولاً شکلی شبیه این دارد:
192.168.1.20
یا:
192.168.0.15
گاهی هم ممکن است مثلاً به این شکل باشد:
10.0.0.12
روش پیدا کردن آن در هر سیستمعامل کمی متفاوت است.
پیدا کردن IP محلی در Windows
در ویندوز میتوانیم خیلی سریع از دستور ipconfig استفاده کنیم.
Command Prompt، PowerShell یا Windows Terminal را باز کن و دستور زیر را اجرا کن:
ipconfig
مایکروسافت نیز ipconfig را ابزاری برای نمایش تنظیمات فعلی TCP/IP از جمله IPv4 معرفی میکند.
خروجی ممکن است چیزی شبیه این باشد:
Wireless LAN adapter Wi-Fi:IPv4 Address. . . . . . . . . . . : 192.168.1.20Subnet Mask . . . . . . . . . . . : 255.255.255.0Default Gateway . . . . . . . . . : 192.168.1.1
اگر از Wi-Fi استفاده میکنی، قسمت مربوط به:
Wireless LAN adapter Wi-Fi
را پیدا کن.
مقدار روبهروی:
IPv4 Address
همان IP موردنیاز ما است.
در این مثال:
192.168.1.20
IP لپتاپ ما است.
ممکن است چند Network Adapter در خروجی وجود داشته باشد. بنابراین IP مربوط به اتصال فعالی را انتخاب کن که دستگاه دیگر نیز از طریق همان شبکه قرار است به تو متصل شود.
پیدا کردن IP محلی در macOS
در macOS سادهترین روش گرافیکی این است که وارد:
System Settings→ Network→ Wi-Fi→ Details→ TCP/IP
شوی.
در این قسمت IPv4 Address سیستم نمایش داده میشود. مستندات Apple نیز مسیر Network و بخش TCP/IP را برای مشاهده و مدیریت IPv4 توضیح میدهد.
اگر Terminal را ترجیح میدهی، روی بسیاری از MacBookها میتوانی از دستور زیر استفاده کنی:
ipconfig getifaddr en0
برای مثال خروجی ممکن است فقط این باشد:
192.168.1.20
در بعضی سیستمها نام Interface میتواند متفاوت باشد. اگر دستور بالا خروجی نداشت، میتوانی تنظیمات Network را بررسی کنی یا ابتدا Interface فعال سیستم را پیدا کنی.
پیدا کردن IP محلی در Linux
در بیشتر توزیعهای جدید لینوکس میتوانیم از دستور ip استفاده کنیم:
ip addr
دنبال Interface فعال شبکه بگرد.
برای Wi-Fi ممکن است نام Interface چیزی شبیه این باشد:
wlan0
یا:
wlp2s0
و برای Ethernet ممکن است چیزی شبیه این ببینی:
eth0
یا:
enp3s0
در قسمت مربوط به Interface فعال، خط inet را پیدا کن:
inet 192.168.1.20/24
در این مثال IP سیستم ما برابر است با:
192.168.1.20
دستور ip address بخشی از ابزارهای استاندارد iproute2 برای مشاهده و مدیریت آدرسهای شبکه در لینوکس است.
اگر میخواهی خروجی جمعوجورتری ببینی، میتوانی بنویسی:
ip -4 addr
گزینه -4 باعث میشود فقط اطلاعات IPv4 نمایش داده شوند.
تا اینجا چه چیزی داریم؟
فرض کنیم IP لپتاپ ما در شبکه این است:
192.168.1.20
پروژه Django هم قرار است روی پورت:
8000
اجرا شود.
در نتیجه آدرس نهایی سایت برای دستگاههای دیگر قرار است این باشد:
http://192.168.1.20:8000اما هنوز دو کار مهم باقی مانده است:
- اضافه کردن IP به
ALLOWED_HOSTS - اجرای Django روی
0.0.0.0
مرحله سوم: اضافه کردن IP به ALLOWED_HOSTS
قبل از اجرای پروژه، فایل:
settings.py
را باز کن.
احتمالاً تنظیمی شبیه این داری:
ALLOWED_HOSTS = []IP محلی لپتاپت را به آن اضافه کن:
ALLOWED_HOSTS = [
"192.168.1.20",
]اگر میخواهی همچنان با localhost و 127.0.0.1 هم پروژه را باز کنی، میتوانی بنویسی:
ALLOWED_HOSTS = [
"localhost",
"127.0.0.1",
"192.168.1.20",
]طبق مستندات Django، ALLOWED_HOSTS مشخص میکند سایت اجازه پاسخگویی به چه Hostهایی را دارد. اگر Host درخواست با مقادیر مجاز تطبیق نداشته باشد، Django درخواست را رد میکند.
پورت را داخل ALLOWED_HOSTS ننویس
این اشتباه است:
ALLOWED_HOSTS = [
"192.168.1.20:8000",
]حالت صحیح:
ALLOWED_HOSTS = [
"192.168.1.20",
]ALLOWED_HOSTS برای Host است و پورت جزو مقداری نیست که باید اینجا قرار بدهیم؛ مستندات Django نیز توضیح میدهد تطبیق Host بدون در نظر گرفتن Port انجام میشود.
آیا میتوانیم از ستاره استفاده کنیم؟
از نظر فنی میتوان چنین کاری انجام داد:
ALLOWED_HOSTS = ["*"]اما برای این آموزش نیازی به باز کردن تمام Hostها نداریم.
بهتر است همان IP مشخص شبکه را وارد کنیم:
ALLOWED_HOSTS = [
"192.168.1.20",
]مستندات Django تأکید میکند که استفاده از * تمام Hostها را قبول میکند و در آن حالت مسئولیت اعتبارسنجی Host بر عهده برنامه خواهد بود.
پس برای یک تست ساده داخل شبکه، استفاده از IP مشخص انتخاب بهتری است.
مرحله چهارم: اجرای Django روی 0.0.0.0
اگر Django را بهشکل معمول اجرا کنیم:
python manage.py runserver
سرور بهصورت پیشفرض روی:
127.0.0.1:8000بالا میآید.
127.0.0.1 فقط روی دستگاه خودمان قابل دسترسی است.
برای اینکه دستگاههای دیگر شبکه هم بتوانند به سرور وصل شوند، دستور را اینطور اجرا میکنیم:
python manage.py runserver 0.0.0.0:8000
اگر همهچیز درست باشد، خروجیای شبیه این خواهی دید:
Starting development server at http://0.0.0.0:8000/Django بهصورت رسمی نیز استفاده از 0.0.0.0 را یکی از روشهای در دسترس قرار دادن development server برای دستگاههای دیگر شبکه معرفی میکند.
0.0.0.0 دقیقاً یعنی چه؟
در اینجا 0.0.0.0 تقریباً یعنی:
روی تمام Interfaceهای IPv4 این سیستم منتظر اتصال باش.
برای همین درخواستهایی که از طریق IP وایفای لپتاپ به پورت 8000 میرسند، توسط Django دریافت میشوند.
این موضوع را با آدرس سایت اشتباه نکن.
اگر IP لپتاپ:
192.168.1.20
باشد، شخص دیگر نباید این را بزند:
http://0.0.0.0:8000بلکه باید این آدرس را وارد کند:
http://192.168.1.20:8000مرحله پنجم: سایت را از دستگاه دیگر باز کنید
حالا سرور Django روی لپتاپ اصلی اجرا شده است.
فرض کنیم:
IP = 192.168.1.20Port = 8000
در موبایل یا لپتاپ دیگری که به همان Wi-Fi متصل است، مرورگر را باز کن و بنویس:
http://192.168.1.20:8000اگر تنظیمات درست باشند، سایت Django تو باز میشود.
حالا در واقع این اتفاق افتاده است:
موبایل|| درخواست HTTP↓192.168.1.20:8000|↓لپتاپ شما|↓Django Development Server|↓سایت
مهم نیست دستگاه دوم Android، iPhone، Windows، Linux یا macOS باشد. تا زمانی که مرورگر داشته باشد و بتواند در شبکه به لپتاپ تو دسترسی پیدا کند، میتواند سایت را باز کند.
یک مثال کامل
فرض کنیم یک پروژه Django داری و IP لپتاپت را پیدا کردهای:
192.168.1.35
قدم اول: settings.py
داخل settings.py مینویسی:
ALLOWED_HOSTS = [
"localhost",
"127.0.0.1",
"192.168.1.35",
]قدم دوم: اجرای سرور
در پوشه پروژه اجرا میکنی:
python manage.py runserver 0.0.0.0:8000
قدم سوم: اتصال موبایل
موبایل را به همان Wi-Fi متصل میکنی و در مرورگر مینویسی:
http://192.168.1.35:8000تمام!
پروژهای که روی لپتاپ تو اجرا میشود حالا از طریق موبایل قابل مشاهده است.
آیا میتوانیم پورت دیگری انتخاب کنیم؟
بله.
مجبور نیستی از 8000 استفاده کنی.
مثلاً اگر بخواهی پروژه روی پورت 5000 اجرا شود:
python manage.py runserver 0.0.0.0:5000
در این حالت دستگاههای دیگر باید وارد این آدرس شوند:
http://192.168.1.20:5000یا مثلاً برای پورت 8080:
python manage.py runserver 0.0.0.0:8080
و آدرس مرورگر میشود:
http://192.168.1.20:8080پس فرمول ساده است:
http://LOCAL_IP:PORTبرای مثال:
http://192.168.1.20:8000اگر سایت باز نشد چه کار کنیم؟
اگر تمام مراحل را انجام دادی ولی روی گوشی یا لپتاپ دیگر سایت باز نشد، چند مورد را بررسی کن.
1. مطمئن شو هر دو دستگاه روی یک شبکه هستند
برای مثال نباید لپتاپ به Wi-Fi خانه وصل باشد ولی گوشی از اینترنت سیمکارت استفاده کند.
Wi-Fi گوشی را بررسی کن و مطمئن شو همان شبکه لپتاپ است.
2. مطمئن شو IP را درست انتخاب کردهای
بعضی سیستمها چند IP مختلف دارند.
مثلاً ممکن است خروجی شامل Adapterهای مربوط به:
- Wi-Fi
- Ethernet
- Docker
- VPN
- ماشین مجازی
- WSL
باشد.
IP مربوط به شبکهای را انتخاب کن که دستگاه دیگر هم به آن متصل است.
3. ALLOWED_HOSTS را بررسی کن
اگر IP لپتاپ:
192.168.1.20
است، باید چیزی شبیه این داشته باشی:
ALLOWED_HOSTS = [
"192.168.1.20",
]نه:
ALLOWED_HOSTS = [
"192.168.1.20:8000",
]4. مطمئن شو Django روی 0.0.0.0 اجرا شده
این:
python manage.py runserver
برای هدف ما کافی نیست.
از این استفاده کن:
python manage.py runserver 0.0.0.0:8000
Django نیز در مستنداتش توضیح میدهد 127.0.0.1 پیشفرض از سیستمهای دیگر شبکه قابل دسترسی نیست.
مشکل Firewall
یکی از رایجترین دلایلی که باعث میشود سایت روی لپتاپ خودت باز شود ولی روی موبایل باز نشود، Firewall است.
سیستمعامل ممکن است اتصال ورودی به Python یا پورت 8000 را مسدود کرده باشد.
Firewall در Windows
وقتی برای اولین بار Python شروع به دریافت اتصال شبکه کند، ممکن است Windows Defender Firewall پنجرهای نمایش دهد و از تو بپرسد آیا اجازه دسترسی داده شود یا نه.
اگر روی شبکه قابل اعتماد هستی، دسترسی Python را برای Private Networks مجاز کن.
اگر قبلاً آن را Block کردهای، تنظیمات Windows Firewall را بررسی کن و مطمئن شو Python یا پورت موردنظر اجازه اتصال ورودی دارد.
Firewall در Linux
اگر از ufw استفاده میکنی، وضعیتش را بررسی کن:
sudo ufw status
اگر فعال است و پورت 8000 مسدود شده، برای یک شبکه قابل اعتماد میتوانی اجازه دسترسی به این پورت بدهی:
sudo ufw allow 8000/tcp
بعد از پایان تست و در صورتی که دیگر به Rule نیاز نداری، میتوانی آن را حذف کنی.
Firewall در macOS
اگر Firewall سیستم فعال است و اتصال مسدود میشود، بخش Firewall در تنظیمات macOS را بررسی کن و در صورت نیاز اجازه دریافت اتصال شبکه را به Python یا Terminal مربوطه بده.
یک روش ساده برای پیدا کردن محل مشکل
اگر سایت روی دستگاه دیگر باز نمیشود، مشکل را مرحلهبهمرحله پیدا کن.
اول روی خود لپتاپ میزبان باز کن:
http://127.0.0.1:8000اگر باز شد، یعنی خود Django به احتمال زیاد درست اجرا شده است.
بعد روی همان لپتاپ امتحان کن:
http://192.168.1.20:8000اگر این هم باز شد، یعنی Django روی Interface شبکه پاسخ میدهد.
حالا همین آدرس را روی موبایل باز کن:
http://192.168.1.20:8000اگر فقط مرحله آخر کار نکرد، احتمالاً مشکل مربوط به یکی از این موارد است:
FirewallNetwork Isolationاشتباه بودن شبکهاشتباه بودن IP
این روش خیلی سریع مشخص میکند مشکل مربوط به Django است یا شبکه.
اگر IP لپتاپ تغییر کرد چه میشود؟
در بیشتر شبکههای خانگی IP دستگاهها توسط DHCP تعیین میشود.
در نتیجه ممکن است امروز IP لپتاپ تو این باشد:
192.168.1.20
ولی بعد از reconnect شدن به Wi-Fi یا راهاندازی دوباره مودم تبدیل شود به:
192.168.1.24
در این شرایط باید آدرس جدید را پیدا کنی.
سپس در صورت نیاز ALLOWED_HOSTS را هم تغییر بدهی:
ALLOWED_HOSTS = [
"192.168.1.24",
]و دستگاه دیگر نیز باید وارد آدرس جدید شود:
http://192.168.1.24:8000پس اگر روشی که قبلاً کار میکرد ناگهان از کار افتاد، یکی از اولین چیزهایی که باید بررسی کنی Local IP لپتاپ است.
چرا localhost روی موبایل کار نمیکند؟
این یکی از نکاتی است که ممکن است در ابتدا کمی گیجکننده باشد.
فرض کن روی لپتاپ سایت در این آدرس باز میشود:
http://localhost:8000اگر همین آدرس را روی موبایل وارد کنی، موبایل دنبال پورت 8000 روی خود موبایل میگردد.
localhost همیشه به همان دستگاهی اشاره میکند که درخواست از روی آن اجرا شده است.
بنابراین:
روی لپتاپ:
localhost = لپتاپروی موبایل:
localhost = موبایلبه همین دلیل باید روی موبایل IP لپتاپ را وارد کنیم:
http://192.168.1.20:8000نه:
http://localhost:8000تفاوت 127.0.0.1، 0.0.0.0 و IP شبکه
برای اینکه موضوع کاملاً روشن شود، این سه آدرس را از هم جدا کنیم.
127.0.0.1
آدرس Loopback سیستم است.
127.0.0.1
فقط همان سیستم میتواند از طریق آن به خودش دسترسی داشته باشد.
مثلاً:
http://127.0.0.1:80000.0.0.0
هنگام اجرای سرور از آن استفاده میکنیم:
python manage.py runserver 0.0.0.0:8000
یعنی Django روی Interfaceهای شبکه IPv4 برای اتصال آماده باشد.
معمولاً قرار نیست 0.0.0.0 را به کاربر دیگری بدهیم.
192.168.x.x یا IP شبکه
این همان IP واقعی لپتاپ داخل شبکه محلی است.
مثلاً:
192.168.1.20
همین آدرس را دستگاه دیگر استفاده میکند:
http://192.168.1.20:8000پس بهصورت خلاصه:
آدرسکاربرد
127.0.0.1دسترسی فقط از همان سیستم
0.0.0.0Bind کردن سرور روی Interfaceهای شبکه
192.168.1.20آدرسی که دستگاه دیگر برای اتصال استفاده میکند
آیا این روش برای Production مناسب است؟
خیر.
روشی که در این مقاله استفاده کردیم برای کارهایی مثل:
- تست پروژه
- نمایش پروژه به دوست یا همکار
- بررسی سایت روی موبایل واقعی
- تست Responsive بودن سایت
- پروژههای کلاسی
- دمو در یک شبکه محلی
- توسعه و Debug
بسیار کاربردی است.
اما Django صراحتاً تأکید میکند development server مربوط به runserver برای Production طراحی نشده و نباید بهعنوان وبسرور نهایی سایت استفاده شود.
همچنین اگر DEBUG=True باشد، اطلاعات خطا و جزئیات محیط توسعه میتوانند در صفحات Debug نمایش داده شوند؛ بنابراین چنین محیطی را روی شبکههای ناشناس یا در دسترس اینترنت قرار نده. مستندات Django نیز درباره نمایش اطلاعات محیط در حالت Debug هشدار میدهد.
بهتر است این روش را فقط روی شبکهای که به آن اعتماد داری استفاده کنی.
خلاصه مراحل
برای اینکه شخص دیگری در همان Wi-Fi بتواند سایت Django اجراشده روی لپتاپ تو را باز کند، کافی است این مراحل را انجام دهی:
1. هر دو دستگاه را به یک شبکه متصل کن.
2. IP محلی لپتاپ را پیدا کن.
Windows:
ipconfig
Linux:
ip -4 addr
macOS:
ipconfig getifaddr en0
فرض کنیم IP این شد:
192.168.1.20
3. IP را به ALLOWED_HOSTS اضافه کن.
ALLOWED_HOSTS = [
"localhost",
"127.0.0.1",
"192.168.1.20",
]4. Django را روی 0.0.0.0 اجرا کن.
python manage.py runserver 0.0.0.0:8000
5. روی دستگاه دیگر این آدرس را باز کن.
http://192.168.1.20:8000اگر باز نشد، Firewall، شبکه Wi-Fi، IP و ALLOWED_HOSTS را بررسی کن.
جمعبندی
برای اینکه دیگران سایت Django در حال اجرای روی لپتاپ تو را ببینند، لازم نیست همیشه پروژه را Deploy کنی یا روی یک سرور اینترنتی قرار بدهی.
اگر دستگاهها داخل یک شبکه باشند، لپتاپ تو میتواند موقتاً نقش سرور را داشته باشد.
سه بخش اصلی این روش عبارتاند از:
پیدا کردن Local IP↓اضافه کردن IP به ALLOWED_HOSTS↓اجرای Django روی 0.0.0.0
بعد از آن هر دستگاه دیگری در همان شبکه میتواند با آدرس:
http://LOCAL_IP:PORTبه پروژه دسترسی داشته باشد.
مثلاً:
http://192.168.1.20:8000این روش مخصوصاً زمانی بسیار کاربردی است که بخواهی سایت را روی موبایل واقعی آزمایش کنی، پروژهات را سریع به شخص دیگری نشان بدهی یا بدون Deploy کردن سایت، آن را بین چند دستگاه داخل یک شبکه اجرا کنی.
سوالات متداول
آیا گوشی و لپتاپ حتماً باید به اینترنت وصل باشند؟
نه. چیزی که اهمیت دارد این است که هر دو دستگاه داخل یک شبکه محلی باشند و بتوانند با یکدیگر ارتباط برقرار کنند. حتی یک شبکه بدون دسترسی به اینترنت هم میتواند برای این کار کافی باشد.
چرا سایت با localhost روی لپتاپ باز میشود ولی روی گوشی نه؟
چون localhost در گوشی به خود گوشی اشاره میکند، نه لپتاپ تو. باید IP شبکه لپتاپ را وارد کنی.
مثلاً:
http://192.168.1.20:8000چرا باید Django را روی 0.0.0.0 اجرا کنیم؟
چون runserver بهصورت پیشفرض روی 127.0.0.1 اجرا میشود که از دستگاههای دیگر شبکه قابل دسترسی نیست. 0.0.0.0 باعث میشود سرور روی رابطهای IPv4 سیستم برای دریافت اتصال آماده باشد.
آیا باید پورت را داخل ALLOWED_HOSTS بنویسیم؟
خیر.
صحیح:
ALLOWED_HOSTS = ["192.168.1.20"]اشتباه:
ALLOWED_HOSTS = ["192.168.1.20:8000"]چرا بعد از چند روز آدرس قبلی دیگر کار نمیکند؟
احتمال دارد مودم از طریق DHCP یک IP جدید به لپتاپ داده باشد. Local IP را دوباره بررسی کن و آدرس جدید را استفاده کن.
آیا میتوانم بهجای 8000 از پورت دیگری استفاده کنم؟
بله. مثلاً:
python manage.py runserver 0.0.0.0:8080
سپس دستگاه دیگر وارد میشود:
http://192.168.1.20:8080
















