وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

ارائه فایل ها با ماژول SimpleHTTPServer پایتون

0 15
زمان لازم برای مطالعه: 6 دقیقه


معرفی

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

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

پایتون SimpleHTTPServer ماژول یک ابزار مفید و ساده است که توسعه دهندگان می توانند برای چندین مورد استفاده از آن استفاده کنند، که اصلی ترین آن این است که راهی سریع برای ارائه فایل ها از یک دایرکتوری است.

کار پر زحمت را از بین می برد process مرتبط با نصب و پیاده سازی وب سرورهای چند پلتفرمی موجود است.

توجه داشته باشید: در حالی که SimpleHTTPServer یک راه عالی برای ارائه آسان فایل ها از یک دایرکتوری است، نباید در یک محیط تولید استفاده شود. طبق اسناد رسمی پایتون، “فقط بررسی های امنیتی اولیه را اجرا می کند.”

سرور HTTP چیست؟

HTTP مخفف پروتکل انتقال ابرمتن. اجازه دهید یک پروتکل را به عنوان یک زبان گفتاری مانند انگلیسی در نظر بگیریم. انگلیسی مجموعه ای از قوانین و واژگان دارد. بنابراین، اگر هر دو قواعد و واژگان تعریف کننده زبان انگلیسی را درک کنیم، می‌توانیم به طور موثر در این زبان ارتباط برقرار کنیم.

درست مانند انسان، دستگاه های الکترونیکی نیز با یکدیگر ارتباط برقرار می کنند. بنابراین، آنها به مجموعه ای از قوانین و واژگان برای انتقال و دریافت اطلاعات از یکدیگر به طور فعال نیاز دارند.

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

به عنوان مثال، هنگامی که شما یک جستجوی ساده را با استفاده از یک مرورگر انجام می دهید، دو سیستم ضروری درگیر هستند – سرویس گیرنده HTTP و سرور HTTP.

مشتری که معمولاً به آن اشاره می شود مرورگر، می تواند یک برنامه پیچیده مانند Google Chrome یا Firefox باشد، اما می تواند به سادگی یک برنامه CLI نیز باشد. مشتری شما را ارسال می کند درخواست به سروری که درخواست های HTTP را پردازش می کند و a واکنش به مشتری. در مورد مرورگرها، پاسخ معمولاً یک HTML است page.

پایتون سرور HTTPS ساده مدول

هنگامی که به یک وب سرور سریع نیاز دارید، راه اندازی یک سرور در سطح تولید یک کار اضافی است.

پایتون SimpleHTTPServer ماژول یک ابزار صرفه جویی در کار است که می توانید از آن برای تبدیل هر دایرکتوری در سیستم خود به یک وب سرور بدون عارضه استفاده کنید. این بسته بندی با یک سرور HTTP ساده ارائه می شود که استاندارد را ارائه می دهد GET و HEAD رسیدگی کنندگان درخواست

با یک سرور HTTP داخلی، نیازی به نصب یا پیکربندی چیزی برای راه اندازی وب سرور خود ندارید.

توجه داشته باشید: پایتون SimpleHTTPServer ماژول در ادغام شد http.server ماژول در پایتون 3. در طول این مقاله از نسخه پایتون 3 استفاده خواهیم کرد، اما اگر از پایتون 2 استفاده می کنید، می توانید swap بیرون http.server برای SimpleHTTPServer و در بیشتر موارد باید کار کند.

استفاده از خط فرمان

ساده ترین راه برای راه اندازی وب سروری که دایرکتوری را که در آن دستور اجرا می شود ارائه می دهد این است که به سادگی به دایرکتوری پروژه خود با استفاده از terminal و اجرا:

پایتون 2

$ python -m SimpleHTTPServer 8000

پایتون 3

$ python3 -m http.server 8000

با اجرای این دستور، می توانید از طریق مرورگر خود به فایل های موجود در فهرست خود دسترسی پیدا کنید localhost:8000:

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

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

استفاده پیش فرض پایتون

به هر دلیلی، اجرای این سرور از طریق خط فرمان ممکن است مناسب مورد استفاده ما نباشد. در مواقعی مانند این ما می توانیم به جای آن از سرور به طور مستقیم در کد خود با استفاده از SimpleHTTPRequestHandler هدف – شی. اما ابتدا باید آن را با یک سرور سوکت راه اندازی کنیم.

در زیر پروتکل HTTP قرار دارند UDP (پروتکل دیتاگرام کاربر) یا TCP (پروتکل کنترل انتقال)، که پروتکل های انتقالی هستند که انتقال داده ها را از یک مکان شبکه به مکان دیگر انجام می دهند. از آنجایی که ما یک سرور HTTP را اجرا می کنیم، برنامه ما از پروتکل TCP از طریق a استفاده می کند آدرس سوکت TCP که حاوی یک آدرس IP و یک شماره پورت است. این را می توان با پایتون تنظیم کرد socketserver.TCPServer، که در زیر پیاده سازی کرده ایم:

import http.server
import socketserver

PORT = 8000

handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), handler) as httpd:
    print("Server started at localhost:" + str(PORT))
    httpd.serve_forever()

توجه داشته باشید: کد با خطا خراب می شود AttributeError: __exit__ برای نسخه های پایتون < 3.6. زیرا در نسخه های قبلی socketserver.TCPServer از استفاده با مدیران زمینه پشتیبانی نمی کند ( with کلمه کلیدی). در این موارد باید تماس بگیرید server_close() برای متوقف کردن سرور

