ساخت سرور با پایتون

Build a Server with Python

Build-a-Server-with-Python

سرور چیست؟

در محاسبات، سرور قطعه‌ای از سخت‌افزار یا نرم‌افزار رایانه (برنامه رایانه‌ای) است که عملکردی برای برنامه‌ها یا دستگاه‌های دیگر به نام «کلاینت» فراهم می‌کند. این معماری مدل کلاینت-سرور نامیده می شود.

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

سرورهای معمولی عبارتند از سرورهای پایگاه داده، سرورهای فایل، سرورهای پست الکترونیکی، سرورهای چاپ، سرورهای وب، سرورهای بازی، و سرورهای برنامه. سیستم های کلاینت-سرور معمولا توسط مدل درخواست-پاسخ یا request-response پیاده سازی می شوند. کلاینت درخواستی را به سرور ارسال می کند که کارهایی را انجام می دهد و معمولا پاسخی را با یک نتیجه یا تایید به کلاینت ارسال می کند.

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

برای ایجاد سرور با استفاده از پایتون تنها به نصب پایتون در سیستم خود نیاز دارید. پس اگر آن را در سیستم خود ندارید آن را نصب کنید.رابط خط فرمان یا cmd خود را باز کنید. با فشردن کلیدهای ترکیبی win + r پنجره run  را باز کنید. سپس در قسمت open دستور cmd را بنویسید و Ok را بزنید.

می توانید از روش های دیگر نیز برای باز کردن cmd استفاده کنید.این روش ها را می توانید در نشانی ببینید. پس از باز شدن cmd دستور python –m http.server را در آن می نویسیم:

اگر مرورگر خود را باز کنیم و localhost:8000 را در آن بنویسیم با تصویر زیر روبرو می شویم:

این تصویر فایل های سیستم من را نشان می دهد که ممکن است با فایل های سیستم شما متفاوت باشد. برای دیدن نتیجه ای متفاوت پوشه ای به نام server_python ایجاد می کنیم. نام پوشه اختیاری است. یک فایل test.txt در پوشه می سازیم. درون فایل هر نوشته ای که بخواهیم می توانیم بنویسیم. من کلمه Hello را در آن نوشته ام.

با استفاده از cmd  وارد پوشه شده و دوباره دستور python –m http.server را اجرا کنیم:

برای اجرای دستور بالا حتما باید وارد پوشه موردنظر شده باشید. با اجرای دستور بالا تصویر زیر را خواهیم دید:

می بینیم که فایل test.txt در سرور ساخته شده با پایتون نمایش داده می شود. اگر روی فایل کلیک کنیم می توانیم محتوی فایل را در مرورگر ببینیم مانند تصویر زیر:

هاست ما localhost و پورت ما 8000 است. برای تغییر پورت عدد موردنظر برای پورت را دستور خود را اضافه کنیم. این عدد باید پس از http.server قرار بگیرد:

من پورت را 9999 قرار داده ام. با اجرای این دستور پورت 9999 خواهد بود.

برای bind کردن port باید دستور ipconfig را در cmd نوشته و Enter را بزنیم. سپس از میان نوشته های ظاهر شده باید دنبال Ethernet adapter Ethernet بگردیم. برای bind کردن port به عدد نوشته شده در جلوی IPv4 Address نیاز داریم.این عدد نشان دهنده host است.

دستور python –m http.server 9999 –b host را می نویسم. این عدد برای شما متفاوت است پس از IPv4 من استفاده نکنید چون نتیجه بخش نخواهد بود. از IPv4 خود برای host استفاده کنید.با اجرای این دستور خواهیم داشت:

اگر مرورگر را باز کنیم تصویر زیر خواهیم دید:

اکنون نوبت کدنویسی است.

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

در ساخت سرور از متدهای GET و POST استفاده خواهیم کرد. HTTP مجموعه ای از متدهای Request را برای نشان دادن عمل مورد نظر تعریف می کند. گاهی به این متدهای درخواست افعال HTTP هم می گویند. هر کدام از این متدها کار متفاوتی انجام می دهند ولی برخی از ویژگی های آن ها مشترک است. به عنوان نمونه یک متد Request می تواند ایمن، ناتوان (idempotent) یا قابل ذخیره باشد. لیست کامل این متدها را می توانید در نشانی ببینید.

متد GET

ابتدا یک فایل به نام server.py ایجاد می کنیم و سپس دستورهای زیر را در آن می نویسیم:

from http.server import HTTPServer,BaseHTTPRequestHandler

HOST = "192.168.1.104"
PORT = 9999

