Menulis API dengan Python (dengan Flask dan RapidAPI)

Menulis API dengan Python (dengan Flask dan RapidAPI)

Jika Anda membaca artikel ini, Anda mungkin sudah familiar dengan kemungkinan penggunaan API (Application Programming Interface).

Dengan menambahkan salah satu dari banyak API terbuka ke aplikasi Anda, Anda dapat memperluas fungsionalitas aplikasi atau memperkayanya dengan data yang diperlukan. Namun bagaimana jika Anda mengembangkan fitur unik yang ingin Anda bagikan kepada komunitas?

Jawabannya sederhana: Anda perlu buat API Anda sendiri.

Meskipun ini mungkin tampak seperti tugas yang sulit pada awalnya, namun sebenarnya ini sederhana. Kami akan menunjukkan cara melakukannya menggunakan Python.

Apa yang Anda butuhkan untuk memulai

Untuk mengembangkan API, Anda memerlukan:

  • Piton 3;
  • Labu — kerangka kerja sederhana dan mudah digunakan untuk membuat aplikasi web;
  • Labu-TENANG adalah ekstensi untuk Flask yang memungkinkan Anda mengembangkan REST API dengan cepat dan dengan konfigurasi minimal.

Instalasi dilakukan dengan perintah:

pip install flask-restful

Kami merekomendasikan kursus pemrograman intensif gratis untuk pemula:
Pengembangan bot Telegram di C# — 26–28 Agustus. Kursus intensif gratis yang memungkinkan Anda memahami cara kerja asisten bot, spesifikasi bekerja dengan API Telegram, dan nuansa lainnya. Tiga peserta terbaik akan menerima 30 rubel dari Skillbox.

Sebelum kamu memulai

Kami akan mengembangkan RESTful API dengan basic fungsionalitas CRUID.

Untuk memahami tugas ini sepenuhnya, mari kita pahami dua istilah yang disebutkan di atas.

Apa itu REST?

REST API (Representational State Transfer) adalah API yang menggunakan permintaan HTTP untuk bertukar data.

REST API harus memenuhi kriteria tertentu:

  • Arsitektur klien-server: Klien berinteraksi dengan antarmuka pengguna, dan server berinteraksi dengan backend dan penyimpanan data. Klien dan server bersifat independen, salah satunya dapat diganti secara terpisah dari yang lain.
  • Stateless - tidak ada data klien yang disimpan di server. Status sesi disimpan di sisi klien.
  • Cacheability - Klien dapat menyimpan respons server dalam cache untuk meningkatkan kinerja secara keseluruhan.

Apa itu CRUD?

kasar adalah konsep pemrograman yang menjelaskan empat tindakan dasar (membuat, membaca, memperbarui, dan menghapus).

Di REST API, jenis permintaan dan metode permintaan bertanggung jawab atas tindakan seperti memposting, mendapatkan, memasukkan, menghapus.

Sekarang setelah kita memahami istilah dasarnya, kita dapat mulai membuat API.

Pembangunan

Mari buat gudang kutipan tentang kecerdasan buatan. AI adalah salah satu teknologi dengan pertumbuhan tercepat saat ini, dan Python adalah alat yang populer untuk bekerja dengan AI.

Dengan API ini, pengembang Python dapat dengan cepat mendapatkan informasi tentang AI dan mendapatkan inspirasi dari kemajuan baru. Jika pengembang mempunyai pemikiran berharga mengenai topik ini, dia akan dapat menambahkannya ke repositori.

Mari kita mulai dengan mengimpor modul yang diperlukan dan menyiapkan Flask:

from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)

Dalam cuplikan ini, Flask, Api dan Resource adalah kelas yang kita butuhkan.

Reqparse adalah antarmuka penguraian kueri Flask-RESTful... Anda juga memerlukan modul acak untuk menampilkan kutipan acak.

Sekarang kita akan membuat gudang kutipan tentang AI.

Setiap entri repo akan berisi:

  • tanda pengenal digital;
  • nama penulis kutipan;
  • mengutip.

Karena ini hanyalah contoh pelatihan, kami akan menyimpan semua entri dalam daftar Python. Dalam aplikasi nyata, kita mungkin akan menggunakan database.

