تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

راهنمای ساخت یک سرور HTTP ساده و کاربردی در پایتون


۱۴ آبان ۱۴۰۴

ماژول http.server داخلی پایتون، ابزاری کاربردی است که با یک دستور ساده از ترمینال، می‌توانید یک وب سرور را در آن بسازید. این قابلیت برای توسعه‌دهندگان بسیار مفید خواهد بود. زیرا اجازه می‌دهد فایل‌ها را برای توسعه محلی به اشتراک بگذارند، فایل‌ها را بر روی شبکه توزیع کنند یا حتی نمونه‌های اولیه اپلیکیشن‌های وب را بدون نیاز به تنظیم سرورهای پیچیده مانند Apache یا nginx آزمایش کنند. این ماژول بخش ضروری از ابزارهای هر توسعه‌دهنده پایتون است و راه سریعی را برای راه‌اندازی سرور در عرض چند ثانیه فراهم می‌کند.

در این آموزش از لیارا، یاد خواهید گرفت تا چگونه از http.server پایتون برای ساخت یک سرور HTTP ساده از هر دایرکتوری بر روی سیستم خود استفاده کنید. همچنین تفاوت‌های بین SimpleHTTPServer در پایتون 2 و ماژول http.server در پایتون 3 را بررسی خواهیم کرد.

همین الان، بدون هیچ‌گونه پیچیدگی، هاست Python خود را در کمتر از ۳۰ ثانیه راه‌اندازی کنید.
✅ استقرار سریع و آسان ✅ پشتیبانی از فریم‌ورک‌های مختلف ✅ عملکرد پایدار
خرید هاست Python

آنچه در ادامه خواهید خواند:

  • نکات مهم و حائز اهمیت
  • http.server پایتون چیست؟
  • چرا از یک سرور HTTP ساده در پایتون استفاده کنیم؟
  • چگونگی شروع سرور (دستور یک‌خطی)
  • چگونگی شروع سرور به صورت برنامه‌ای
  • ارائه یک دایرکتوری خاص
  • انتخاب پورت
  • Python SimpleHTTPServer
  • Python Simple HTTP Server
  • خطای Python SimpleHTTPServer – No module named SimpleHTTPServer
  • مثال Python SimpleHTTPServer
  • Python HTTP Server
  • ملاحظات امنیتی
  • ایمن‌سازی سرور HTTP ساده با SSL/TLS
  • موارد استفاده و بهترین روش ها
  • راه‌اندازی سرور توسعه محلی برای آزمایش تغییرات فرانت‌اند
  • ارائه فایل‌های استاتیک در هکاتون‌ها یا دموهای پروژه
  • استفاده روی Raspberry Pi برای ارائه فایل‌ها روی LAN
  • آزمایش سریع برای وب‌هوک‌ها یا هدرهای CORS
  • سفارشی‌سازی رفتار سرور با هندلر سفارشی
  • مدیریت درخواست‌های POST
  • سوالات متداول
  • جمع بندی

نکات مهم و حائز اهمیت

  • ماژول http.server داخلی پایتون می‌تواند هر دایرکتوری را به یک وب سرور HTTP ساده برای توسعه محلی یا اشتراک فایل تبدیل کند.
  • می‌توانید سرور را از ترمینال با دستور یک‌خطی python -m http.server 8000 راه‌اندازی کنید.
  • http.server در پایتون 3، جانشین ماژول SimpleHTTPServer از پایتون 2 است.
  • این سرور برای محیط‌های تولید توصیه نمی‌شود، زیرا فاقد ویژگی‌های امنیتی است.
  • می‌توانید با تولید گواهی خودامضا، رمزنگاری SSL/TLS را برای استفاده امن‌تر بر روی شبکه محلی اضافه کنید.
  • برای قابلیت‌های پیشرفته مانند مدیریت درخواست‌های POST، می‌توانید با زیرکلاس کردن SimpleHTTPRequestHandler، یک هندلر درخواست سفارشی ایجاد کنید.
راهنمای ساخت یک سرور HTTP ساده و کاربردی در پایتون

http.server پایتون چیست؟

