ایجاد JSON API با استفاده از پایتون

ترجمه و تالیف : ارسطو عباسی
تاریخ انتشار : 13 اسفند 98
خواندن در 3 دقیقه
دسته بندی ها : پایتون

به عنوان یک فرمت داده‌ای، JSON مزیت‌های زیادی را در امر خوانایی و سبک بودن دارد. این ویژگی‌ها باعث می‌شوند تا روند کار کردن با داده‌ها ساده‌تر، سریع‌تر و بهینه‌تر شود. همچنین این خصوصیات باعث می‌شوند که فرایند ارسال و پاسخ در درخواست‌های سرور منعطف‌تر بوده و با ترافیک معمولاً کمتری همراه باشد. 

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

یک مثال ساده از شیوه ارسال داده‌های JSON با استفاده از یک درخواست مبتنی بر وب:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def example():
   return '{"name":"Bob"}'

if __name__ == '__main__':
    app.run()

کتابخانه‌های مورد نیاز ما برای این مطلب:

  • Flask-REST-JSONAPI – این مورد در امر توسعه APIها که براساس مشخصات JSON API استاندارد پیش می‌رود مناسب است. 
  • Flask-SQLAlchemy – این مورد نیز کتابخانه‌ای است که با استفاده از SQLAlchemy به ما قابلیت ایجاد دیتابیس و کوئری گرفتن از آن را می‌دهد.

یک تصویر بزرگ

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

ایجاد JSON API با استفاده از پایتون

مراحلی که در روال پیاده‌سازی این اپلیکیشن باید پیاده‌سازی شود به صورت زیر است:

  • تعریف یک دیتابیس با استفاده از Flask-SQLAlchemy
  • ایجاد یک لایه Data Abstraction با استفاده از Marshmallow-JSONAPI
  • ایجاد یک سیستم مدیری منابع با استفاده از Flask-REST-JSONAPI
  • ایجاد یکسری URL endpoint برای فراخوانی API

نصب ماژول‌های مورد نیاز

قبل از آن‌که بخواهیم روال ایجاد پروژه را شروع کنیم نیاز است تا یک Virtual Environment جدید ایجاد کرده و تمام ماژول‌های مورد نیازمان را نصب کنیم. برای اینکار یک دایرکتوری جدید ایجاد کرده و وارد آن شوید:

$ mkdir flask-jsonapi-demo
$ cd flask-jsonapi-demo/

حال با استفاده از دستورهای زیر یک Virtual Environment جدید را ایجاد کنید و آن‌را فعال نمایید:

$ python -m venv .venv
$ source .venv/bin/activate

بعد از آن‌که Virtual Environment مورد نظر شما ایجاد شد حال نیاز است تا ماژول‌های مورد نیاز را نصب کنید. برای انجام این‌کار از دستور pip کمک می‌گیریم:

$ pip install flask-rest-jsonapi flask-sqlalchemy

هر آنچه را که ما قرار است نصب کنیم به صورت ملزومات پروژه در نظر گرفته می‌شود. این موارد شامل خود Flask و ماژول‌های دیگر می‌شود.

فایل‌هایی که در ابتدای کار این پروژه نیاز داریم یک فایل py برای خود اپلیکیشن اصلی و یک فایل db برای دیتابیس است. از این رو از طریق دستور touch این فایل‌ها را ایجاد می‌کنیم. اگر روی ویندوز هستید می‌توانید این کار را به صورت دستی انجام دهید:

$ touch application.py artists.db

ایجاد شِمای دیتابیس

برای ایجاد شِمای کلی دیتابیس نیاز است از طریق فایل application.py وارد عمل شویم. بنابراین این فایل را در ادیتور محبوب خود باز کرده و ماژول‌های جدید را import کنید. 

بعد از آن نیاز است تا یک نمونه جدید از کلاس Flask با نام app ایجاد کرده و سپس در مرحله نهایی بعد دیتابیس ایجاد شده را به اپلیکیشن معرفی می‌کنیم. در نهایت هم ساختار دیتابیس را با استفاده از یک کلاس ایجاد می‌کنیم:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# Create a new Flask application
app = Flask(__name__)

# Set up SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////artists.db'
db = SQLAlchemy(app)

