欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

APIStar:一個(gè)專為Python3設(shè)計(jì)的API框架

 更新時(shí)間:2018年09月26日 10:31:29   作者:Masnun  
今天小編就為大家分享一篇關(guān)于一個(gè)專為Python3設(shè)計(jì)的API框架:APIStar,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧

為了在 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 所做的所有工作。

現(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ù)往下看。

pip install apistar

(上面的命令是在 Python3 虛擬環(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)目。

apistar new .

現(xiàn)在我們應(yīng)該創(chuàng)建兩個(gè)文件:app.py,它包含主應(yīng)用程序,然后是 test.py,它用于測(cè)試。讓我們來看看 app.py 文件:

from apistar import Include, Route
from apistar.frameworks.wsgi import WSGIApp as App
from apistar.handlers import docs_urls, static_urls
def welcome(name=None):
if name is None:
return {'message': 'Welcome to API Star!'}
return {'message': 'Welcome to API Star, %s!' % name}
routes = [
Route('/', 'GET', welcome),
Include('/docs', docs_urls),
Include('/static', static_urls)
]
app = App(routes=routes)
if __name__ == '__main__':
app.main()

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

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

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

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

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

這個(gè)文檔可以顯示我們?cè)赼pp.py里定義的函數(shù),并且交互式地查看函數(shù)返回值

例如我定義了一個(gè)函數(shù)叫show_task, 輸入是task_id,返回值是這個(gè)task的詳細(xì)信息,那么我們?cè)诮换ソ缑胬锟梢酝ㄟ^輸入一個(gè)valid task_id返回查詢的結(jié)果

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

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

路由

路由很簡(jiǎn)單。當(dāng)構(gòu)造 App 實(shí)例時(shí),我們需要傳遞一個(gè)列表作為 routes 參數(shù),這個(gè)列表應(yīng)該有我們剛才看到的 Route 或 Include 對(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è)簡(jiǎn)單的例子:

from apistar import Route
from apistar.frameworks.wsgi import WSGIApp as App
def user_profile(user_id: int):
return {'message': 'Your profile id is: {}'.format(user_id)}
routes = [
Route('/user/{user_id}', 'GET', user_profile),
]
app = App(routes=routes)
if __name__ == '__main__':
app.main()

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

{"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è)文件:

from apistar import Route
def user_new():
return {"message": "Create a new user"}
def user_update(user_id: int):
return {"message": "Update user #{}".format(user_id)}
def user_profile(user_id: int):
return {"message": "User Profile for: {}".format(user_id)}
user_routes = [
Route("/new", "GET", user_new),
Route("/{user_id}/update", "GET", user_update),
Route("/{user_id}/profile", "GET", user_profile),
]

現(xiàn)在我們可以從 app 主文件中導(dǎo)入 user_routes,并像這樣使用它:

from apistar import Include
from apistar.frameworks.wsgi import WSGIApp as App
from user import user_routes
routes = [
Include("/user", user_routes)
]
app = App(routes=routes)
if __name__ == '__main__':
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)值,如下所示:

def welcome(name=None):
if name is None:
return {'message': 'Welcome to API Star!'}
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)求處理程序中:

from apistar import Include, Route
from apistar.frameworks.wsgi import WSGIApp as App
from apistar import typesystem
class User(typesystem.Object):
properties = {
'name': typesystem.string(max_length=100),
'email': typesystem.string(max_length=100),
'age': typesystem.integer(maximum=100, minimum=18)
}
required = ["name", "age", "email"]
def new_user(user: User):
return user
routes = [
Route('/', 'POST', new_user),
]
app = App(routes=routes)
if __name__ == '__main__':
app.main()

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

curl -X POST
http://127.0.0.1:8080/
-H 'Cache-Control: no-cache'
-H 'Content-Type: application/json'
-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è)簡(jiǎn)單的例子:

from apistar import Route, Response
from apistar.frameworks.wsgi import WSGIApp as App
def hello():
return Response(
content="Hello".encode("utf-8"),
status=200,
headers={"X-API-Framework": "API Star"},
content_type="text/plain"
)
routes = [
Route('/', 'GET', hello),
]
app = App(routes=routes)
if __name__ == '__main__':
app.main()

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

繼續(xù)

