Menulis API dalam Python (dengan Flask dan RapidAPI)

Menulis API dalam Python (dengan Flask dan RapidAPI)

Jika anda membaca artikel ini, anda mungkin sudah biasa dengan kemungkinan yang datang dengan menggunakan API (Antara Muka Pengaturcaraan Aplikasi).

Dengan menambahkan salah satu daripada banyak API terbuka pada aplikasi anda, anda boleh melanjutkan fungsi aplikasi atau memperkayakannya dengan data yang diperlukan. Tetapi bagaimana jika anda membangunkan ciri unik yang ingin anda kongsi dengan komuniti?

Jawapannya mudah: anda perlukan buat API anda sendiri.

Walaupun ini mungkin kelihatan seperti tugas yang sukar pada mulanya, ia sebenarnya mudah. Kami akan menunjukkan kepada anda cara melakukan ini menggunakan Python.

Apa yang anda perlukan untuk bermula

Untuk membangunkan API anda perlukan:

  • Python 3;
  • Flask β€” rangka kerja yang ringkas dan mudah digunakan untuk mencipta aplikasi web;
  • Flask-RESTful ialah sambungan untuk Flask yang membolehkan anda membangunkan API REST dengan cepat dan dengan konfigurasi minimum.

Pemasangan dilakukan dengan arahan:

pip install flask-restful

Kami mengesyorkan kursus pengaturcaraan intensif percuma untuk pemula:
Pembangunan bot Telegram dalam C# β€” 26–28 Ogos. Kursus intensif percuma yang membolehkan anda memahami cara bot pembantu berfungsi, spesifikasi bekerja dengan API Telegram dan nuansa lain. Tiga peserta terbaik akan menerima 30 rubel daripada Skillbox.

Sebelum awak mula

Kami akan membangunkan API RESTful dengan asas Fungsi CRUID.

Untuk memahami tugasan sepenuhnya, mari kita fahami dua istilah yang disebutkan di atas.

Apa itu REST?

REST API (Representational State Transfer) ialah API yang menggunakan permintaan HTTP untuk menukar data.

API REST mesti memenuhi kriteria tertentu:

  • Seni bina pelayan-pelanggan: Pelanggan berinteraksi dengan antara muka pengguna, dan pelayan berinteraksi dengan bahagian belakang dan storan data. Pelanggan dan pelayan adalah bebas, mana-mana daripada mereka boleh diganti secara berasingan daripada yang lain.
  • Stateless - tiada data pelanggan disimpan pada pelayan. Keadaan sesi disimpan di bahagian klien.
  • Kebolehcache - Pelanggan boleh cache jawapan pelayan untuk meningkatkan prestasi keseluruhan.

Apa itu CRUD?

JENAYAH ialah konsep pengaturcaraan yang menerangkan empat tindakan asas (buat, baca, kemas kini dan padam).

Dalam REST API, jenis permintaan dan kaedah permintaan bertanggungjawab untuk tindakan seperti hantar, dapatkan, letak, padam.

Sekarang setelah kami memahami istilah asas, kami boleh mula mencipta API.

Pembangunan

Mari buat repositori petikan tentang kecerdasan buatan. AI ialah salah satu teknologi yang paling pesat berkembang hari ini, dan Python ialah alat yang popular untuk bekerja dengan AI.

Dengan API ini, pembangun Python boleh mendapatkan maklumat tentang AI dengan cepat dan mendapat inspirasi daripada kemajuan baharu. Jika pembangun mempunyai pemikiran yang berharga tentang topik ini, dia akan dapat menambahkannya pada repositori.

Mari mulakan dengan mengimport modul yang diperlukan dan menyediakan Flask:

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

Dalam coretan ini, Flask, Api dan Sumber ialah kelas yang kami perlukan.

Reqparse ialah antara muka penghuraian pertanyaan Flask-RESTful... Anda juga memerlukan modul rawak untuk memaparkan petikan rawak.

Sekarang kami akan membuat repositori petikan tentang AI.

Setiap entri repo akan mengandungi:

  • ID digital;
  • nama pengarang petikan;
  • petikan.

Oleh kerana ini hanyalah contoh latihan, kami akan menyimpan semua entri dalam senarai Python. Dalam aplikasi sebenar, kami mungkin akan menggunakan pangkalan data sebaliknya.

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 mencipta kelas sumber Sebut Harga yang akan mentakrifkan operasi titik akhir API kami. Di dalam kelas anda perlu mengisytiharkan empat kaedah: dapatkan, hantar, letak, padam.