همانطور که در بالا به آن اشاره کرده‌ایم http.server پایتون، یک ماژول داخلی است که به شما اجازه می‌دهد تا بتوانید یک سرور HTTP ساده برای ارائه فایل‌ها از یک دایرکتوری را بسازید. این ابزار برای آزمایش، توسعه و اشتراک فایل‌ها در شبکه یک ابزار فوق‌العاده است، اما برای استفاده در تولید توصیه نخواهد شد.

چرا از یک سرور HTTP ساده در پایتون استفاده کنیم؟

استفاده از سرور HTTP ساده در پایتون مزایای بسیاری را دارد که در ادامه بیشتر به آن خواهیم پرداخت:

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

چگونگی شروع سرور (دستور یک‌خطی)

برای شروع یک سرور HTTP ساده در پایتون، از دستور یک‌خطی زیر در ترمینال استفاده کنید:

python -m http.server 8000

این دستور سرور پورت 8000 راه‌اندازی می‌کند و فایل‌ها را از دایرکتوری فعلی به شما ارائه می‌دهد.

چگونگی شروع سرور به صورت برنامه‌ای

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

برای این عمل بایستی، از ماژول‌های داخلی http.server و socketserver پایتون استفاده کنید.

این قست یک اسکریپت پایه برای راه‌اندازی سرور خواهد بود.

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print(f"Serving at port {PORT}")
    # Start the server and keep it running until you stop the script
    httpd.serve_forever()

در این اسکریپت:

  • ماژول‌های لازم را وارد خواهیم کرد.
  • socketserver.TCPServer یک سرور TCP را راه‌اندازی می‌کند. آرگومان اول "", PORT مشخص می‌کند که سرور باید روی تمام اینترفیس‌های شبکه و در پورت تعیین‌شده عملیات مورد نظر را انجام دهد. به این ترتیب، سرور برای تمام دستگاه‌های موجود در شبکه محلی قابل دسترسی خواهد بود.
  • http.server.SimpleHTTPRequestHandler به‌صورت پیش‌فرض خواهد بود که فایل‌ها و لیست دایرکتوری‌ها را ارائه می‌دهد.
  • httpd.serve_forever() سرور را شروع می‌کند و تا زمانی که آن را متوقف نکنید (به‌عنوان مثال با Ctrl+C) ادامه می‌دهد.

این کد را به عنوان یک فایل پایتون (به‌عنوان مثال server.py) ذخیره کنید و آن را اجرا کنید:

python server.py

خروجی "Serving at port 8000" را خواهید دید و در این لحظه سرور فعال خواهد شد.

ارائه یک دایرکتوری خاص

برای ارائه فایل‌ها از یک دایرکتوری خاص، به آن دایرکتوری در ترمینال یا خط فرمان بروید و دستور سرور را اجرا کنید. برای مثال، اگر می‌خواهید فایل‌ها را از دایرکتوری به نام myproject ارائه دهید، به myproject بروید و آن را مانند زیر اجرا کنید:

python -m http.server 8000

انتخاب پورت

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

python -m http.server 9000

Python SimpleHTTPServer

Python SimpleHTTPServer تنها دو متد GET و HEAD را پشتیبانی می‌کند. بنابراین می‌توان گفت ابزار بسیار مناسبی برای اشتراک فایل‌ها در شبکه است. Python SimpleHTTPServer به ماژول http.server در پایتون 3 منتقل شده است

در ادامه قصد خواهیم داشت هر دو ماژول را بررسی کنیم تا متوجه شوید که چه‌ مقدار کار با آن‌ها ساده و بدون دردسر است. فرض کنید شما و دوستتان روی همان شبکه محلی هستید. فایل‌هایی دارید که می‌خواهید با دوستتان به اشتراک بگذارید. به جای کپی کردن آن‌ها روی هارد اکسترنال، می‌توانید از SimpleHTTPServer پایتون برای اشتراک مستقیم استفاده کنید.

Python Simple HTTP Server

اگر از سیستم عامل ویندوز استفاده می‌کنید، به فولدر یا دایرکتوری مورد نظر بروید. حال راست کلیک کنید. گزینه‌ای برای باز کردن Command Prompt در آن دایرکتوری پیدا خواهید کرد. روی آن کلیک کنید و خط فرمان را باز کنید. اما اگر از اوبونتو استفاده می‌کنید، تنها روی آن دایرکتوری کلیک راست کنید و ترمینال را باز کنید. بعد از آن می‌توانید، دستور زیر را اجرا کنید:

python -m SimpleHTTPServer 9000

می‌توانید سرور http پایتون را روی هر پورتی اجرا کنید، پورت پیش‌فرض 8000 است. سعی کنید از شماره پورت بالاتر از 1024 استفاده کنید تا از تداخل جلوگیری شود. سپس مرورگر مورد نظرتان را باز کنید و localhost:9000 را تایپ کنید. تمام! حال آدرس IP خود را ذخیره کنید و localhost را با IP خود جایگزین کنید و با دوستتان به اشتراک بگذارید.

خطای Python SimpleHTTPServer – No module named SimpleHTTPServer

اگر از پایتون 3 استفاده می‌کنید، حتما به خطای No module named SimpleHTTPServer برخورده‌اید. این خطا به دلیل ناسازگاری با نسخه فعلی پایتون رخ داده است و SimpleHTTPServer به ماژول http.server ادغام شده است. می‌توانید از دستور زیر برای اجرای سرور HTTP در پایتون 3 استفاده کنید.

python3 -m http.server 9000

مثال Python SimpleHTTPServer

تصویر زیر خروجی Python SimpleHTTPServer را در ترمینال و مرورگر نشان می‌دهد. توجه کنید که اگر فایل index.html وجود داشته باشد، با مرورگر ارائه می‌شود، در غیر این صورت لیست دایرکتوری نشان داده می‌شود.

Python HTTP Server

همانطور که از خروجی ترمینال مشاهده می‌کنید، ماژول http.server پایتون 3 مرتب‌تر است و پیام‌های مشخصی را ارائه می‌دهد. ماژول http.server پایتون جزئیات تمام ماژول‌های پایتون را هنگام خروج از کیبورد نشان نمی‌دهد، که رویکرد کاربردی خواهد بود است.

ملاحظات امنیتی

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

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

برای کاهش این ریسک‌ها، از سرور فقط برای توسعه و آزمایش محلی استفاده کنید و مطمئن شوید داده‌های حساس ارائه نمی‌دهید.

ایمن‌سازی سرور HTTP ساده با SSL/TLS

همانطور که در بخش ملاحظات امنیتی گفته شد، سرور HTTP پیش‌فرض بدون رمزنگاری محیطی نا امن خواهد بود. هرچند نباید آن را در اینترنت عمومی بگذارید، اما می‌توانید امنیت آن را برای استفاده بر روی شبکه محلی با افزودن رمزنگاری SSL/TLS بهبود بخشید و سرور http:// را به https:// تبدیل کنید.

برای این کار، به یک گواهی SSL نیاز دارید.

گام1: تولید گواهی خودامضا

می‌توانید با استفاده از OpenSSL یک گواهی خودامضا تولید کنید. اگر آن را ندارید، ابتدا نصب کنید و دستور زیر را در ترمینال اجرا کنید:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

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

  • key.pem: کلید خصوصی شما.
  • cert.pem: گواهی عمومی شما.

فایل key.pem را در یک محیط امن نگه دارید، زیرا کلید خصوصی شما خواهد بود.

گام 2: ایجاد اسکریپت پایتون برای سرور HTTPS

اسکریپت سرور برنامه‌ را برای استفاده از ماژول داخلی ssl پایتون تغییر دهید تا سرور را با گواهی SSL شما تنظیم کند.

import http.server
import socketserver
import ssl

PORT = 8000
HANDLER = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), HANDLER) as httpd:
    httpd.socket = ssl.wrap_socket(
        httpd.socket,
        keyfile="key.pem",
        certfile="cert.pem",
        server_side=True
    )
    
    print(f"Serving securely on https://localhost:{PORT}")
    # Start the server
    httpd.serve_forever()