ai_quotes = [
    {
        "id": 0,
        "author": "Kevin Kelly",
        "quote": "The business plans of the next 10,000 startups are easy to forecast: " +
                 "Take X and add AI."
    },
    {
        "id": 1,
        "author": "Stephen Hawking",
        "quote": "The development of full artificial intelligence could " +
                 "spell the end of the human race… " +
                 "It would take off on its own, and re-design " +
                 "itself at an ever increasing rate. " +
                 "Humans, who are limited by slow biological evolution, " +
                 "couldn't compete, and would be superseded."
    },
    {
        "id": 2,
        "author": "Claude Shannon",
        "quote": "I visualize a time when we will be to robots what " +
                 "dogs are to humans, " +
                 "and I’m rooting for the machines."
    },
    {
        "id": 3,
        "author": "Elon Musk",
        "quote": "The pace of progress in artificial intelligence " +
                 "(I’m not referring to narrow AI) " +
                 "is incredibly fast. Unless you have direct " +
                 "exposure to groups like Deepmind, " +
                 "you have no idea how fast — it is growing " +
                 "at a pace close to exponential. " +
                 "The risk of something seriously dangerous " +
                 "happening is in the five-year timeframe." +
                 "10 years at most."
    },
    {
        "id": 4,
        "author": "Geoffrey Hinton",
        "quote": "I have always been convinced that the only way " +
                 "to get artificial intelligence to work " +
                 "is to do the computation in a way similar to the human brain. " +
                 "That is the goal I have been pursuing. We are making progress, " +
                 "though we still have lots to learn about " +
                 "how the brain actually works."
    },
    {
        "id": 5,
        "author": "Pedro Domingos",
        "quote": "People worry that computers will " +
                 "get too smart and take over the world, " +
                 "but the real problem is that they're too stupid " +
                 "and they've already taken over the world."
    },
    {
        "id": 6,
        "author": "Alan Turing",
        "quote": "It seems probable that once the machine thinking " +
                 "method had started, it would not take long " +
                 "to outstrip our feeble powers… " +
                 "They would be able to converse " +
                 "with each other to sharpen their wits. " +
                 "At some stage therefore, we should " +
                 "have to expect the machines to take control."
    },
    {
        "id": 7,
        "author": "Ray Kurzweil",
        "quote": "Artificial intelligence will reach " +
                 "human levels by around 2029. " +
                 "Follow that out further to, say, 2045, " +
                 "we will have multiplied the intelligence, " +
                 "the human biological machine intelligence " +
                 "of our civilization a billion-fold."
    },
    {
        "id": 8,
        "author": "Sebastian Thrun",
        "quote": "Nobody phrases it this way, but I think " +
                 "that artificial intelligence " +
                 "is almost a humanities discipline. It's really an attempt " +
                 "to understand human intelligence and human cognition."
    },
    {
        "id": 9,
        "author": "Andrew Ng",
        "quote": "We're making this analogy that AI is the new electricity." +
                 "Electricity transformed industries: agriculture, " +
                 "transportation, communication, manufacturing."
    }
]

Sekarang kita perlu membuat kelas sumber daya Quote yang akan menentukan operasi titik akhir API kita. Di dalam kelas Anda perlu mendeklarasikan empat metode: get, post, put, delete.

Mari kita mulai dengan metode GET

Ini memungkinkan untuk mendapatkan penawaran harga tertentu dengan menentukan ID-nya, atau penawaran acak jika ID tidak ditentukan.

class Quote(Resource):
    def get(self, id=0):
        if id == 0:
            return random.choice(ai_quotes), 200
        for quote in ai_quotes:
            if(quote["id"] == id):
                return quote, 200
        return "Quote not found", 404

Metode GET mengembalikan kutipan acak jika ID berisi nilai default, yaitu. tidak ada ID yang ditentukan saat memanggil metode ini.

Jika ditentukan, maka metode akan mencari di antara kutipan dan menemukan kutipan yang berisi ID yang ditentukan. Jika tidak ada yang ditemukan, pesan “Kutipan tidak ditemukan, 404” ditampilkan.

Ingat: metode ini mengembalikan status HTTP 200 jika permintaan berhasil dan 404 jika catatan tidak ditemukan.

Sekarang mari kita buat metode POST untuk menambahkan kutipan baru ke repositori

