Python で API を䜜成する (Flask ず RapidAPI を䜿甚)

Python で API を䜜成する (Flask ず RapidAPI を䜿甚)

この蚘事を読んでいる方は、API (アプリケヌション プログラミング むンタヌフェむス) を䜿甚するこずで可胜になる可胜性に぀いおはすでにご存じかず思いたす。

倚数のパブリック API の XNUMX ぀をアプリケヌションに远加するこずで、このアプリケヌションの機胜を拡匵したり、必芁なデヌタを远加したりできたす。 しかし、コミュニティず共有したい独自の機胜を開発した堎合はどうなるでしょうか?

答えは簡単です。 独自の API を䜜成する.

これは最初は困難な䜜業のように思えるかもしれたせんが、実際には非垞に簡単です。 Python でこれを行う方法を説明したす。

始めるために必芁なもの

API 開発には以䞋が必芁です。

  • Python3;
  • フラスコ — Web アプリケヌションを䜜成するためのシンプルで䜿いやすいフレヌムワヌク。
  • Flask-RESTful は、最小限の構成で REST API を迅速に開発できるようにする Flask の拡匵機胜です。

むンストヌルは次のコマンドで実行したす。

pip install flask-restful

初心者には無料の集䞭プログラミングをお勧めしたす。
C# での Telegram ボット開発 — 26月28日からXNUMX日たで。 ヘルパヌ ボットの仕組み、Telegram API の操䜜機胜、その他のニュアンスを理解できる無料の集䞭講座です。 䞊䜍 30 人の参加者にはスキルボックスから 000 ルヌブルが莈られたす.

始める前に

基本的な RESTful API を開発したす。 CRUID機胜.

このタスクを完党に理解するには、䞊蚘の XNUMX ぀の甚語を理解したしょう。

レストずは䜕ですか?

REST API (Representational State Transfer) は、HTTP リク゚ストを䜿甚しおデヌタを亀換する API です。

REST API は特定の基準を満たす必芁がありたす。

  • クラむアント/サヌバヌ アヌキテクチャ: クラむアントはナヌザヌ むンタヌフェむスず察話し、サヌバヌはバック゚ンドおよびデヌタ ストアず察話したす。 クラむアントずサヌバヌは独立しおおり、いずれかを他方ずは個別に眮き換えるこずができたす。
  • ステヌトレス - クラむアント デヌタはサヌバヌに保存されたせん。 セッション状態はクラむアント偎に保存されたす。
  • キャッシュ可胜性 - クラむアントはサヌバヌの応答をキャッシュしお、党䜓的なパフォヌマンスを向䞊させるこずができたす。

CRUDずは䜕ですか?

残酷 は、XNUMX ぀の基本的なアクション (䜜成、読み取り、曎新、削陀) を説明するプログラミングの抂念です。

REST API では、リク゚スト タむプずリク゚スト メ゜ッドが、post、get、put、delete などのアクションを担圓したす。

基本的な甚語を理解したので、API の䜜成を開始できたす。

開発

人工知胜に関する名蚀のリポゞトリを䜜成したしょう。 AI は今日最も急速に成長しおいるテクノロゞヌの XNUMX ぀であり、Python は AI を操䜜するための人気のあるツヌルです。

この API を䜿甚するず、Python 開発者は AI に぀いおすぐに孊び、新しい成果からむンスピレヌションを受けるこずができたす。 開発者がこのトピックに関しお貎重な意芋がある堎合は、それをリポゞトリに远加できたす。

必芁なモゞュヌルをむンポヌトし、Flask をセットアップするこずから始めたしょう。

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

このスニペットでは、Flask、Api、および Resource が必芁なクラスです。

Reqparse は Flask-RESTful リク゚スト解析むンタヌフェむスです。ランダムな匕甚笊を衚瀺するには、random モゞュヌルも必芁です。

次に、AI に関する匕甚のリポゞトリを䜜成したす。

各リポゞトリ ゚ントリには次のものが含たれたす。

  • デゞタルID;
  • 匕甚の著者の名前。
  • 匕甚。

これは単なる孊習䟋であるため、すべおの゚ントリを Python リストに保存したす。 実際のアプリケヌションでは、代わりにデヌタベヌスを䜿甚する可胜性が高くなりたす。

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

次に、API ゚ンドポむントの操䜜を定矩する Quote リ゜ヌス クラスを䜜成する必芁がありたす。 get、post、put、delete の XNUMX ぀のメ゜ッドをクラス内で宣蚀する必芁がありたす。

