日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
APIStar:一個(gè)Python3的API框架

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

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了岷縣免費(fèi)建站歡迎大家使用!

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

開始

我們將從安裝 API Star 開始。為此實(shí)驗(yàn)創(chuàng)建一個(gè)虛擬環(huán)境是一個(gè)好主意。如果你不知道如何創(chuàng)建一個(gè)虛擬環(huán)境,不要擔(dān)心,繼續(xù)往下看。

 
 
 
  1. pip install apistar

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

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

一旦我們安裝了這個(gè)包,我們就應(yīng)該可以使用 apistar 命令行工具了。我們可以用它創(chuàng)建一個(gè)新項(xiàng)目,讓我們?cè)诋?dāng)前目錄中創(chuàng)建一個(gè)新項(xiàng)目。

 
 
 
  1. apistar new .

現(xiàn)在我們應(yīng)該創(chuàng)建兩個(gè)文件:app.py,它包含主應(yīng)用程序,然后是 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()

在我們深入研究代碼之前,讓我們運(yùn)行應(yīng)用程序并查看它是否正常工作。我們?cè)跒g覽器中輸入 http://127.0.0.1:8080/,我們將得到以下響應(yīng):

 
 
 
  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/,我們將看到自動(dòng)生成的 API 文檔。

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

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

路由

路由很簡單。當(dāng)構(gòu)造 App 實(shí)例時(shí),我們需要傳遞一個(gè)列表作為 routes 參數(shù),這個(gè)列表應(yīng)該有我們剛才看到的 RouteInclude 對(duì)象組成。對(duì)于 Route,我們傳遞一個(gè) url 路徑,http 方法和可調(diào)用的請(qǐng)求處理程序(函數(shù)或者其他)。對(duì)于 Include 實(shí)例,我們傳遞一個(gè) url 路徑和一個(gè) Routes 實(shí)例列表。

路徑參數(shù)

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

 
 
 
  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()

如果我們?cè)L問 http://127.0.0.1:8080/user/23,我們將得到以下響應(yīng):

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

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

包含/分組路由

有時(shí)候?qū)⒛承?url 組合在一起是有意義的。假設(shè)我們有一個(gè)處理用戶相關(guān)功能的 user 模塊,將所有與用戶相關(guān)的 url 分組在 /user 路徑下可能會(huì)更好。例如 /user/new/user/1、/user/1/update 等等。我們可以輕松地在單獨(dú)的模塊或包中創(chuàng)建我們的處理程序和路由,然后將它們包含在我們自己的路由中。

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

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

現(xiàn)在我們可以從 app 主文件中導(dǎo)入 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()

現(xiàn)在 /user/new 將委托給 user_new 函數(shù)。

訪問查詢字符串/查詢參數(shù)

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

 
 
 
  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}

在上面的例子中,我們?yōu)?name 設(shè)置了一個(gè)默認(rèn)值 None。

注入對(duì)象

通過給一個(gè)請(qǐng)求程序添加類型提示,我們可以將不同的對(duì)象注入到視圖中。注入請(qǐng)求相關(guān)的對(duì)象有助于處理程序直接從內(nèi)部訪問它們。API Star 內(nèi)置的 http 包中有幾個(gè)內(nèi)置對(duì)象。我們也可以使用它的類型系統(tǒng)來創(chuàng)建我們自己的自定義對(duì)象并將它們注入到我們的函數(shù)中。API Star 還根據(jù)指定的約束進(jìn)行數(shù)據(jù)驗(yàn)證。

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

 
 
 
  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()

現(xiàn)在如果我們發(fā)送這樣的請(qǐng)求:

 
 
 
  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}'

猜猜發(fā)生了什么?我們得到一個(gè)錯(cuò)誤,說年齡必須等于或大于 18。類型系允許我們進(jìn)行智能數(shù)據(jù)驗(yàn)證。如果我們啟用了 docs url,我們還將自動(dòng)記錄這些參數(shù)。

發(fā)送響應(yīng)

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

 
 
 
  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()

它應(yīng)該返回純文本響應(yīng)和一個(gè)自定義標(biāo)響應(yīng)頭。請(qǐng)注意,content 應(yīng)該是字節(jié),而不是字符串。這就是我編碼它的原因。

繼續(xù)

我剛剛介紹了 API Star 的一些特性,API Star 中還有許多非??岬臇|西,我建議通過 Github Readme 文件來了解這個(gè)優(yōu)秀框架所提供的不同功能的更多信息。我還將嘗試在未來幾天內(nèi)介紹關(guān)于 API Star 的更多簡短的,集中的教程。 


文章標(biāo)題:APIStar:一個(gè)Python3的API框架
轉(zhuǎn)載源于:http://m.5511xx.com/article/cdhcpgc.html