Ini akan mendapatkan ID dari setiap kutipan baru saat Anda mengetik. Selain itu, POST akan menggunakan reqparse untuk mengurai parameter yang akan masuk ke isi permintaan (teks penulis dan kutipan).

def post(self, id):
      parser = reqparse.RequestParser()
      parser.add_argument("author")
      parser.add_argument("quote")
      params = parser.parse_args()
      for quote in ai_quotes:
          if(id == quote["id"]):
              return f"Quote with id {id} already exists", 400
      quote = {
          "id": int(id),
          "author": params["author"],
          "quote": params["quote"]
      }
      ai_quotes.append(quote)
      return quote, 201

Pada kode di atas, metode POST menerima ID kutipan. Kemudian, dengan menggunakan reqparse, ia mengambil penulis dan kutipan dari kueri, menyimpannya dalam kamus params.

Jika kutipan dengan ID yang ditentukan sudah ada, metode akan menampilkan pesan terkait dan kode 400.

Jika kutipan dengan ID yang ditentukan belum dibuat, metode ini akan membuat catatan baru dengan ID dan penulis yang ditentukan, serta parameter lainnya. Kemudian menambahkan entri ke daftar ai_quotes dan mengembalikan entri dengan kutipan baru bersama dengan kode 201.

Sekarang kita membuat metode PUT untuk mengubah kutipan yang ada di repositori

def put(self, id):
      parser = reqparse.RequestParser()
      parser.add_argument("author")
      parser.add_argument("quote")
      params = parser.parse_args()
      for quote in ai_quotes:
          if(id == quote["id"]):
              quote["author"] = params["author"]
              quote["quote"] = params["quote"]
              return quote, 200
      
      quote = {
          "id": id,
          "author": params["author"],
          "quote": params["quote"]
      }
      
      ai_quotes.append(quote)
      return quote, 201

Metode PUT, mirip dengan contoh sebelumnya, mengambil ID dan memasukkan serta mem-parsing parameter kutipan menggunakan reqparse.

Jika ada kutipan dengan ID yang ditentukan, metode akan memperbaruinya dengan parameter baru dan kemudian mengeluarkan kutipan yang diperbarui dengan kode 200. Jika belum ada kutipan dengan ID yang ditentukan, catatan baru dengan kode 201 akan dibuat.

Terakhir, mari buat metode DELETE untuk menghapus kutipan yang tidak lagi menginspirasi

def delete(self, id):
      global ai_quotes
      ai_quotes = [qoute for qoute in ai_quotes if qoute["id"] != id]
      return f"Quote with id {id} is deleted.", 200

Metode ini mendapatkan ID kutipan sebagai masukan dan memperbarui daftar ai_quotes menggunakan daftar bersama.

Sekarang kita telah membuat semua metode, yang perlu kita lakukan hanyalah menambahkan sumber daya ke API, mengatur jalur, dan menjalankan Flask.

api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>")
if __name__ == '__main__':
    app.run(debug=True)

Layanan REST API kami sudah siap!

Selanjutnya, kita dapat menyimpan kode ke file app.py dengan menjalankannya di konsol menggunakan perintah:

python3 app.py

Jika semuanya baik-baik saja, maka kita akan mendapatkan sesuatu seperti ini:

* Mode debug: aktif
*Berjalan 127.0.0.1:5000/ (Tekan CTRL+C untuk keluar)
* Memulai ulang dengan stat
* Debugger aktif!
* PIN Debugger: XXXXXXX

Menguji API

Setelah API dibuat, API perlu diuji.

Hal ini dapat dilakukan menggunakan utilitas konsol curl atau klien Insomnia REST, atau dengan menerbitkan API di Rapid API.

Menulis API dengan Python (dengan Flask dan RapidAPI)

Menerbitkan API kami

RapidAPI adalah pasar terbesar di dunia dengan lebih dari 10 API (dan sekitar 000 juta pengembang).

RapidAPI tidak hanya menyediakan antarmuka tunggal untuk bekerja dengan API pihak ketiga, namun juga memberi Anda kemampuan untuk mempublikasikan API Anda sendiri dengan cepat dan mudah.

Untuk untuk melakukan ini, Anda harus mempublikasikannya terlebih dahulu di beberapa server di jaringan. Dalam kasus kami, kami akan menggunakan Heroku. Bekerja dengannya seharusnya tidak menimbulkan kesulitan, (Anda dapat mengetahui lebih banyak tentang dia di sini).