class TestHttp(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type","text/html")
        self.end_headers()

        self.wfile.write(bytes("<html><body><h1 style='color:purple;'>Roxo</h1></body></html>","utf-8"))


server = HTTPServer((HOST,PORT),TestHttp)
print("Server is running ...")

server.serve_forever()
server.server_close()
print("server stop ...")

در خط اول HTTPServer,BaseHTTPRequestHandler را از http.server وارد کرده ایم. HTTPServer، یک زیر کلاس از socketserver.TCPServer است. HTTPServer یک سوکت HTTP ایجاد می کند و به آن گوش می کند و سپس درخواست ها (requests) را به یک کنترل کننده ارسال می کند.

BaseHTTPRequestHandler این کلاس برای رسیدگی به درخواست های HTTP که به سرور می رسد استفاده می شود. به خودی خود، نمی تواند به هیچ درخواست واقعی HTTP پاسخ دهد. برای رسیدگی به هر متد درخواستی (به عنوان مثال GET یا  POST ) باید زیرکلاس بندی شود. BaseHTTPRequestHandler تعدادی متغیر کلاس و نمونه و متدهایی را برای استفاده توسط زیر کلاس ها ارائه می دهد.از ماژول time برای نمایش تاریخ در متد POST استفاده خواهیم کرد.

from http.server import HTTPServer,BaseHTTPRequestHandler

کنترل کننده request  و headers را تجزیه می کند، سپس یک متد خاص برای نوع درخواست را فراخوانی می کند. نام متد از روی request ساخته شده است. به عنوان مثال، برای متد درخواست SPAM، متد ()do_SPAM بدون هیچ آرگومان فراخوانی می شود. تمام اطلاعات مربوطه در متغیرهای نمونه کنترل کننده ذخیره می شود. زیر کلاس ها نباید متد __init__ را باطل کنند یا آن را گسترش دهند. متغیرهای نمونه BaseHTTPRequestHandler را می توانید در https://docs.python.org/3/library/http.server.html ببینید. در خط های بعدی ثابت های خود با نام های HOST و PORT را تعریف کرده ایم. HOST همان عدد IPv4 است که از پیش به دست آوردیم.

HOST = "192.168.1.104"
PORT = 9999

این برنامه را به صورت شی گرا می نویسم. کلاسی به نام TestHtpp را می سازیم. این کلاس فرزند BaseHTTPRequestHandler است و از آن ارث بری می کند. برای داشتن درخواستی از نوع GET  از متد do_GET استفاده می کنیم.اگر کاربر درخواست GET بدهد این متد اجرا می شود و سپس یک متن با محتوای Roxo به او نمایش داده می شود.در این متد نوع سند را text/html و کد وضعیت را 200 تعیین کرده ایم.

def do_GET(self):
    self.send_response(200)
    self.send_header("Content-type","text/html")
    self.end_headers()

    self.wfile.write(bytes("<html><body><h1 style='color:purple;'>Roxo</h1></body></html>","utf-8"))

wfile یک شی فایل مانند است برای نوشتن است، که می توانید پس از فراخوانی send_response، به صورت اختیاری body پاسخ send_header و end_headers را با آن بنویسید. با اجرای برنامه بالا تصویر زیر را خواهیم داشت:

متد POST

برای داشتن درخواستی از نوع POST از متد do_POST استفاده می کنیم. برای داشتن متد POST کد زیر را به کلاس TestHttp می افزاییم.

def do_POST(self):
    self.send_response(200)
    self.send_header("Content-type","text/html")
    self.end_headers()

    date = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
    self.wfile.write(bytes('time: "' + date + '"' , "utf-8"))

اگر دوباره به url که از پیش داشتیم یعنی http://192.168.1.104:9999/ برویم درخواست از نوع GET خواهد بود و POST را نخواهیم دید. برای دیدن درخواست POST دو راه را داریم: راه اول استفاده از نرم افزار postman است که می توانید آن را از سایت آن دانلود کنید. راه دوم استفاده از thunder client که یکی از افزون های vscode است استفاده می کنیم. از روش دوم استفاده می  کنیم و آن را از طریق افزونه های vs کد نصب می کنیم.

پس از نصب ایکون آن به vscode اضافه می شود.

روی ایکون کلیک می کنیم و روی دکمه New Requset می زنیم.

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

در این پنجره درخواست خود را از نوع POST قرار می دهیم و سپس URL خود را در آن وارد می کنیم:

با زدن دکمه send نتیجه زیر را خواهیم دید.

 اگر اشکالی در برنامه وجود نداشته باشد تصویر بالا را خواهیم دید. اگر درخواست با موفقیت پاسخ داده شود باید کد وضعیت یا Status code دویست را دریافت کنیم. هر کدام از این کدها نشان دهنده یک پیام ویژه هستند.

نویسنده شوید

دیدگاه‌های شما

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