قسمت دوم آموزش Tornado - یک hello world ساده
سلام
شب و روزتون آفتابی!
بالاخره بعد از مدتها قسمت دوم آموزش فریمورک تورنادو رو ضبط کردم. در این قسمت یک hello world خیلی ساده رو با هم مینویسیم و برنامهمون رو اجرا میکنیم.
اگر نظر یا سوالی داشتید، پایین همین تاپیک درج کنید.
تا یادم نرفته بگم که کدهای نوشته شده، همگی در https://github.com/reganto/tornado-tutorial قرار میگیرند. برای یادگیری بهتر مشارکت کنید پول ریکوئستهاتون رو تا حد امکان قبول میکنم.
در جلسه قبل دربارهی معایب wsgi و لزوم استفاده از تورنادو توضیح دادم. در این جلسه یک hello world مینویسیم و با اجزای تورنادو بیشتر آشنا میشویم. یکبار دیگر باید یادآور شوم که مزیت نسبی تورنادو نسبت به فریمورکهای wsgi دیگر، پشتیبانی از وب سوکتها به صورت نیتیو،پشتیبانی از long polling و کدنویسی از کمی بالاتر از صفر است. مورد آخر هم مزیت حساب میشود هم ایراد. کدنویسی از کمی بالاتر از صفر قابلیت شخصیسازی گستردهای به برنامهنویس میدهد ولی باعت میشود که برای انجام یک تسک معین کد بیشتری نوشته شود. برای شروع کار یک virtualenv میسازیم. قبلا با استفاده از virtualenv و virtualenvwrapper این کار را انجام میدادم ولی کتابخانه توکار venv پایتون این کار را سریعتر و بهتر انجام میدهد.(اگر از virtualenv و virtualenvwrapper استفاده میکنید، شاید اینجا چیزای جالبی پیدا کنید)
python3 -m venv torn-env
ما یک محیط ایزوله به نام torn-env ساختیم. حالا باید این محیط را فعال کنیم.
source torn-env/bin/activate
بهتر است قبل از ادامه پکیج منیجر pip را آپگرید کنید چون ممکن است به صورت پیشفرض از نسخهای قدیمی استفاده کند و برای نصب کتابخانههای مبتنی بر wheel با مشکل روبهرو شویم.
pip install --upgrade pip
حالا نوبت آن رسیده که تورنادو را نصب کنیم.
pip install tornado
درون محیط ایزوله یک پوشه میسازیم و اسکریپ خود را درون آن ایجاد میکنیم.
mkdir torn-env/apps
touch torn-env/apps/hello_world_st.py
اسکریپت را باز میکنیم
vi torn-env/apps/hello_world_st.py
در قدم اول از ماژول tornado.web کلاسهای Application و RequestHandler و تابع url را ایمپورت میکنیم.
from tornado.web import Application, RequestHandler, url
در قدم بعد از ماژول tornado.ioloop کلاس IOLoop را ایمپورت میکنیم. برای ایجاد ویوهایی که درخواستها را گرفته و پردازش میکنند باید کلاسی بسازیم که از RequestHandler ارثبری میکند.
class IndexHandler(RequestHandler):
def get(self):
self.write('Hello, World!')
برای هر کدام از HTTP Verb ها مثلا get، post، delete و ... یک متد متناظر در تورنادو وجود دارد. همانطور که میبینید از متد get برای دریافت و مدیریت درخواست ارسالی استفاده کردهایم. البته این متد در صورتی اجرا خواهد شد که روش ارسال درخواست get باشد. برای ارسال داده به خروجی از متد write استفاده میکنیم.
در قدم بعد باید کلاسی بسازیم که از Application ارثبری کند. urlpatterns و تنظیمات در این کلاس قرار میگیرند. این کلاس مانند یک آداپتور بین ویوها و urlpatternها عمل میکند.
class App(Application):
def __init__(self):
handlers = [url('/', IndexHandler, name='index')]
settings = {'debug': True}
super().__init__(handlers, **settings)
متد __init__ را override میکنیم. urlpattern ها و تنظیمات به صورت آبجکت پراپرتی تعریف میشوند. urlpattern ها به صورت لیستی از تاپلها هستند. هر urlpattern یا درستتر هر URLSpec سه آرگومان اصلی دارد. اولی path، دومی کلاسی که به آن path مربوط شده است و آن path به صورت یک تریگر و راهانداز برای آن کلاس عمل میکند و یک نام که به این URLSpec منتسب شده است. تنظیمات هم به صورت یک دیکشنری تعریف میشود. debug:True اسمی برای چهار فلگ دیگر است. در آخر هم متد __init__ سوپر کلاس که همان Application باشد،با آرگومانهای handlers و آنپکشدهی settings فراخوانی میشود.
برا اجرا یک نمونه از کلاس App میسازیم. برنامه روی پورت 8001 به درخواستها گوش میدهد.
if __name__ == '__main__':
app = App()
app.listen(8001)
IOLoop.current().start()
همانطور که میبینید یک Event Loop ایجاد میکنیم تا تسکها در صف اجرا قرار بگیرند. لوپ تورنادو را میتوان به صورت standalone هم استفاده کرد.
اسکریپت را اجرا میکنیم:
python hello_world_st.py
با هر کلاینتی میتوانید برنامه را تست کنید. با مرورگر به آدرس 127.0.0.1:8001 بروید یا دستور curl http://127.0.0.1:8001 را در ترمینال تایپ کنید تا خروجی را ببینید. امیدوارم این جلسه مفید بوده باشد.