محمدحسن ستاریان
محمدحسن ستاریان
خواندن ۲ دقیقه·۵ سال پیش

تبدیل Jupyter Notebook به Rest API Endpoint

ژوپیتر نوت‌بوک‌ها (Jupyter notebooks) فوق‌العاده هستن، به ما اجازه می‌دهند که به سرعت و راحتی شروع به بررسی و کد زدن (یا به اصطلاح prototype and experiment) کنیم؛ اما آیا می‌دونستید که می‌تونیم از اون‌ها به عنوان یک Backend استفاده کنیم؟

در این آموزش، می‌بینیم که چطور از یک نوت‌بوک به عنوان یک API ساده استفاده کنیم -مشابه همون‌کاری که Runkit که ابزاری مشابه برای Javascript است انجام می‌دهد- و یک API ساده برای تبدیل درجه به رادیان می‌سازیم؛ فایل این نوت‌بوک در این آدرس در دسترس است.

بنابراین، در نهایت ما Endpointای خواهیم داشت که می‌توانیم از اون به صورت زیر استفاده کنیم:

$ curl &quothttp://serverIp:8888/convert?angle=180&quot #{&quotconvertedAngle&quot: 3.141592653589793}

نصب و راه‌اندازی

با فرض اینکه jupyter notebook  را نصب دارید، در ابتدا پکیج kernel_gateway را به صورت زیر نصب کنید:

$ pip install jupyter_kernel_gateway

سپس با وارد کردن دستور زیر، تنظیمات kernel_gateway را بسازید:

$ jupyter kernelgateway --generate-config

با وارد کردن این دستور فایل تنظیمات پیش‌فرض در آدرس ذکر شده ساخته می‌شوند. برای آنکه API شما بتواند توسط دیگر سیستم‌ها قابل دسترسی باشد این فایل را مطابق زیر تغییر دهید:

# ~/.jupyter/jupyter_kernel_gateway_config.py c.KernelGatewayApp.ip = '*'

ساختن API

یک نوت‌بوک (برای مثال با نام JNB_endpoint.ipynb) ساخته و در یک سلول پکیج‌های مورد استفاده را import می‌کنیم:

import math import json REQUEST = json.dumps({ 'path' : {}, 'args' : {} })

این سلول، در هنگام لود نوت‌بوک تنها یکبار اجرا می‌شود، می‌توانید تمامی initializationهای خود را در این سلول انجام دهید.*

سپس سلولی دیگر مطابق زیر می‌سازیم:

# GET /convert req = json.loads(REQUEST) args = req['args'] if 'angle' not in args: print(json.dumps({'convertedAngle': None})) else: # Note the [0] when retrieving the argument. # This is because you could potentially pass multiple angles. angle = int(args['angle'][0]) converted = math.radians(angle) print(json.dumps({'convertedAngle': converted}))

به خط اول توجه کنید، در این خط با استفاده از یک کامنت، برای kernel gateway مشخص کردیم که در چه آدرسی (اینجا convert/) و به چه نوع ریکوئستی (اینجا GET) گوش کند. این سلول با هر ریکوئست GET در آدرس مشخص شده اجرا می‌شود.

در نهایت به صورت زیر نوت‌بوک خود را اجرا کنید:

$ jupyter kernelgateway --KernelGatewayApp.api='kernel_gateway.notebook_http' --KernelGatewayApp.seed_uri='/home/username/JNB_endpoint.ipynb' --port 8888

به همین راحتی ما نوت‌بوک خودمون رو به یک Rest API تبدیل کردیم. حالا اگر یک ریکوئست به Endpointمون که آدرس سرور و پورتی است که در دستور بالا مشخص کردیم (پیش‌فرض 8888:) بفرستیم نتیجه مورد انتظارمون رو می‌بینیم:

$ curl &quothttp://serverIp:8888/convert?angle=180&quot #{&quotconvertedAngle&quot: 3.141592653589793}

* هنگام ساخت نوت‌بوک به ساختن و initialize متغیر REQUEST دقت کنید، اینکار برای آن است که نوت‌بوک ما به صورت عادی قابل اجرا باشد، REQUEST متغیر خاصی است که Kernel Gateway به سلول‌های مربوط به API می‌فرستد. اگر این متغیر تعریف نشده باشد، با اجرای نوت‌بوک با استفاده از دستور بالا مشکلی ایجاد نمی‌کند اما اجرای عادی نوت‌بوک به دلیل تعریف نشدن این متغیر با خطا مواجه می‌شود؛ بنابراین این متغیر را initialize کردیم تا از این خطا جلوگیری کنیم.

نوت‌بوکی که ساختیم در این آدرس قابل دسترسی است و می‌توانید اینجا مشاهده کنید:

https://gist.github.com/mhsattarian/ca0cf359343d7b3894175660ac07be36

منابع

+ وبلاگ OUseful.Info

+ وبلاگ Eliot Andres


این پست در وبلاگ بینایی کامپیوتر نیز منتشر شده است.

پایتونژوپیترنوت بوکapirest
توسعه دهنده؛ متمرکز بر برنامه‌نویسی سمت وب و هوش مصنوعی. linktr.ee/mh_sattarian
شاید از این پست‌ها خوشتان بیاید