به طور پیش فرض، SimpleHTTPRequestHandler فایل ها را از دایرکتوری فعلی و زیرشاخه های مرتبط ارائه می دهد. همانطور که از نام آن پیداست، یک کنترل کننده ساده درخواست HTTP است. از آنجایی که سرور ساده ای است، فقط به شما امکان می دهد داده ها را بازیابی کنید و آنها را به سرور پست نکنید. و به همین دلیل فقط HTTP را پیاده سازی می کند GET و HEAD روش ها از طریق do_GET() و do_HEAD().

پارامترها به TCPServer نشان دهنده آدرس IP و شماره پورت است. با خالی گذاشتن آدرس IP، سرور به تمام آدرس های IP موجود گوش می دهد، در حالی که ما پورت را روی آن تنظیم کرده ایم 8000. این بدان معنی است که در آن صورت قابل دسترسی خواهد بود روی localhost:8000.

سرانجام، httpd.server_forever() سرور را راه اندازی می کند، گوش می دهد و به درخواست های دریافتی مشتری پاسخ می دهد.

سرور را می توان به سادگی با اجرای فایل راه اندازی کرد:

$ python3 simple-server.py

و درست مانند استفاده از خط فرمان، اکنون می توانیم از طریق مرورگر وب خود به دایرکتوری دسترسی پیدا کنیم:

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

سفارشی کردن مسیرها

روش دیگری که می توانیم در پیش بگیریم این است که یک کلاس سفارشی بسازیم که گسترش یابد SimpleHTTPRequestHandler و درخواست های ما را با برخی از قابلیت های سفارشی رسیدگی می کند. برای انجام این کار، ما خودمان را پیاده سازی می کنیم do_GET() تابع.

اما قبل از رسیدن به آن، بیایید بگوییم که یک فایل HTML داریم که می‌خواهیم آن را ارائه کنیم. mywebpage.html:

<!DOCTYPE html>
<html>
<head>
  <title>Using Python's SimpleHTTPServer Module</title>
  <style>
    #rectangle {
      height: 50px;
      width: 100px;
      background-color: #00f28f;
    }
  </style>
</head>
<body>
  <h2>Rectangle served by SimpleHTTPServer</h2>
  <div id="rectangle"></div>
</body>
</html>

به منظور خدمت به این HTML از مسیری که نیست /mywebpage.html، می توانیم از کنترل کننده سفارشی خود برای ارائه آن استفاده کنیم روی هر مسیری که بخواهیم در این مثال ما فقط به آن خدمت می کنیم روی را root مسیر، /:

import http.server
import socketserver

class MyHttpRequestHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/':
            self.path = 'mywebpage.html'
        return http.server.SimpleHTTPRequestHandler.do_GET(self)


handler_object = MyHttpRequestHandler

PORT = 8000
my_server = socketserver.TCPServer(("", PORT), handler_object)


my_server.serve_forever()

باز هم، اجرای این اسکریپت به ما امکان می دهد از طریق مرورگر به آن دسترسی داشته باشیم:

مستطیل خدمت کرده است on مرورگر

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

برگرداندن HTML پویا

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

import http.server
import socketserver
from urllib.parse import urlparse
from urllib.parse import parse_qs

class MyHttpRequestHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        
        self.send_response(200)

        
        self.send_header("Content-type", "text/html")

        
        self.end_headers()

        
        name = 'World'
        query_components = parse_qs(urlparse(self.path).query)
        if 'name' in query_components:
            name = query_components("name")(0)

        
        html = f"<html><head></head><body><h1>Hello {name}!</h1></body></html>"

        
        self.wfile.write(bytes(html, "utf8"))

        return


handler_object = MyHttpRequestHandler

PORT = 8000
my_server = socketserver.TCPServer(("", PORT), handler_object)


my_server.serve_forever()

و این کد را با URL اجرا کنید http://localhost:8000؟name=Billy حاصل خواهد شد:

ارائه html پویا

هر مقداری که برای name سپس پارامتر query ظاهر می شود روی صفحه نمایش! شما حتی می توانید حذف کنید name پارامتر پرس و جو کنید و ببینید چه اتفاقی می افتد.

همانطور که می بینید، ایجاد یک کنترل کننده درخواست سفارشی به ما این امکان را می دهد تا با تغییر پیاده سازی، پاسخ ها را تا جایی که می خواهیم دستکاری کنیم. do_GET روش و ما چنین کنترلی روی پاسخ های خود با اجرای پیش فرض نداریم.

همین کار را می توان با روش HTTP HEAD (از طریق do_HEAD() تابع)، اما از آنجایی که بسیار شبیه به روش GET است، آن را به عنوان تمرین به خواننده واگذار می کنیم.

نتیجه

پایتون در اختیار ما قرار می دهد SimpleHTTPServer ماژول (یا http.server در پایتون 3) که می تواند برای ارائه سریع و آسان فایل ها از یک فهرست محلی از طریق HTTP استفاده شود. این می تواند برای بسیاری از کارهای توسعه یا سایر وظایف داخلی استفاده شود، اما برای تولید در نظر گرفته نشده است.

این یک راه حل عالی برای استفاده محلی است زیرا وب سرورهایی مانند آپاچی، میمون، و اره منبت کاری اره مویی راه اندازی بسیار دشوارتر است و اغلب برای فعالیت های توسعه بیش از حد نیاز دارند.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-19 07:05:10

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید