首頁 > 後端開發 > Python教學 > 教你一招!用Python和Flask創建REST API!

教你一招!用Python和Flask創建REST API!

王林
發布: 2023-04-12 08:13:05
轉載
1497 人瀏覽過

教你一招!用Python和Flask創建REST API!

教你一招!用Python和Flask創建REST API!

REST API 簡介

注意,這裡只是對REST API 的簡單介紹,起到拋磚引玉作用,更加深入內容不在本次學習範圍內,有興趣的夥伴可以查看相關資料深入學習。另外本號接受該領域的投稿,歡迎聯絡雲朵君!

教你一招!用Python和Flask創建REST API!

API

API,全名Application Programming Interface (應用程式介面),簡單來說,是品牌開發出的一種接口,讓第三方可以額外開發、應用在自身的產品上的系統溝通界面。

REST API

REST 是一種透過 HTTP 協定設計 API 的架構風格。它的主要優點是其極大的靈活性。只要需要直接從伺服器向 Web 應用程式或網站的使用者提供數據,開發人員就會使用 REST API。

REST API 的主要元件:

  • 客戶 — 在用戶端(在他的裝置上)啟動的用戶端或程式啟動通訊。
  • 伺服器 — 使用 API 存取其功能和資料的伺服器。
  • 資源 — 伺服器傳輸給客戶端的任何內容(影片、文字、圖片)。

REST API 透過 HTTP 請求進行通信,完成以下功能-建立、讀取、更新和刪除資料。它們也稱為 CRUD 操作。 REST 提供有關請求資源的信息,並使用四種方法來描述如何處理資源:

  • POST — 建立資源;
  • GET — 取得資源;
  • ## PUT — 更新資源;
  • DELETE — 刪除資源。
RESTful API

REST,全名Representational State Transfer( 表現層狀態轉移),他是一種設計風格,RESTful 只是轉為形容詞,像是peace 和平這名詞,轉成形容詞是peaceful,RESTful 則形容以此規範設計的API,稱為RESTful API。

RESTful API 主要由三個元件組成:

    Nouns 名詞:定義資源位置的URL,每個資源在網路上都會有唯一的位置,就如每戶人家都有唯一的地址一樣。
  • Verbs 動詞:對資源要做的動作。
  • ontent Types 資源呈現方式:API 資源可以以多種方式表現,最常用的是JSON,輕鬆處理。
所以使用 RESTful 風格設計的API,就有了以下幾個優點與限制:

    有唯一的URL表示資源位置,統一的API 介面。 (Uniform Interface)
  1. 無狀態。 (Stateless)
Restful API 它允許整合應用程式 app 或與 Restful Web 服務互動。現在它正在成長為連接微服務架構中元件的最常用方法。我們藉助 API,能夠取得或傳送資料到網站並執行一些操作,目的是透過 Web 服務完成我們的任務。每個網站都使用不同類型的 API,例如股票市場交易網站,借助 API 取得當前價格和上下波動。

創建第一個REST API

同樣,我們創建Hello world 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呢?

Flask restful 定義了資源Resource類,其中包含每個 HTTP 方法的方法。方法名稱應與其對應的 HTTP 方法相同,並以小寫形式書寫,如上程式碼所示。我們發現這些方法沒有路由裝飾器,這是它們是基於資源路由的。無論定義什麼類,我們都可以使用新增資源add_resource方法定義到它的路由以及在對應路由上呼叫該類別。

說明: 在上面的程式碼中,我們先載入需要的父類,然後初始化我們的app和API。之後,我們創建了一個程序,並且我們正在發出一個 GET 請求,說明如果有人點擊了這個程序,那麼他將得到 Hello world 作為 JSON 格式的回應。要開啟特定 URL,我們使用 add resource 方法並將其路由到預設斜線。若要執行此文件,可以使用 POSTMAN 工具(一種 API 維護工具)來建立、測試和管理 API。也可以使用requests請求模組使用下列程式碼測試此 API。首先,執行上面的文件,它會給你 localhost URL,然後在另一個命令提示字元下,執行下面的程式碼檔案:

import requests
url = "http://127.0.0.1:5000/"
response = requests.get(url=url)
print(response.text)
{
"Hello": "World"
}
登入後複製

通过 Flask RESTApi 理解 HTTP 请求

通过以上内容的学习,相比大家已经对 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。

结果如下

教你一招!用Python和Flask創建REST API!

教你一招!用Python和Flask創建REST API!

教你一招!用Python和Flask創建REST API!

如何在 Flask REST API 中使用装饰器

我们使用带有 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
登入後複製

如何使 Flask API 更安全

当我们设计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运行上述文件时,我们会尝试在没有登录的情况下获取数据,以便给你演示未经授权的访问权限。

教你一招!用Python和Flask創建REST API!

现在转到授权,并单击Basic authorization。输入用户名和密码,然后点击GET请求以获得所需的结果。

教你一招!用Python和Flask創建REST API!

这是保护 Flask API 的方法,也是最基本的方法,当然还有更多更高级的方法,这里不做过多的介绍。

如何在 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。尽管如此,我们还需要为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进行单元测试的代码。最常见的情况是执行以下三个基本单元测试。

  • 检查响应码是否为200
  • 检查从API编写的内容是否为应用程序JSON格式
  • 检查我们正在访问的所有键是否都存在于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中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板