مطمئن شوید فایل‌های key.pem و cert.pem در همان دایرکتوری اسکریپت هستند، یا مسیرهای درست را ارائه می‌دهند.

گام 3: دسترسی به سرور امن شما

اسکریپت را اجرا کنید:

python secure_server.py

حال مرورگر وب را باز کنید و به https://localhost:8000 بروید. اتصال شما به سرور محلی حالا رمزنگاری شده است.

موارد استفاده و بهترین روش ها

  • توسعه محلی: از سرور برای توسعه و آزمایش محلی وب اپلیکیشن‌ها استفاده کنید.
  • اشتراک فایل: فایل‌ها را با همکاران یا دوستان‌تان بر روی شبکه محلی به اشتراک بگذارید.
  • نمونه‌سازی سریع: برای نمونه‌سازی سریع و آزمایش از آن استفاده کنید.

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

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

راه‌اندازی سرور توسعه محلی برای آزمایش تغییرات فرانت‌اند

برای راه‌اندازی سرور توسعه محلی و تغییرات فرانت‌اند، به دایرکتوری پروژه بروید و دستور زیر را اجرا کنید:

python -m http.server 8000

این کار یک سرور بر روی پورت 8000 راه‌اندازی می‌کند که فایل‌ها را از دایرکتوری پروژه ارائه می‌دهد.

ارائه فایل‌های استاتیک در هکاتون‌ها یا دموهای پروژه

برای ارائه فایل‌های استاتیک در هکاتون‌ها یا دموهای پروژه، به دایرکتوری فایل‌های استاتیک بروید و کد زیر را اجرا کنید:

python -m http.server 8000

این کار اجازه می‌دهد تا بتوانید پروژه‌‌هایتان را سریع‌تر بر روی شبکه محلی و با دیگران به اشتراک بگذارید.

استفاده روی Raspberry Pi برای ارائه فایل‌ها روی LAN

برای استفاده از http.server پایتون بر روی Raspberry Pi و ارائه فایل‌ها روی LAN، گام‌های زیر را دنبال کنید:

  • اگر پایتون نصب نیست، بر روی آن را Raspberry Pi نصب کنید.
  • به دایرکتوری فایل‌های مورد نظر بروید.
  • دستور روبه رو را برای شروع سرور اجرا کنید: python -m http.server 8000
  • روی دستگاه دیگر و متصل به همان شبکه، مرورگر را باز کنید و به http://<آدرس IP Raspberry Pi>:8000 بروید.

آزمایش سریع برای وب‌هوک‌ها یا هدرهای CORS

برای آزمایش سریع وب‌هوک‌ها یا هدرهای CORS، می‌توانید از http.server پایتون برای شبیه‌سازی محیط سرور استفاده کنید. برای مثال، یک فایل HTML ساده با درخواست وب‌هوک یا CORS ایجاد کنید و آن را با سرور ارائه دهید.

سفارشی‌سازی رفتار سرور با هندلر سفارشی

هندلر پیش‌فرض SimpleHTTPRequestHandler محدود به ارائه فایل‌ها با دستورهای GET و HEAD است. برای قابلیت‌های پیشرفته‌تر مانند مدیریت درخواست‌های POST یا افزودن هدرهای سفارشی، می‌توانید هندلر درخواست خود را با زیرکلاس کردن SimpleHTTPRequestHandler ایجاد کنید.

نکته مهم: زیرکلاس کردن اجازه می‌دهد متدهای پیش‌فرض را تغییر دهید یا بتوانید متدهای جدیدی را اضافه کنید تا رفتار سرور سفارشی تعریف شود.

به‌عنوان مثال:

import http.server
import socketserver

PORT = 8000

class CustomHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        print("A custom GET request was received.")
        # Call the parent class's do_GET method to serve the file
        super().do_GET()

with socketserver.TCPServer(("", PORT), CustomHandler) as httpd:
    print(f"Serving at port {PORT} with a custom handler")
    httpd.serve_forever()

زمانی که اسکریپت را اجرا کنید و به http://localhost:8000 در مرورگر دسترسی پیدا کنید، ترمینال برای هر فایل درخواستی توسط مرورگر، "A custom GET request was received" چاپ می‌کند.

