成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

API Star:一個Python 3的API框架

開發 后端
為了在 Python 中快速構建 API,我主要依賴于 Flask。最近我遇到了一個名為 “API Star” 的基于 Python 3 的新 API 框架。由于幾個原因,我對它很感興趣。首先,該框架包含 Python 新特點,如類型提示和 asyncio。而且它再進一步為開發人員提供了很棒的開發體驗。

[[242998]]

為了在 Python 中快速構建 API,我主要依賴于 Flask。最近我遇到了一個名為 “API Star” 的基于 Python 3 的新 API 框架。由于幾個原因,我對它很感興趣。首先,該框架包含 Python 新特點,如類型提示和 asyncio。而且它再進一步為開發人員提供了很棒的開發體驗。我們很快就會講到這些功能,但在我們開始之前,我首先要感謝 Tom Christie,感謝他為 Django REST Framework 和 API Star 所做的所有工作。

現在說回 API Star —— 我感覺這個框架很有成效。我可以選擇基于 asyncio 編寫異步代碼,或者可以選擇傳統后端方式就像 WSGI 那樣。它配備了一個命令行工具 —— apistar 來幫助我們更快地完成工作。它支持 Django ORM 和 SQLAlchemy,這是可選的。它有一個出色的類型系統,使我們能夠定義輸入和輸出的約束,API Star 可以自動生成 API 的模式(包括文檔),提供驗證和序列化功能等等。雖然 API Star 專注于構建 API,但你也可以非常輕松地在其上構建 Web 應用程序。在我們自己構建一些東西之前,所有這些可能都沒有意義的。

 

開始

我們將從安裝 API Star 開始。為此實驗創建一個虛擬環境是一個好主意。如果你不知道如何創建一個虛擬環境,不要擔心,繼續往下看。

  1. pip install apistar

(譯注:上面的命令是在 Python 3 虛擬環境下使用的)

如果你沒有使用虛擬環境或者你的 Python 3 的 pip 名為 pip3,那么使用 pip3 install apistar 代替。

一旦我們安裝了這個包,我們就應該可以使用 apistar 命令行工具了。我們可以用它創建一個新項目,讓我們在當前目錄中創建一個新項目。

  1. apistar new .

現在我們應該創建兩個文件:app.py,它包含主應用程序,然后是 test.py,它用于測試。讓我們來看看 app.py 文件:

  1. from apistar import Include, Route
  2. from apistar.frameworks.wsgi import WSGIApp as App
  3. from apistar.handlers import docs_urls, static_urls
  4.  
  5. def welcome(name=None):
  6. if name is None:
  7. return {'message': 'Welcome to API Star!'}
  8. return {'message': 'Welcome to API Star, %s!' % name}
  9.  
  10.  
  11. routes = [
  12. Route('/', 'GET', welcome),
  13. Include('/docs', docs_urls),
  14. Include('/static', static_urls)
  15. ]
  16.  
  17. app = App(routes=routes)
  18.  
  19.  
  20. if __name__ == '__main__':
  21. app.main()

在我們深入研究代碼之前,讓我們運行應用程序并查看它是否正常工作。我們在瀏覽器中輸入 http://127.0.0.1:8080/,我們將得到以下響應:

  1. {"message": "Welcome to API Star!"}

如果我們輸入:http://127.0.0.1:8080/?name=masnun

  1. {"message": "Welcome to API Star, masnun!"}

同樣的,輸入 http://127.0.0.1:8080/docs/,我們將看到自動生成的 API 文檔。

現在讓我們來看看代碼。我們有一個 welcome 函數,它接收一個名為 name 的參數,其默認值為 None。API Star 是一個智能的 API 框架。它將嘗試在 url 路徑或者查詢字符串中找到 name 鍵并將其傳遞給我們的函數,它還基于其生成 API 文檔。這真是太好了,不是嗎?

然后,我們創建一個 RouteInclude 實例的列表,并將列表傳遞給 App 實例。Route 對象用于定義用戶自定義路由。顧名思義,Include 包含了在給定的路徑下的其它 url 路徑。

 

路由

路由很簡單。當構造 App 實例時,我們需要傳遞一個列表作為 routes 參數,這個列表應該有我們剛才看到的 RouteInclude 對象組成。對于 Route,我們傳遞一個 url 路徑,http 方法和可調用的請求處理程序(函數或者其他)。對于 Include 實例,我們傳遞一個 url 路徑和一個 Routes 實例列表。

 

路徑參數

我們可以在花括號內添加一個名稱來聲明 url 路徑參數。例如 /user/{user_id} 定義了一個 url,其中 user_id 是路徑參數,或者說是一個將被注入到處理函數(實際上是可調用的)中的變量。這有一個簡單的例子:

  1. from apistar import Route
  2. from apistar.frameworks.wsgi import WSGIApp as App
  3.  
  4.  
  5. def user_profile(user_id: int):
  6. return {'message': 'Your profile id is: {}'.format(user_id)}
  7.  
  8.  
  9. routes = [
  10. Route('/user/{user_id}', 'GET', user_profile),
  11. ]
  12.  
  13. app = App(routes=routes)
  14.  
  15. if __name__ == '__main__':
  16. app.main()

如果我們訪問 http://127.0.0.1:8080/user/23,我們將得到以下響應:

  1. {"message": "Your profile id is: 23"}

但如果我們嘗試訪問 http://127.0.0.1:8080/user/some_string,它將無法匹配。因為我們定義了 user_profile 函數,且為 user_id 參數添加了一個類型提示。如果它不是整數,則路徑不匹配。但是如果我們繼續刪除類型提示,只使用 user_profile(user_id),它將匹配此 url。這也展示了 API Star 的智能之處和利用類型和好處。

 

包含/分組路由

有時候將某些 url 組合在一起是有意義的。假設我們有一個處理用戶相關功能的 user 模塊,將所有與用戶相關的 url 分組在 /user 路徑下可能會更好。例如 /user/new/user/1/user/1/update 等等。我們可以輕松地在單獨的模塊或包中創建我們的處理程序和路由,然后將它們包含在我們自己的路由中。

讓我們創建一個名為 user 的新模塊,文件名為 user.py。我們將以下代碼放入這個文件:

  1. from apistar import Route
  2.  
  3.  
  4. def user_new():
  5. return {"message": "Create a new user"}
  6.  
  7.  
  8. def user_update(user_id: int):
  9. return {"message": "Update user #{}".format(user_id)}
  10.  
  11.  
  12. def user_profile(user_id: int):
  13. return {"message": "User Profile for: {}".format(user_id)}
  14.  
  15.  
  16. user_routes = [
  17. Route("/new", "GET", user_new),
  18. Route("/{user_id}/update", "GET", user_update),
  19. Route("/{user_id}/profile", "GET", user_profile),
  20. ]

現在我們可以從 app 主文件中導入 user_routes,并像這樣使用它:

  1. from apistar import Include
  2. from apistar.frameworks.wsgi import WSGIApp as App
  3.  
  4. from user import user_routes
  5.  
  6. routes = [
  7. Include("/user", user_routes)
  8. ]
  9.  
  10. app = App(routes=routes)
  11.  
  12. if __name__ == '__main__':
  13. app.main()

現在 /user/new 將委托給 user_new 函數。

 

訪問查詢字符串/查詢參數

查詢參數中傳遞的任何參數都可以直接注入到處理函數中。比如 url /call?phone=1234,處理函數可以定義一個 phone 參數,它將從查詢字符串/查詢參數中接收值。如果 url 查詢字符串不包含 phone 的值,那么它將得到 None。我們還可以為參數設置一個默認值,如下所示:

  1. def welcome(name=None):
  2. if name is None:
  3. return {'message': 'Welcome to API Star!'}
  4. return {'message': 'Welcome to API Star, %s!' % name}

在上面的例子中,我們為 name 設置了一個默認值 None

 

注入對象

通過給一個請求程序添加類型提示,我們可以將不同的對象注入到視圖中。注入請求相關的對象有助于處理程序直接從內部訪問它們。API Star 內置的 http 包中有幾個內置對象。我們也可以使用它的類型系統來創建我們自己的自定義對象并將它們注入到我們的函數中。API Star 還根據指定的約束進行數據驗證。

讓我們定義自己的 User 類型,并將其注入到我們的請求處理程序中:

  1. from apistar import Include, Route
  2. from apistar.frameworks.wsgi import WSGIApp as App
  3. from apistar import typesystem
  4.  
  5.  
  6. class User(typesystem.Object):
  7. properties = {
  8. 'name': typesystem.string(max_length=100),
  9. 'email': typesystem.string(max_length=100),
  10. 'age': typesystem.integer(maximum=100, minimum=18)
  11. }
  12.  
  13. required = ["name", "age", "email"]
  14.  
  15.  
  16. def new_user(user: User):
  17. return user
  18.  
  19.  
  20. routes = [
  21. Route('/', 'POST', new_user),
  22. ]
  23.  
  24. app = App(routes=routes)
  25.  
  26. if __name__ == '__main__':
  27. app.main()

現在如果我們發送這樣的請求:

  1. curl -X POST \
  2. http://127.0.0.1:8080/ \
  3. -H 'Cache-Control: no-cache' \
  4. -H 'Content-Type: application/json' \
  5. -d '{"name": "masnun", "email": "masnun@gmail.com", "age": 12}'

猜猜發生了什么?我們得到一個錯誤,說年齡必須等于或大于 18。類型系允許我們進行智能數據驗證。如果我們啟用了 docs url,我們還將自動記錄這些參數。

 

發送響應

如果你已經注意到,到目前為止,我們只可以傳遞一個字典,它將被轉換為 JSON 并作為默認返回。但是,我們可以使用 apistar 中的 Response 類來設置狀態碼和其它任意響應頭。這有一個簡單的例子:

  1. from apistar import Route, Response
  2. from apistar.frameworks.wsgi import WSGIApp as App
  3.  
  4.  
  5. def hello():
  6. return Response(
  7. content="Hello".encode("utf-8"),
  8. status=200,
  9. headers={"X-API-Framework": "API Star"},
  10. content_type="text/plain"
  11. )
  12.  
  13.  
  14. routes = [
  15. Route('/', 'GET', hello),
  16. ]
  17.  
  18. app = App(routes=routes)
  19.  
  20. if __name__ == '__main__':
  21. app.main()

它應該返回純文本響應和一個自定義標響應頭。請注意,content 應該是字節,而不是字符串。這就是我編碼它的原因。

 

繼續

我剛剛介紹了 API Star 的一些特性,API Star 中還有許多非常酷的東西,我建議通過 Github Readme 文件來了解這個優秀框架所提供的不同功能的更多信息。我還將嘗試在未來幾天內介紹關于 API Star 的更多簡短的,集中的教程。 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2023-08-01 07:25:38

Expresso框架API

2013-07-01 11:01:22

API設計API

2020-09-22 07:50:23

API接口業務

2020-04-13 10:37:46

API編程設計

2022-10-08 00:00:00

AdminUser數據庫鑒權

2023-04-10 14:20:47

ChatGPTRESTAPI

2023-02-01 08:04:07

測試flask網頁

2023-02-03 17:29:46

2020-01-11 17:00:07

DjangoPythonWeb API

2021-11-02 08:00:00

機器學習API技術

2018-11-26 08:06:24

API網關億級

2022-12-12 08:14:47

2025-06-27 06:38:19

2020-11-15 23:23:21

JavaScriptAPI開發

2019-11-26 09:42:36

代碼開發API

2021-10-21 08:51:01

UndiciNode.jsAPI

2012-11-14 09:58:07

云計算API

2023-08-28 07:26:01

2021-07-14 17:39:46

ReactRails API前端組件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品免费观看 | 日韩av在线中文字幕 | 天堂一区| 成年人精品视频 | 中文字幕精品视频 | 中文字幕动漫成人 | 亚洲一区二区电影在线观看 | 天天摸天天看 | 亚洲精品在线观 | 亚洲性综合网 | 中国一级特黄真人毛片 | 亚洲欧美日韩精品久久亚洲区 | 视频一区二区在线 | 成人免费黄色 | 在线观看中文字幕一区二区 | 手机在线不卡av | 在线视频一区二区三区 | 久久久久久免费精品一区二区三区 | 国产精品久久午夜夜伦鲁鲁 | 日韩中文字幕 | 中文字幕免费中文 | 成人免费看片 | 国产精品久久9 | 免费三级黄| 五月天婷婷丁香 | 欧美福利 | 久久久精品综合 | 91婷婷韩国欧美一区二区 | 九九九久久国产免费 | 欧美精品福利 | 亚洲最大av| 国产98色在线 | 日韩 | 国产情侣啪啪 | 日韩精品久久 | 国产精品美女久久久 | 成人一区二区在线 | 日韩在线视频一区二区三区 | 欧美lesbianxxxxhd视频社区 | 国产成人久久 | 亚洲国产精品99久久久久久久久 | 日本久草视频 |