我剛剛介紹了 API Star 的一些特性,API Star 中還有許多非??岬臇|西,我建議通過 Github Readme(https://github.com/encode/apistar)文件來了解這個(gè)優(yōu)秀框架所提供的不同功能的更多信息。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • python處理csv數(shù)據(jù)動(dòng)態(tài)顯示曲線實(shí)例代碼

    python處理csv數(shù)據(jù)動(dòng)態(tài)顯示曲線實(shí)例代碼

    這篇文章主要介紹了python處理csv數(shù)據(jù)動(dòng)態(tài)顯示曲線實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python模塊學(xué)習(xí)之struct模塊詳解

    Python模塊學(xué)習(xí)之struct模塊詳解

    這篇文章主要介紹了Python模塊學(xué)習(xí)之struct模塊詳解,該模塊作用是完成Python數(shù)值和C語言結(jié)構(gòu)體的Python字符串形式間的轉(zhuǎn)換,這可以用于處理存儲(chǔ)在文件中或從網(wǎng)絡(luò)連接中存儲(chǔ)的二進(jìn)制數(shù)據(jù),以及其他數(shù)據(jù)源,需要的朋友可以參考下
    2023-07-07
  • python中rc1什么意思

    python中rc1什么意思

    在本篇文章里小編給大家整理了關(guān)于python中rc1的基礎(chǔ)知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • Python解析Laravel?Cookie技巧示例

    Python解析Laravel?Cookie技巧示例

    本文將介紹如何使用Python解析Laravel Cookie,以便在Web開發(fā)中處理這些Cookie數(shù)據(jù),我們將深入了解Cookie的結(jié)構(gòu),以及如何在Python中對(duì)其進(jìn)行解析和操作
    2023-12-12
  • 對(duì)python 命令的-u參數(shù)詳解

    對(duì)python 命令的-u參數(shù)詳解

    今天小編就為大家分享一篇對(duì)python 命令的-u參數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 利用python、tensorflow、opencv、pyqt5實(shí)現(xiàn)人臉實(shí)時(shí)簽到系統(tǒng)

    利用python、tensorflow、opencv、pyqt5實(shí)現(xiàn)人臉實(shí)時(shí)簽到系統(tǒng)

    這篇文章主要介紹了利用python、tensorflow、opencv、pyqt5實(shí)現(xiàn)人臉實(shí)時(shí)簽到系統(tǒng),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Python中實(shí)現(xiàn)定時(shí)任務(wù)常見的幾種方式

    Python中實(shí)現(xiàn)定時(shí)任務(wù)常見的幾種方式

    在Python中,實(shí)現(xiàn)定時(shí)任務(wù)是一個(gè)常見的需求,無論是在自動(dòng)化腳本、數(shù)據(jù)處理、系統(tǒng)監(jiān)控還是其他許多應(yīng)用場(chǎng)景中,Python提供了多種方法來實(shí)現(xiàn)定時(shí)任務(wù),包括使用標(biāo)準(zhǔn)庫、第三方庫以及系統(tǒng)級(jí)別的工具,本文將詳細(xì)介紹幾種常見的Python定時(shí)任務(wù)實(shí)現(xiàn)方式
    2024-08-08
  • Python實(shí)現(xiàn)快速查找并替換Excel中的數(shù)據(jù)

    Python實(shí)現(xiàn)快速查找并替換Excel中的數(shù)據(jù)

    Excel中的查找替換是一個(gè)非常實(shí)用的功能,能夠幫助用戶快速完成大量數(shù)據(jù)的整理和處理工作,避免手動(dòng)逐一修改數(shù)據(jù)的麻煩,提高工作效率,所以本文給大家介紹了Python實(shí)現(xiàn)快速查找并替換Excel中的數(shù)據(jù),需要的朋友可以參考下
    2024-06-06
  • 詳解Python不同版本之間的切換方法

    詳解Python不同版本之間的切換方法

    本文主要介紹了詳解Python不同版本之間的切換方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Python采集某度貼吧排行榜實(shí)戰(zhàn)示例

    Python采集某度貼吧排行榜實(shí)戰(zhàn)示例

    這篇文章主要為大家介紹了Python采集某度貼吧排行榜實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04

最新評(píng)論