مدیریت دادههای json در تورنادو
سلام رفقا در این قسمت دربارهی مدیریت دادههای جیسانی در تورنادو صحبت میکنیم. همانطوری که میدونید من اصلا اهل ادیت ویدئو نیستم پس همین جا سوتیها رو میگم. یه جایی گفتم اینکد که منظورم دیکد بوده و چند تا سوتی ریز دیگه!
این جلسه میخواهیم دربارهی دریافت داده جی سانی صحبت کنیم. دو سه جلسه قبل درباره ی گرفتن دادهها با سه روش post ، get و url صحبت کردیم. تورنادو مکانیسم توکاری برای دریافت داده از نوع جیسان نداره ولی نوشتن روالی که این کار رو برامون انجام بده چندان سخت نیست. خب برای این که وقتمون گرفته نشه، قبلا ویرچوان انوم رو ساختم و فایلی به نام app.py هم درست کردم و کدهای اولیه رو نوشتم. قراره روی همین اسکریپت app.py جلو بریم. بزارید یه خورده کدها رو توضیح بدم. توی بخش ایمپورتها ماژول web و ioloop رو ایمپورت کردم. url رو از ماژول وب ایمپورت کردم . برای ایجاد لاگ روی استاندارد اوتپوت parse_command_line رو از ماژول options ایمپورت کردم. طبق معمول هم کلاس Applicaiton رو با دو پروپرتی ایجاد کردم اولین پروپرتی رو که اسمشو گذاشتم routes لیستی از تاپلهاست که روتها رو در اون قرار میدیم و درواقع مپ کردن endpointها به هندلرها در این پروپرتی انجام میشه. دومین پروپرتی که اسمشو گذاشتم settings یک دیکشنریه که تنظیمات اپمون در اون قرار میگیره. آخر سر هم یک نمونه از اپمون میسازیم و میگیم روی پورت ۸۰۰۱ به درخواستها گوش بده. برای مدیریت آرگومانهای جیسانی یک کلاس میخواهیم که از RequestHandler ارث بری کنه. اسمشو میگذاریم BaseHandler. در BaseHandler یک متد میسازیم به هر اسمی که دوست داشتید ولی بهتره یک اسم با معنی باشه. من اسمشو میگذاریم get_json_argument. این متد دوتا پارامتر میگیره اولین پارامتر نام پارامتریه که قصد گرفتنشو داریم دومین پارامتر هم یک مقدار دیفالته در صورتی که مقدار جیسانی موجود نباشه، از این مقدار استفاده میشه دقیقا مثلا متدهای get_body_argument و get_query_argument. به پارامتر default مقدار پیشفرض None میدم چون ممکنه این مقدار تعیین نشه. دادههای جیسانی قراره در بدنه درخواست فرستاده بشن پس اگر مقدار self.request.body موجود باشه و مقدار داشته باشه، از دستور try except استفاده میکنیم و داده رو میگیریم و در متغیر raw_data قرار میدهیم. این داده که در بدنه درخواست فرستاده شده از نوع بایته پس باید یک تبدیل نوع بر روی این داده انجام بدیم تا داده مورد نظر ما به رشته تبدیل بشه. متد decode این تبدیل نوع رو برای ما انجام میده. رشته به دست اومده از سینگل کوتیشن استفاده میکنه کتابخانه توکار جیسان پایتون نمیتونه این رشته رو به یک دیکشنری پایتونی دیکد کنه پس باید سینگل کوتها به دابل کوت تبدیل بشن. برای این کار از متد replace استفاده میکنیم. اولین آرگومان کاراکتریه که باید replace بشه دومین آرگومان هم کاراکتریه که replace میشه. دادهی تبدیل شده به جیسان را در متغیر json_data قرار میدهیم. حالا باید اطلاعات مورد نظر رو از این داده جیسانی بیرون بکشیم. برای این کار از متر get مریوط به دیکشنریها استفاده میکنم. توی همین متد از مقدار دیفالت استفاده میکنم. در بخش except هم میگم اگر ایکسپشنی پیش بیاد چطوری مدیریت بشه که برای کار ما در این حد کافیه. در آخر هم اگر self.request.body مقدار نداشته باشه یک پیام به خروجی میره.
حالا باید برنامهمون رو تست کنیم. یک کلاس به اسم HomeHandler میسازم. این کلاس به جای RequestHandler باید از BaseHandler ارث بری کنه. از متد self.get_json_argument('message') استفاده میکنم و داده جیسانی رو میگیرم و به خروجی میبرم.
اگر بخواهیم داده جیسانی رو به صورت تمام و کمال داشته باشیم میتونیم از همین متد get_json_argument بدون پارامتر و با تغییرات جزیی استفاده کنیم. اسم این متد رو get_json_arguments میگذارم و ...
برای تست برنامه کافیه که در کلاس HomeHandler به جای get_json_argument از get_json_arguments استفاده میکنیم بدون هیچگونه آرگومانی و داده جیسانی رو به خروجی میبریم.
کدها در گیتهاب
شاد و پیروز باشید.