Menulis API dengan Python (dengan Flask dan RapidAPI)



Jika Anda membaca artikel ini, Anda mungkin sudah terbiasa dengan kemungkinan yang terbuka menggunakan API (Application Programming Interface).

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

Jawabannya sederhana: Anda perlu membuat API Anda sendiri .

Terlepas dari kenyataan bahwa pada awalnya itu tampak seperti tugas yang menakutkan, pada kenyataannya, semuanya sederhana. Kami akan menunjukkan kepada Anda bagaimana melakukan ini dengan Python.

Apa yang Anda butuhkan untuk memulai


Untuk mengembangkan API, Anda perlu:

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

Instalasi dilakukan dengan perintah:

pip install flask-restful 

Pemrograman intensif intensif gratis yang disarankan untuk pemula:
Pengembangan bot Telegram di C # - 26-28 Agustus. Intensif gratis yang memungkinkan Anda untuk memahami cara kerja bot asisten, dalam fitur bekerja dengan API Telegram dan nuansa lainnya. Tiga peserta terbaik akan menerima 30.000 rubel dari Skillbox .
Sebelum Anda mulai

Kami akan mengembangkan API RESTful dengan fungsionalitas CRUID dasar.

Untuk memahami sepenuhnya masalahnya, mari kita lihat dua istilah yang disebutkan di atas.

Apa itu REST?

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

API REST harus memenuhi kriteria tertentu:

  • Arsitektur client-server: klien berinteraksi dengan antarmuka pengguna, dan server berinteraksi dengan backend dan data warehouse. 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 untuk meningkatkan kinerja secara keseluruhan.

Apa itu CRUD?

CRUD adalah konsep pemrograman yang menjelaskan empat tindakan dasar (buat, baca, perbarui, dan hapus).

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

Sekarang setelah kami mengetahui persyaratan dasarnya, Anda dapat mulai membuat API.

Pengembangan


Mari kita buat repositori kutipan tentang kecerdasan buatan. AI adalah salah satu teknologi yang paling cepat berkembang 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 terinspirasi oleh perkembangan baru. Jika pengembang memiliki pemikiran yang berharga tentang topik ini, ia akan dapat menambahkannya ke repositori.

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

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

Dalam cuplikan ini, Labu, Api, dan Sumberdaya adalah kelas yang kita butuhkan.

Reqparse adalah antarmuka parsing permintaan Flask-RESTful ... Anda juga akan memerlukan modul acak untuk menampilkan kutipan acak.

Sekarang kita akan membuat repositori kutipan AI.

Setiap entri repo akan berisi:

  • ID digital
  • nama penulis kutipan;
  • kutipan

Karena ini hanyalah contoh untuk pelatihan, kami akan menyimpan semua entri dalam daftar Python. Dalam aplikasi nyata, kita kemungkinan besar 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 Kutipan kelas sumber daya, yang akan menentukan operasi titik akhir API kita. Empat metode harus dideklarasikan di dalam kelas: get, post, put, delete.

Mari kita mulai dengan metode GET.

Itu memungkinkan untuk mendapatkan penawaran spesifik dengan menetapkan ID atau kutipan 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 Saat memanggil metode, tidak ada ID yang ditetapkan.

Jika ditentukan, metode mencari di antara tanda kutip dan menemukan yang berisi ID yang ditentukan. Jika tidak ada yang ditemukan, pesan "Penawaran 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 menerima pengidentifikasi setiap kutipan baru saat Anda mengetik. Selain itu, POST akan menggunakan reqparse untuk mem-parsing parameter yang akan masuk dalam tubuh permintaan (penulis dan teks 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 

Dalam kode di atas, metode POST menerima ID penawaran. Kemudian, menggunakan reqparse, ia mendapatkan penulis dan kutipan dari kueri, menyimpannya di kamus params.

Jika kutipan dengan ID yang ditentukan sudah ada, maka metode ini menampilkan pesan dan kode 400 yang sesuai.

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

Sekarang buat 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 input dan mem-parsing parameter kutipan menggunakan reqparse.

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

Akhirnya, mari kita 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 saat Anda mengetik dan memperbarui daftar ai_quotes menggunakan daftar umum.

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 siap!

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

 python3 app.py 

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

* Mode debug: aktif
* Berjalan pada 127.0.0.1 : 5000 / (Tekan CTRL + C untuk berhenti)
* Restart dengan stat
* Debugger aktif!
* PIN debugger: XXXXXXX

Pengujian API

Setelah API dibuat, itu perlu diuji.

Ini dapat dilakukan dengan menggunakan utilitas konsol ikal atau klien Insomnia REST atau dengan menerbitkan API ke API Cepat.



Publikasikan API kami

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

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

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 mempelajari lebih lanjut tentang dia di sini ).

Bagaimana cara mempublikasikan API Anda di Heroku

1. Instal Heroku.

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

sudo jepret instal heroku --classic

Kemudian masuk:

login heroku

2. Tambahkan file yang diperlukan.

Sekarang kita perlu menambahkan file untuk publikasi ke folder di aplikasi kita:

  • requirement.txt dengan daftar modul Python yang diperlukan;
  • Procfile, yang menunjukkan perintah mana yang harus dijalankan untuk meluncurkan aplikasi;
  • .gitignore - untuk mengecualikan file yang tidak diperlukan di server.

File requirement.txt akan berisi baris-baris berikut:

  • labu
  • labu-nyenyak
  • gunicorn

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

Procfile akan berisi:

web: aplikasi gunicorn: app

Isi .gitignore:

 *.pyc __pycache__/ 

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

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

3. Buat aplikasi Heroku baru.

 heroku create 

Kami mengirim cabang utama ke repo Heroku jarak jauh:

 git push heroku master 

Sekarang Anda bisa mulai dengan membuka Layanan API menggunakan perintah:

 heroku ps:scale web=1 heroku open 

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

Cara menambahkan API Python Anda ke pasar RapidAPI

Setelah layanan API dipublikasikan di Heroku, Anda dapat menambahkannya ke Rapid API. Berikut adalah dokumentasi terperinci tentang topik ini.

1. Buat akun RapidAPI.



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



2. Tambahkan API ke panel kontrol.



3. Selanjutnya, masukkan informasi umum tentang API Anda.



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



5. Sekarang Anda dapat memasukkan titik akhir API secara manual, atau mengunduh file sombong menggunakan OpenAPI.



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



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".



Ulangi proses ini untuk semua titik akhir API lainnya. Itu saja! Selamat, Anda telah menerbitkan API Anda!

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



Kesimpulan


Dalam artikel ini, kami mengeksplorasi proses pembuatan Layanan API RESTful Anda sendiri dengan Python, bersamaan dengan proses penerbitan API ke cloud Heroku dan menambahkannya ke direktori RapidAPI.

Tetapi dalam versi uji, hanya prinsip dasar pengembangan API yang ditampilkan - nuansa seperti keamanan, toleransi kesalahan dan skalabilitas tidak dipertimbangkan.

Saat mengembangkan API nyata, semua ini harus diperhitungkan.

Source: https://habr.com/ru/post/id464705/


All Articles