Cara Memublikasikan API Anda di Heroku

1. Instal Heroku.

Langkah pertama adalah mendaftar dan menginstal Heroku Command Line Interface (CLI). Ini berfungsi di Ubuntu 16+.

sudo snap install heroku —klasik

Kemudian masuk:

login heroku

2. Tambahkan file yang diperlukan.

Sekarang kita perlu menambahkan file yang akan dipublikasikan ke folder di aplikasi kita:

  • persyaratan.txt dengan daftar modul Python yang diperlukan;
  • Procfile, yang menentukan perintah apa yang harus dijalankan untuk menjalankan aplikasi;
  • .gitignore - untuk mengecualikan file yang tidak diperlukan di server.

File persyaratan.txt akan berisi baris berikut:

  • labu
  • termos-tenang
  • gunicorn

Harap dicatat bahwa kami telah menambahkan gunicorn (Python WSGI HTTP Server) ke dalam daftar karena kami perlu menjalankan aplikasi kami di server.

Procfile akan berisi:

web: aplikasi gunicorn: aplikasi

Isi .gitignore:

*.pyc
__pycache__/

Sekarang setelah file dibuat, mari inisialisasi repo git dan komit:

git init
git add
git commit -m "First API commit"

3. Buat aplikasi Heroku baru.

heroku create

Kami mendorong cabang master ke repo Heroku jarak jauh:

git push heroku master

Sekarang Anda dapat memulai dengan membuka Layanan API menggunakan perintah:

heroku ps:scale web=1
heroku open
 

API akan tersedia di nama-heroku-acak-Anda.herokuapp.com/ai-quotes.

Bagaimana cara menambahkan API Python Anda ke pasar RapidAPI

Setelah layanan API Anda dipublikasikan di Heroku, Anda dapat menambahkannya ke Rapid API. Di Sini dokumentasi rinci pada topik ini.

1. Buat akun RapidAPI.

Menulis API dengan Python (dengan Flask dan RapidAPI)

Daftarkan akun gratis - ini dapat dilakukan menggunakan Facebook, Google, GitHub.

Menulis API dengan Python (dengan Flask dan RapidAPI)

2. Tambahkan API ke panel kontrol.

Menulis API dengan Python (dengan Flask dan RapidAPI)

3. Selanjutnya, masukkan informasi umum tentang API Anda.

Menulis API dengan Python (dengan Flask dan RapidAPI)

4. Setelah mengklik “Tambahkan API” akan muncul halaman baru di mana Anda dapat memasukkan informasi tentang API kami.

Menulis API dengan Python (dengan Flask dan RapidAPI)

5. Sekarang Anda dapat memasukkan titik akhir API secara manual atau mengunduhnya file angkuh menggunakan OpenAPI.

Menulis API dengan Python (dengan Flask dan RapidAPI)

Nah, sekarang kita perlu mengatur endpoint API kita di halaman Endpoints. Dalam kasus kami, titik akhir sesuai dengan konsep CRUD (dapatkan, posting, taruh, hapus).

Menulis API dengan Python (dengan Flask dan RapidAPI)

Selanjutnya, Anda perlu membuat titik akhir GET AI Quote yang menampilkan kutipan acak (jika ID default) atau kutipan untuk ID yang ditentukan.

Untuk membuat titik akhir, klik tombol “Buat Titik Akhir”.

Menulis API dengan Python (dengan Flask dan RapidAPI)

Kami mengulangi proses ini untuk semua titik akhir API lainnya. Itu saja! Selamat, Anda telah memublikasikan API Anda!

Jika semuanya baik-baik saja, halaman API akan terlihat seperti ini:

Menulis API dengan Python (dengan Flask dan RapidAPI)

Kesimpulan

Dalam artikel ini, kita mempelajari proses pembuatan Layanan RESTful API Anda sendiri dengan Python, serta proses penerbitan API ke cloud Heroku dan menambahkannya ke direktori RapidAPI.

Namun versi pengujian hanya menunjukkan prinsip dasar pengembangan API - nuansa seperti keamanan, toleransi kesalahan, dan skalabilitas tidak dipertimbangkan.

Saat mengembangkan API nyata, semua ini perlu diperhitungkan.

Sumber: www.habr.com

Tambah komentar