مدیریت درخواست‌های POST

مدیریت داده‌های ارسال‌شده از طریق درخواست‌های POST یک امر بسیار مهم است که نباید نادیده گرفته شود. می‌توانید این قابلیت را با پیاده‌سازی متد do_POST در هندلر سفارشی خود اضافه کنید. این متد هر زمان که سرور درخواست POST دریافت کند، به طور خودکار فراخوانی می‌شود.

در متد do_POST، می‌توانید داده‌های ورودی را بخوانید، پردازش کنید و پاسخی به کلاینت بفرستید.

مثال زیر یک هندلر سفارشی را نشان می‌دهد که می‌تواند داده‌های POST مبتنی بر متن ساده را دریافت و پردازش کند:

import http.server
import socketserver

PORT = 8000

class CustomHandler(http.server.SimpleHTTPRequestHandler):
    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        
        post_data = self.rfile.read(content_length)
        
        print(f"Received POST data: {post_data.decode('utf-8')}")
        
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        
        response_message = b"POST request received successfully!"
        self.wfile.write(response_message)

with socketserver.TCPServer(("", PORT), CustomHandler) as httpd:
    print(f"Serving at port {PORT}, ready to handle POST requests")
    httpd.serve_forever()

برای آزمایش این سرور، اسکریپت زیر را اجرا کنید و سپس از ابزاری مانند curl در ترمینال دیگری برای ارسال درخواست POST استفاده کنید:

ترمینال متن زیر را به شما نمایش خواهد داد:

Received POST data: Hello, Server!

و دستور curl پاسخ زیر را دریافت خواهد کرد:

 POST request received successfully!

سؤالات متداول

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

دستور شروع یک سرور HTTP ساده در پایتون 3 چیست؟

python -m http.server 8000

این کار سروری بر روی پورت 8000 راه‌اندازی می‌کند که فایل‌ها را از دایرکتوری فعلی ارائه می‌دهد.

چگونه پورت سفارشی مشخص کنم؟

برای مشخص کردن پورت سفارشی، شماره پورت را به عنوان آرگومان پس از دستور سرور اضافه کنید. برای مثال، برای اجرای سرور روی پورت 9000 بایستی از دستور زیر استفاده کنید:

python -m http.server 9000

چگونه دایرکتوری دیگری ارائه دهم؟

برای ارائه دایرکتوری دیگر، قبل از اجرای دستور سرور، به آن دایرکتوری در ترمینال یا خط فرمان بروید. برای مثال، اگر می‌خواهید فایل‌ها را از دایرکتوری به نام myproject ارائه دهید، با دستور cd myproject به دایرکتوری بروید و آن را اجرا کنید:

python -m http.server 8000

این کار فایل‌ها را از دایرکتوری myproject ارائه می‌دهد.

چگونه فایل‌ها را روی شبکه، نه فقط localhost، ارائه دهم؟

برای ارائه فایل‌ها روی شبکه ارائه دهید، مطمئن شوید سرور برای اینترفیس شبکه پیکربندی شده و پورت‌های لازم شبکه باز هستند. ممکن است نیاز به پیکربندی روتر برای ارسال درخواست‌های ورودی به سرور داشته باشید.

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

این برنامه فایل‌ها را از دایرکتوری فعلی روی پورت 8000 ارائه می‌دهد. می‌توانید شماره پورت و دایرکتوری را طبق نیاز تغییر دهید. که در مطلب بالا آن را کامل شرح داده‌ایم.

جمع بندی

در این آموزش، یاد گرفتید چگونه از http.server پایتون برای راه‌اندازی سریع یک وب سرور ساده، توسعه محلی و اشتراک فایل استفاده کنید. همچنین شروع سرور، ارائه فایل‌ها، ایمن‌سازی آن با SSL برای استفاده محلی و گسترش قابلیت‌ها با هندلرهای درخواست سفارشی را نیز برای شما عزیزان بررسی و توضیح داده‌ایم.

به اشتراک بگذارید

برچسب‌ها: