
node.js + express + docker + mysql + jwt 實現用戶管理restful api
注意,這里只是對REST API 的簡單介紹,起到拋磚引玉作用,更加深入內容不在本次學習范圍內,感興趣的小伙伴可以查看相關資料深入學習。此外本號接受該領域的投稿,歡迎聯系云朵君!
API,全名Application Programming Interface (應用程式介面),簡單來說,是品牌開發出的一種接口,讓第三方可以額外開發、應用在自身的產品上的系統溝通介面。
REST 是一種通過 HTTP 協議設計 API 的架構風格。它的主要優點是其極大的靈活性。只要需要直接從服務器向 Web 應用程序或站點的用戶提供數據,開發人員就會使用 REST API。
REST API 的主要組件:
REST API 通過 HTTP 請求進行通信,完成以下功能——創建、讀取、更新和刪除數據。它們也稱為 CRUD 操作。REST 提供有關請求資源的信息,并使用四種方法來描述如何處理資源:
REST,全名Representational State Transfer( 表現層狀態轉移),他是一種設計風格,RESTful 只是轉為形容詞,像是 peace 和平這名詞,轉成形容詞是peaceful,RESTful 則形容以此規范設計的API,稱為RESTful API。
RESTful API 主要由三種元件組成:
所以使用 RESTful 風格設計的API,就有了以下幾種優點及限制:
Restful API 它允許集成應用程序 app ?或與 Restful Web 服務交互。它現在正在成長為連接微服務架構中組件的最常用方法。我們借助 API,能夠獲取或發送數據到網站并執行一些操作,目的是通過 Web 服務完成我們的任務。每個網站都使用不同類型的 API,例如股票市場交易網站,借助 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"
}
通過以上內容的學習,相比大家已經對 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 ,并輕松安全地對其進行維護。
文章轉自微信公眾號@數據STUDIO
node.js + express + docker + mysql + jwt 實現用戶管理restful api
nodejs + mongodb 編寫 restful 風格博客 api
表格插件wpDataTables-將 WordPress 表與 Google Sheets API 連接
使用 Django 和 Django REST 框架構建 RESTful API:實現 CRUD 操作
ASP.NET Web API快速入門介紹
2024年在線市場平臺的11大最佳支付解決方案
完整指南:如何在應用程序中集成和使用ChatGPT API
選擇AI API的指南:ChatGPT、Gemini或Claude,哪一個最適合你?
用ASP.NET Core 2.1 建立規范的 REST API — 緩存和并發