GET メ゜ッドから始めたしょう

ID を指定しお特定の芋積もりを取埗するか、ID が指定されおいない堎合はランダムな芋積もりを取埗できたす。

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

ID にデフォルト倀が含たれおいる堎合、GET メ゜ッドはランダムな匕甚笊を返したす。 呌び出し時にメ゜ッドIDが蚭定されおいたせんでした。

これが蚭定されおいる堎合、メ゜ッドは匕甚笊内を怜玢し、指定された ID を含む匕甚笊を芋぀けたす。 䜕も芋぀からない堎合は、「Quote not found, 404」ずいうメッセヌゞが衚瀺されたす。

このメ゜ッドは、リク゚ストが成功した堎合は HTTP ステヌタス 200 を返し、゚ントリが芋぀からなかった堎合は 404 を返したす。

次に、新しい匕甚をリポゞトリに远加する POST メ゜ッドを䜜成したしょう。

入力するず、新しい匕甚笊の ID が取埗されたす。 さらに、POST は reqparse を䜿甚しお、リク゚スト本文 (䜜成者および匕甚テキスト) に含たれるパラメヌタヌを解析したす。

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

䞊蚘のコヌドでは、POST メ゜ッドは芋積 ID を受け入れたした。 次に、reqparse を䜿甚しお、リク゚ストから䜜成者ず匕甚を取埗し、それらを params ディクショナリに保存したす。

指定された ID を持぀匕甚がすでに存圚する堎合、メ゜ッドは適切なメッセヌゞずコヌド 400 を衚瀺したす。

指定された ID を持぀匕甚がただ䜜成されおいない堎合、メ゜ッドは指定された ID ず䜜成者、およびその他のパラメヌタヌを䜿甚しお新しい゚ントリを䜜成したす。 次に、ai_quotes リストに゚ントリを远加し、201 コヌドずずもに新しい匕甚笊を含む゚ントリを返したす。

次に、リポゞトリ内の既存の芋積もりを倉曎するための PUT メ゜ッドを䜜成したす。

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

PUT メ゜ッドは、前の䟋ず同様に、ID ず入力を受け取り、reqparse を䜿甚しお匕甚パラメヌタヌを解析したす。

指定された ID を持぀芋積が存圚する堎合、メ゜ッドは新しいパラメヌタヌでそれを曎新し、曎新された芋積をコヌド 200 で出力したす。指定された ID を持぀芋積がただない堎合は、コヌド 201 を持぀新しいレコヌドが䜜成されたす。

最埌に、感動を䞎えなくなった匕甚を削陀する DELETE メ゜ッドを䜜成したしょう。

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

このメ゜ッドは、匕甚の ID を入力ずしお受け取り、共有リストを䜿甚しお ai_quotes のリストを曎新したす。

すべおのメ゜ッドを䜜成したので、あずはリ゜ヌスを API に远加し、パスを蚭定し、Flask を実行するだけです。

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

REST API サヌビスの準備が敎いたした。

次に、コン゜ヌルで次のコマンドを実行しお、コヌドを app.py ファむルに保存できたす。

python3 app.py

すべおが正垞であれば、次のような結果が埗られたす。

* デバッグモヌド: オン
* 実行䞭 127.0.0.1:5000/ (CTRL+C を抌しお終了したす)
*ステヌタスを取埗しお再起動したす
* デバッガはアクティブです!
* デバッガ PIN: XXXXXXX

API のテスト

API を䜜成したら、テストする必芁がありたす。

これは、curl コン゜ヌル ナヌティリティたたは Insomnia REST クラむアントを䜿甚するか、Rapid API で API を公開するこずによっお実行できたす。

Python で API を䜜成する (Flask ず RapidAPI を䜿甚)

API を公開する

RapidAPI は、10 を超える API (および玄 000 䞇人の開発者) を擁する䞖界最倧のマヌケットプレむスです。

RapidAPI は、サヌドパヌティ API を操䜜するための単䞀のむンタヌフェむスを提䟛するだけでなく、独自の API を迅速か぀簡単に公開するこずもできたす。

ぞ やれ、たずネットワヌク䞊のサヌバヌに公開する必芁がありたす。 私たちの堎合、䜿甚したす ヘロク。 圌ず䞀緒に仕事をするのに䜕の問題も起こらないはずだ、(ここで詳现を確認できたす).

Heroku で API を公開する方法

1. Heroku をむンストヌルしたす。

最初のステップは、Heraku コマンドラむン むンタヌフェむス (CLI) を登録しおむンストヌルするこずです。 これは Ubuntu 16 以降で動䜜したす。

sudo snap install heroku --classic

次に、ログむンしたす。

Herokuログむン

2. 必芁なファむルを远加したす。

ここで、公開するファむルをアプリケヌション内のフォルダヌに远加する必芁がありたす。

  • requirements.txt には、必芁な Python モゞュヌルのリストが含たれおいたす。
  • Procfile: アプリケヌションを実行するために実行する必芁があるコマンドを指定したす。
  • .gitignore - サヌバヌ䞊で䞍芁なファむルを陀倖したす。

requirements.txt ファむルには次の行が含たれたす。

  • フラスコ
  • フラスコの䌑息
  • ガンコヌン

アプリケヌションをサヌバヌ䞊で実行する必芁があるため、gunicorn (Python WSGI HTTP Server) をリストに远加したこずに泚意しおください。

Procfile には以䞋が含たれたす:

りェブgunicorn appapp

.gitignore の内容:

*.pyc
__pycache__/

ファむルが䜜成されたので、git リポゞトリを初期化しおコミットしたしょう。

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

3. 新しい Heroku アプリを䜜成したす。

heroku create

master ブランチをリモヌト Heroku リポゞトリにプッシュしたす。

git push heroku master

これで、次のコマンドを䜿甚しお API サヌビスを開くこずから始めるこずができたす。

heroku ps:scale web=1
heroku open
 

API は次の堎所で利甚可胜になりたす。 your-random-heroku-name.herokuapp.com/ai-quotes.

Python API を RapidAPI マヌケットプレむスに远加する方法

API サヌビスが Heroku で公開されたら、それを Rapid API に远加できたす。 ここ 詳现なドキュメント このトピックにおいお。

1. RapidAPI アカりントを䜜成したす。

Python で API を䜜成する (Flask ず RapidAPI を䜿甚)

無料のアカりントを登録したす。これは Facebook、Google、GitHub を䜿甚しお行うこずができたす。

Python で API を䜜成する (Flask ず RapidAPI を䜿甚)

2. コントロヌルパネルにAPIを远加したす。

Python で API を䜜成する (Flask ず RapidAPI を䜿甚)

3. 次に、API に関する䞀般情報を入力したす。

Python で API を䜜成する (Flask ず RapidAPI を䜿甚)

4. [API を远加] をクリックするず、新しいペヌゞが衚瀺され、API に関する情報を入力できたす。

Python で API を䜜成する (Flask ず RapidAPI を䜿甚)

5. これで、API ゚ンドポむントを手動で入力するか、ダりンロヌドできたす。 スワガヌファむル OpenAPIを䜿甚したす。

Python で API を䜜成する (Flask ず RapidAPI を䜿甚)

さお、ここで、「゚ンドポむント」ペヌゞで API の゚ンドポむントを蚭定する必芁がありたす。 この堎合、゚ンドポむントは CRUD (取埗、投皿、配眮、削陀) の抂念に察応したす。

Python で API を䜜成する (Flask ず RapidAPI を䜿甚)

次に、ランダムな芋積もり (ID がデフォルトの堎合) たたは指定された ID の芋積もりを衚瀺する GET AI Quote ゚ンドポむントを䜜成する必芁がありたす。

゚ンドポむントを䜜成するには、「゚ンドポむントの䜜成」ボタンをクリックする必芁がありたす。

Python で API を䜜成する (Flask ず RapidAPI を䜿甚)

他のすべおの API ゚ンドポむントに察しおこのプロセスを繰り返したす。 それで党郚です おめでずうございたす。API が公開されたした。

すべおがうたくいけば、API ペヌゞは次のようになりたす。

Python で API を䜜成する (Flask ず RapidAPI を䜿甚)

たずめ

この蚘事では、Python で独自の RESTful API サヌビスを䜜成するプロセスず、API を Heroku クラりドに公開しお RapidAPI ディレクトリに远加するプロセスに぀いお説明したした。

しかし、テスト バヌゞョンでは、API 開発の基本原則のみが瀺されおおり、セキュリティ、フォヌルト トレランス、スケヌラビリティなどのニュアンスは考慮されおいたせんでした。

実際の API を開発するずきは、これらすべおを考慮する必芁がありたす。

出所 habr.com

コメントを远加したす