ホームページ >バックエンド開発 >Python チュートリアル >裏技を教えてください! PythonとFlaskでREST APIを作成しましょう!
これは REST API の簡単な紹介にすぎず、出発点として機能することに注意してください。この研究の範囲内で、興味のある友人は関連資料を参照して詳細な研究を行うことができます。また、このアカウントではこの分野の投稿も受け付けていますので、ユン・ドゥオジュンまでご連絡ください!
API、正式名称はアプリケーション プログラミング インターフェイス (Application Programming Interface) 簡単に言えば、ブランドが開発したインターフェイスです。サードパーティは、システム通信インターフェイスをさらに開発して自社の製品に適用できます。
REST は、HTTP プロトコルを通じて API を設計するためのアーキテクチャ スタイルです。その主な利点は、その優れた柔軟性です。開発者は、Web アプリケーションまたはサイトのユーザーにサーバーから直接データを提供する必要がある場合は常に REST API を使用します。
REST API の主要コンポーネント:
REST API は HTTP リクエストを通じて通信し、データの作成、読み取り、更新、削除などの機能を実行します。これらは CRUD 操作とも呼ばれます。 REST は、要求されたリソースに関する情報を提供し、次の 4 つのメソッドを使用してリソースの処理方法を記述します:
REST、正式名は Representational State Transfer (プレゼンテーション層状態転送) です。これは設計スタイルであり、RESTful は単に形容詞になっているだけです。名詞 Peace は形容詞に変換すると Peace となり、RESTful はこの仕様に従って設計された API (RESTful API と呼ばれます) を表します。
RESTful API は主に 3 つのコンポーネントで構成されています:
したがって、RESTful スタイルで設計された API を使用することには、次の利点と制限があります。
Restful API アプリケーションの統合や、Restful Web サービスとの対話を可能にします。現在、マイクロサービス アーキテクチャでコンポーネントを接続する最も一般的な方法に成長しつつあります。 API の助けを借りて、Web サービスを通じてタスクを完了することを目的として、Web サイトでデータを取得または送信し、いくつかの操作を実行できます。株式市場取引 Web サイトなど、すべての Web サイトはさまざまなタイプの API を使用しており、API を利用して現在の価格や騰落率を取得します。
同様に、Hello world API を作成します。これは、API に対して get リクエストを行うと、JSON レスポンスを取得することを意味します。一般に、API は応答の JSON タイプを返します。次に、pip パッケージ マネージャーを使用して Flask をインストールします:
pip install flask pip install flask-restful from flask import Flask from flask_restful import Resource, Api app = Flask(__name__) api = Api(app) class Helloworld(Resource): def __init__(self): pass def get(self): return { "Hello": "World" } api.add_resource(Helloworld, '/') if __name__ == '__main__': app.run(debug=True)
ok. これまでのところ、最初の Rest API が作成されています。非常に簡単そうに見えます。それでは、Flask-Restful とは何ですか?
Flaskrestful は、各 HTTP メソッドのメソッドを含むリソース Resource クラスを定義します。上記のコードに示すように、メソッド名は対応する HTTP メソッドと同じであり、小文字で書かれている必要があります。これらのメソッドにはルート デコレータがないことがわかりました。これは、これらのメソッドがリソース ルーティングに基づいているためです。どのようなクラスが定義されているかに関係なく、add_resource メソッドを使用してそのクラスへのルートを定義し、対応するルートでクラスを呼び出すことができます。
手順: 上記のコードでは、まず必要な親クラスを読み込み、次にアプリと API を初期化します。その後、プログラムを作成し、誰かがこのプログラムをクリックすると、応答として Hello world を JSON 形式で取得することを示す GET リクエストを作成しました。特定の URL を開くには、add resource メソッドを使用し、それをデフォルトのスラッシュにルーティングします。このファイルを実行するには、API を作成、テスト、管理するための API メンテナンス ツールである POSTMAN ツールを使用できます。次のコードを使用して、リクエスト モジュールを使用してこの API をテストすることもできます。まず、上記のファイルを実行するとローカルホストの URL が表示されます。次に、別のコマンド プロンプトで次のコード ファイルを実行します。
import requests url = "http://127.0.0.1:5000/" response = requests.get(url=url) print(response.text) { "Hello": "World" }
通过以上内容的学习,相比大家已经对 REST API 有个初步印象。接下来我们将继续探索使用 REST API 的不同 HTTP 方法,其中我们定义一个列表,该列表将以字典(JSON 对象)的形式存储从服务器获取的所有数据。这是很重要的,因为我们在项目中有不同的api来获取数据,而不是其他地方的数据。
首先创建一个 API,在其中创建 3 个名为 GET、POST 和 DELETE 的 HTTP 方法,并且在其中创建一个自定义 URL,当请求 POST 方法时,它将以 Name 作为输入;在请求 GET 方法时,将名称返回;在DELETE时,如果该名称存在,我们将删除该名称,再次访问它会给我们 NULL。
创建一个文件并编写以下代码:
from flask import Flask from flask_restful import Resource, Api app = Flask(__name__) api = Api(app) data = [] class People(Resource): def get(self): for x in data: if x['Data'] == name: return x return {'Data': None} def post(self, name): temp = {'Data': name} data.append(temp) return temp def delete(self): for ind, x in enumerate(data): if x['Data'] == name: temp = data.pop(ind) return {'Note': 'Deleted'} api.add_resource(People, '/Name/') if __name__ == '__main__': app.run(debug=True)
打开 POSTMAN API 工具并点击每个 HTTP 方法请求。首先,当我们使用 post 请求Name时,它给了我们一个name。在获取请求时,我们将返回name。它在删除时被删除,当再次将其取回时,它会给你返回 NULL。
结果如下
我们使用带有 API 的装饰器来监控 IP 地址、cookie 等。我们将继续学习如何使用带有装饰器的Flask API。装饰器是一个将另一个函数作为参数并返回另一个函数的函数。也可以将其理解为在不改变或修改当前功能的情况下,为现有功能提供一些附加功能的功能。
这里我们创建一个新文件,我将通过创建两个装饰器来展示。在第一个文件中,编写返回代码执行时间的外部时间函数。我们从 functools 模块(用于高阶 python 函数的标准模块)导入应用于 wrapper 函数的 wrap 装饰器 。它通过复制所有参数来更新包装函数。
from flask import Flask from flask_restful import Resource, Api import datetime from flask import request from functools import wraps app = Flask(__name__) api = Api(app) def time(function=None): @wraps(function) def wrapper(*args, **kwargs): s = datetime.datetime.now() _ = function(*args, **kwargs) e = datetime.datetime.now() print("Execution Time : {} ".format(e-s)) return _ return wrapper class HelloWorld(Resource): @monitor def get(self): return {"hello": "world"} api.add_resource(HelloWorld, "/") if __name__ == "__main__": app.run(debug=True)
我们创建第二个装饰器来监视cookie和IP地址,因此创建下面的函数。不是向hello world函数添加时间装饰器,而是添加监视器装饰器并运行代码。
def monitor(function=None): @wraps(function) def wrapper(*args, **kwargs): _ = function(*args, **kwargs) print("Ip Address: {} ".format(request.remote_user)) print("Cookies : {} ".format(request.cookies)) print(request.user_agent) return _ return wrapper
当我们设计API时,我们也应该注意安全性,因为很多人会访问它。因为API可能包含一些双方之间的机密数据,因此我们可以指定只有授权的人可以访问API,那该怎么办?此时可以使用Flask基本身份验证。当然,此时需要使用pip命令安装这个flask模块。
pip install flask-httpauth
我们正在构建一个API并定义User数据字典,其中包含用户名和密码。当在实时用例中工作时,可以通过配置文件或从数据库中接受用户名和密码。首先,我们创建一个主要函数来匹配用户名和密码,并创建一个GET方法,该方法表示任何点击此API的人,如果没有登录,我们就无法访问数据。
from flask import Flask from flask_restful import Resource, Api from flask_httpauth import HTTPBasicAuth app = Flask(__name__) api = Api(app, prefix="/api/v1") auth = HTTPBasicAuth() USER_DATA = { "admin": "SuperSecretPwd" } #route to verify the password @auth.verify_password def verify(username, password): if not(username and password): return False return USER_DATA.get(username) == password class PrivateResource(Resource): @auth.login_required def get(self): return {"How's the Josh": "High"} api.add_resource(PrivateResource, '/private') if __name__ == '__main__': app.run(debug=True)
当我们使用POSTMAN运行上述文件时,我们会尝试在没有登录的情况下获取数据,以便给你演示未经授权的访问权限。
现在转到授权,并单击Basic authorization。输入用户名和密码,然后点击GET请求以获得所需的结果。
这是保护 Flask API 的方法,也是最基本的方法,当然还有更多更高级的方法,这里不做过多的介绍。
至此我们已经了解了如何保护我们的 API,在未经授权的登录禁止访问,但是如果我们还想知道访问者的位置(纬度和经度点)、IP 地址、服务器名称(例如访问API 的人的详细信息),我们还可以继续配置,使用 REST API 的基本flask跟踪应用程序。首先,使用 PIP 命令安装flask跟踪包。
pip install flask-track-usage
接下来看下该程序:
from flask import Flask, g app = Flask(__name__) app.config['TRACK_USAGE_USE_FREEGEOIP'] = False app.config['TRACK_USAGE_INCLUDE_OR_EXCLUDE_VIEWS'] = 'include' from flask_track_usage import TrackUsage from flask_track_usage.storage.printer import PrintWriter from flask_track_usage.storage.output import OutputWriter t = TrackUsage(app, [ PrintWriter(), OutputWriter(transform=lambda s: "OUTPUT: " + str(s)) ]) @t.include @app.route('/') def index(): g.track_var["optional"] = "Write_Something" return "Hello" #Run the application if __name__ == "__main__": app.run(debug=True)
该程序通过导入 Track Usage、Input writer 和 output writer 来创建一个跟踪应用程序。将flask app传递给 Track 包并使用输出编写器,并使用 lambda 函数以字符串格式写入输出。之后在 slash 上创建一个基本路由,并将跟踪应用程序作为装饰器包含在内。g 代表全局,表示数据在上下文中是全局的。因此,创建一个基本 API,它在浏览器返回"Hello",同时在后端获得所有人员的信息。
现在已经为案例创建了一个不错的REST API。尽管如此,我们还需要为REST API编写单元测试代码,因为从API中识别常见错误,并确保生产安全是至关重要的。
如下是创建一个名为run的新文件并开发以下简单API。
from flask import Flask from flask_restful import Resource, Api import json app = Flask(__name__) api = Api(app) class Helloworld(Resource): def __init__(self): pass def get(self): return json.dumps({"Message": "Fine"}) api.add_resource(Helloworld, '/') if __name__ == '__main__': app.run(debug=True)
现在创建另一个名为test的文件,在其中编写用于对API进行单元测试的代码。最常见的情况是执行以下三个基本单元测试。
from run import app import unittest class FlaskTest(unittest.TestCase): #Check for response 200 def test_inde(self): tester = app.test_client(self) #tester object response = tester.get("/") statuscode = response.status_code self.assertEqual(statuscode, 200) #check if the content return is application JSON def test_index_content(self): tester = app.test_client(self) response = tester.get("/") self.assertEqual(response.content_type, "application/json") #check the Data returned def test_index_data(self): tester = app.test_client(self) response = tester.get("/") self.assertTrue(b'Message' in response.data) if __name__ == '__main__': unittest.main()
如果你已经学习过网络爬虫,你应该知道 200 响应意味着对特定 URL 的请求已成功发出,并返回响应。
好了,这就是本文的全部内容。到这里我们已经学会了从头开始创建 Flask REST API ,并轻松安全地对其进行维护。
Flask 作为 Python Web 领域最为著名的轻量级 Web 开发框架,对于致力于 Web 开发的同学来说,掌握基本的 Flask 技能还是非常有必要的,你学会了吗?
以上が裏技を教えてください! PythonとFlaskでREST APIを作成しましょう!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。