Mari kita mulakan dengan kaedah GET

Ia memungkinkan untuk mendapatkan sebut harga tertentu dengan menyatakan IDnya, atau petikan rawak jika ID tidak dinyatakan.

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

Kaedah GET mengembalikan petikan rawak jika ID mengandungi nilai lalai, i.e. tiada ID dinyatakan semasa memanggil kaedah.

Jika ia dinyatakan, maka kaedah mencari antara petikan dan mencari yang mengandungi ID yang ditentukan. Jika tiada apa yang ditemui, mesej "Petikan tidak dijumpai, 404" dipaparkan.

Ingat: kaedah mengembalikan status HTTP 200 jika permintaan berjaya dan 404 jika rekod tidak ditemui.

Sekarang mari kita buat kaedah POST untuk menambah petikan baharu pada repositori

Ia akan mendapat ID bagi setiap petikan baharu semasa anda menaip. Selain itu, POST akan menggunakan reqparse untuk menghuraikan parameter yang akan masuk ke dalam badan permintaan (teks pengarang dan petikan).

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

Dalam kod di atas, kaedah POST menerima ID petikan. Kemudian, menggunakan reqparse, ia mendapatkan semula pengarang dan petikan daripada pertanyaan, menyimpannya dalam kamus params.

Jika petikan dengan ID yang ditentukan sudah wujud, kaedah tersebut memaparkan mesej dan kod 400 yang sepadan.

Jika petikan dengan ID yang ditentukan belum lagi dibuat, kaedah mencipta rekod baharu dengan ID dan pengarang yang ditentukan, serta parameter lain. Ia kemudian menambah entri ke senarai ai_quotes dan mengembalikan entri dengan petikan baharu bersama kod 201.

Sekarang kita mencipta kaedah PUT untuk menukar sebut harga sedia ada dalam 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

Kaedah PUT, sama seperti contoh sebelumnya, mengambil ID dan input dan menghuraikan parameter petikan menggunakan reqparse.

Jika petikan dengan ID yang ditentukan wujud, kaedah akan mengemas kininya dengan parameter baharu dan kemudian mengeluarkan petikan yang dikemas kini dengan kod 200. Jika tiada petikan dengan ID yang ditentukan lagi, rekod baharu dengan kod 201 akan dibuat.

Akhir sekali, mari buat kaedah DELETE untuk mengalih keluar petikan yang tidak lagi memberi inspirasi

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

Kaedah ini mendapat ID petikan sebagai input dan mengemas kini senarai ai_quotes menggunakan senarai kongsi.

Memandangkan kita telah mencipta semua kaedah, kita hanya perlu menambah sumber pada API, tetapkan laluan dan jalankan Flask.

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

Perkhidmatan REST API kami sedia!

Seterusnya, kita boleh menyimpan kod ke fail app.py dengan menjalankannya dalam konsol menggunakan arahan:

python3 app.py

Jika semuanya baik, maka kita akan mendapat sesuatu seperti ini:

* Mod nyahpepijat: hidup
*Berjalan terus 127.0.0.1:5000/ (Tekan CTRL+C untuk berhenti)
* Memulakan semula dengan stat
* Penyahpepijat aktif!
* PIN Penyahpepijat: XXXXXXX

Menguji API

Sebaik sahaja API dibuat, ia perlu diuji.

Ini boleh dilakukan menggunakan utiliti konsol curl atau klien Insomnia REST, atau dengan menerbitkan API pada Rapid API.

Menulis API dalam Python (dengan Flask dan RapidAPI)

Menerbitkan API kami

RapidAPI ialah pasaran terbesar di dunia dengan lebih daripada 10 API (dan kira-kira 000 juta pembangun).

RapidAPI bukan sahaja menyediakan antara muka tunggal untuk bekerja dengan API pihak ketiga, tetapi juga membolehkan anda menerbitkan API anda sendiri dengan cepat dan mudah.

Untuk lakukannya, anda perlu menerbitkannya pada beberapa pelayan pada rangkaian terlebih dahulu. Dalam kes kami, kami akan menggunakan Heroku. Bekerja dengannya tidak sepatutnya menyebabkan sebarang kesulitan, (anda boleh mengetahui lebih lanjut tentang beliau di sini).

Cara Menerbitkan API Anda pada Heroku

1. Pasang Heroku.

Langkah pertama ialah mendaftar dan memasang Antaramuka Barisan Perintah Heroku (CLI). Ini berfungsi pada Ubuntu 16+.

sudo snap install heroku β€”klasik

Kemudian log masuk:

log masuk heroku

2. Tambah fail yang diperlukan.

Sekarang kita perlu menambah fail untuk diterbitkan ke folder dalam aplikasi kami:

  • requirements.txt dengan senarai modul Python yang diperlukan;
  • Procfile, yang menentukan arahan yang mesti dilaksanakan untuk menjalankan aplikasi;
  • .gitignore - untuk mengecualikan fail yang tidak diperlukan pada pelayan.

Fail requirements.txt akan mengandungi baris berikut:

  • kelalang
  • kelalang-tenang
  • gunicorn

Sila ambil perhatian bahawa kami telah menambah gunicorn (Python WSGI HTTP Server) pada senarai kerana kami perlu menjalankan aplikasi kami pada pelayan.

Profil akan mengandungi:

web: gunicorn app:app

Kandungan .giignore:

*.pyc
__pycache__/

Sekarang setelah fail dibuat, mari kita mulakan git repo dan komit:

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

3. Buat aplikasi Heroku baharu.

heroku create

Kami menolak cawangan induk ke repo Heroku jauh:

git push heroku master

Kini anda boleh bermula dengan membuka Perkhidmatan API menggunakan arahan:

heroku ps:scale web=1
heroku open
 

API akan tersedia di your-random-heroku-name.herokuapp.com/ai-quotes.

Bagaimana untuk menambah API Python anda ke pasaran RapidAPI

Setelah perkhidmatan API anda diterbitkan pada Heroku, anda boleh menambahkannya pada API Rapid. Di sini dokumentasi terperinci mengenai topik ini.

1. Buat akaun RapidAPI.

Menulis API dalam Python (dengan Flask dan RapidAPI)

Daftar akaun percuma - ini boleh dilakukan menggunakan Facebook, Google, GitHub.

Menulis API dalam Python (dengan Flask dan RapidAPI)

2. Tambahkan API pada panel kawalan.

Menulis API dalam Python (dengan Flask dan RapidAPI)

3. Seterusnya, masukkan maklumat umum tentang API anda.

Menulis API dalam Python (dengan Flask dan RapidAPI)

4. Selepas mengklik "Tambah API" halaman baharu muncul di mana anda boleh memasukkan maklumat tentang API kami.

Menulis API dalam Python (dengan Flask dan RapidAPI)

5. Kini anda boleh sama ada memasukkan titik akhir API atau memuat turun secara manual fail kesombongan menggunakan OpenAPI.

Menulis API dalam Python (dengan Flask dan RapidAPI)

Nah, sekarang kita perlu menetapkan titik akhir API kami pada halaman Titik Akhir. Dalam kes kami, titik akhir sepadan dengan konsep CRUD (dapatkan, siarkan, letak, padam).

Menulis API dalam Python (dengan Flask dan RapidAPI)

Seterusnya, anda perlu mencipta titik akhir GET AI Quote yang memaparkan petikan rawak (jika ID adalah lalai) atau petikan untuk ID yang ditentukan.

Untuk membuat titik akhir, klik butang "Buat Titik Akhir".

Menulis API dalam Python (dengan Flask dan RapidAPI)

Kami mengulangi proses ini untuk semua titik akhir API yang lain. Itu sahaja! Tahniah, anda telah menerbitkan API anda!

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

Menulis API dalam Python (dengan Flask dan RapidAPI)

Kesimpulan

Dalam artikel ini, kami mempelajari proses mencipta Perkhidmatan API RESTful anda sendiri dalam Python, bersama-sama dengan proses penerbitan API ke awan Heroku dan menambahkannya pada direktori RapidAPI.

Tetapi versi ujian menunjukkan hanya prinsip asas pembangunan API - nuansa seperti keselamatan, toleransi kesalahan dan skalabiliti tidak dipertimbangkan.

Apabila membangunkan API sebenar, semua ini perlu diambil kira.

Sumber: www.habr.com

Tambah komen