# Define a class for the Artist table
class Artist(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    birth_year = db.Column(db.Integer)
    genre = db.Column(db.String)

# Create the table
db.create_all()

ایجاد لایه مفهومی یا Abstraction Layer

در مرحله بعدی قصد داریم تا از ماژول Marshmallow-JSONAPI برای ایجاد یک ساختار منطقی/انتزاعی از جداول و دیتابیسی که ساخته‌ایم استفاده کنیم.

دلیل ایجاد این لایه ساده است. با استفاده از این مورد شما دسترسی بسیار کامل‌تری روی داده‌هایی که قرار است توسط API برگشت داده شود دارید. به این لایه مانند یک لنز نگاه کنید که با استفاده از آن API کلاینت می‌تواند با دقت بیشتری داده‌های مربوطه را مشاهده کند.

ایجاد JSON API با استفاده از پایتون

در کدهایی که در ادامه مشاهده خواهید کرد لایه مفهومی داده به عنوان یک کلاس که از Marshmallow-JSONAPI ارث بری کرده است ایجاد می‌شود. با استفاده از این کلاس ما قابلیت آن‌را خواهیم داشت که از طریق یک API به چندین رکورد مختلف از دیتابیس ساخته شده دسترسی داشته باشیم. 

در داخل این کلاس ما یک کلاس Meta را نیز خواهیم داشت که در‌واقع برای تعریف متاداده‌های مربوط به کلاس اصلی استفاده می‌شود. برای مثال یکی از کاربردهای این کلاس Meta قابلیت تعریف URL endpointهای مختلف برای دریافت رکورد از دیتابیس است. همانطور که می‌دانید ما از طریق این endpointها به API دسترسی پیدا خواهیم کرد.

from marshmallow_jsonapi.flask import Schema
from marshmallow_jsonapi import fields

# Create data abstraction layer
class ArtistSchema(Schema):
    class Meta:
        type_ = 'artist'
        self_view = 'artist_one'
        self_view_kwargs = {'id': '<id>'}
        self_view_many = 'artist_many'

    id = fields.Integer()
    name = fields.Str(required=True)
    birth_year = fields.Integer(load_only=True)
    genre = fields.Str()

ایجاد مدیران منابع و URL endpointهای مورد نیاز

نکته نهایی پروژه ما در ایجاد یک مدیر منابع و endpoint مربوطه برای هر مسیر است. هر کدام از مواردی که به عنوان مدیر منابع شناخته می‌شوند در حقیقت کلاسی ارث بری شده از ResourceList و ResourceDetail هستند که از کتابخانه Flask-REST-JSONAPI گرفته می‌شوند.

در مرحله بعدی نیاز است تا api جدیدی را ایجاد کرده و مسیرهای مورد نظرمان را براساس Resource Managerهای ساخته شده ایجاد کنیم:

from flask_rest_jsonapi import Api, ResourceDetail, ResourceList

class ArtistMany(ResourceList):
    schema = ArtistSchema
    data_layer = {'session': db.session,
                  'model': Artist}

class ArtistOne(ResourceDetail):
    schema = ArtistSchema
    data_layer = {'session': db.session,
                  'model': Artist}

api = Api(app)
api.route(ArtistMany, 'artist_many', '/artists')
api.route(ArtistOne, 'artist_one', '/artists/<int:id>')

# main loop to run app in debug mode
if __name__ == '__main__':
    app.run(debug=True)

ایجاد درخواست‌های POST و GET

حال می‌توانیم با ایجاد یک HTTP Request برنامه یا API ساخته شده را اجرا کنیم. این کار را می‌توانید از طریق مرورگر و یا ترمینال انجام دهید. Curl برنامه‌ای مبتنی بر ترمینال است که می‌تواند برای انجام چنین کاری به شما کمک بکند. 

ابتدای کار نیاز است تا برنامه یا سرورتان را اجرا کنید. برای این‌کار فایل application.py را اجرا نمایید:

$ python application.py

حال اگر در مرورگر آدرس http://localhost:5000/artists را اجرا کنید می‌توانید خروجی JSON تمام رکوردهای دیتابیس را مشاهده کنید. البته در نظر داشته باشید که ما هنوز رکورد جدیدی را ایجاد نکرده‌ایم. برای ایجاد رکوردهای جدید می‌توانید به صورت دستی رکوردهایی را به دیتابیس اضافه کنید. همچنین می‌توانید این کار را از طریق یک درخواست POST انجام دهید:

curl -i -X POST -H 'Content-Type: application/json' -d '{"data":{"type":"artist", "attributes":{"name":"Salvador Dali", "birth_year":1904, "genre":"Surrealism"}}}' http://localhost:5000/artists

در پایان

پیاده‌سازی API با استفاده از پایتون و با قدرت گرفتن از JSON کار پیچیده و سختی نیست تنها باید بتوانید ارتباط میان قسمت‌های مختلف را به‌خوبی برقرار کنید. در این مطلب از وب‌سایت راکت ما سعی داشتیم تا شما را با این موضوع آشنا کنیم.

منبع

گردآوری و تالیف ارسطو عباسی
آفلاین
user-avatar

من ارسطو‌ام :) کافی نیست؟! :)

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید