日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python 如何創(chuàng)建一個(gè)簡(jiǎn)單的REST接口

瀏覽:36日期:2022-07-15 17:48:51

問(wèn)題

你想使用一個(gè)簡(jiǎn)單的REST接口通過(guò)網(wǎng)絡(luò)遠(yuǎn)程控制或訪問(wèn)你的應(yīng)用程序,但是你又不想自己去安裝一個(gè)完整的web框架。

解決方案

構(gòu)建一個(gè)REST風(fēng)格的接口最簡(jiǎn)單的方法是創(chuàng)建一個(gè)基于WSGI標(biāo)準(zhǔn)(PEP 3333)的很小的庫(kù),下面是一個(gè)例子:

# resty.pyimport cgidef notfound_404(environ, start_response): start_response(’404 Not Found’, [ (’Content-type’, ’text/plain’) ]) return [b’Not Found’]class PathDispatcher: def __init__(self): self.pathmap = { } def __call__(self, environ, start_response): path = environ[’PATH_INFO’] params = cgi.FieldStorage(environ[’wsgi.input’], environ=environ) method = environ[’REQUEST_METHOD’].lower() environ[’params’] = { key: params.getvalue(key) for key in params } handler = self.pathmap.get((method,path), notfound_404) return handler(environ, start_response) def register(self, method, path, function): self.pathmap[method.lower(), path] = function return function

為了使用這個(gè)調(diào)度器,你只需要編寫不同的處理器,就像下面這樣:

import time_hello_resp = ’’’<html> <head> <title>Hello {name}</title> </head> <body> <h1>Hello {name}!</h1> </body></html>’’’def hello_world(environ, start_response): start_response(’200 OK’, [ (’Content-type’,’text/html’)]) params = environ[’params’] resp = _hello_resp.format(name=params.get(’name’)) yield resp.encode(’utf-8’)_localtime_resp = ’’’<?xml version='1.0'?><time> <year>{t.tm_year}</year> <month>{t.tm_mon}</month> <day>{t.tm_mday}</day> <hour>{t.tm_hour}</hour> <minute>{t.tm_min}</minute> <second>{t.tm_sec}</second></time>’’’def localtime(environ, start_response): start_response(’200 OK’, [ (’Content-type’, ’application/xml’) ]) resp = _localtime_resp.format(t=time.localtime()) yield resp.encode(’utf-8’)if __name__ == ’__main__’: from resty import PathDispatcher from wsgiref.simple_server import make_server # Create the dispatcher and register functions dispatcher = PathDispatcher() dispatcher.register(’GET’, ’/hello’, hello_world) dispatcher.register(’GET’, ’/localtime’, localtime) # Launch a basic server httpd = make_server(’’, 8080, dispatcher) print(’Serving on port 8080...’) httpd.serve_forever()

要測(cè)試下這個(gè)服務(wù)器,你可以使用一個(gè)瀏覽器或 urllib 和它交互。例如:

>>> u = urlopen(’http://localhost:8080/hello?name=Guido’)>>> print(u.read().decode(’utf-8’))<html> <head> <title>Hello Guido</title> </head> <body> <h1>Hello Guido!</h1> </body></html>>>> u = urlopen(’http://localhost:8080/localtime’)>>> print(u.read().decode(’utf-8’))<?xml version='1.0'?><time> <year>2012</year> <month>11</month> <day>24</day> <hour>14</hour> <minute>49</minute> <second>17</second></time>>>>

討論

在編寫REST接口時(shí),通常都是服務(wù)于普通的HTTP請(qǐng)求。但是跟那些功能完整的網(wǎng)站相比,你通常只需要處理數(shù)據(jù)。 這些數(shù)據(jù)以各種標(biāo)準(zhǔn)格式編碼,比如XML、JSON或CSV。 盡管程序看上去很簡(jiǎn)單,但是以這種方式提供的API對(duì)于很多應(yīng)用程序來(lái)講是非常有用的。

例如,長(zhǎng)期運(yùn)行的程序可能會(huì)使用一個(gè)REST API來(lái)實(shí)現(xiàn)監(jiān)控或診斷。 大數(shù)據(jù)應(yīng)用程序可以使用REST來(lái)構(gòu)建一個(gè)數(shù)據(jù)查詢或提取系統(tǒng)。 REST還能用來(lái)控制硬件設(shè)備比如機(jī)器人、傳感器、工廠或燈泡。 更重要的是,REST API已經(jīng)被大量客戶端編程環(huán)境所支持,比如Javascript, Android, iOS等。 因此,利用這種接口可以讓你開發(fā)出更加復(fù)雜的應(yīng)用程序。

為了實(shí)現(xiàn)一個(gè)簡(jiǎn)單的REST接口,你只需讓你的程序代碼滿足Python的WSGI標(biāo)準(zhǔn)即可。 WSGI被標(biāo)準(zhǔn)庫(kù)支持,同時(shí)也被絕大部分第三方web框架支持。 因此,如果你的代碼遵循這個(gè)標(biāo)準(zhǔn),在后面的使用過(guò)程中就會(huì)更加的靈活!

在WSGI中,你可以像下面這樣約定的方式以一個(gè)可調(diào)用對(duì)象形式來(lái)實(shí)現(xiàn)你的程序。

import cgidef wsgi_app(environ, start_response): pass

environ 屬性是一個(gè)字典,包含了從web服務(wù)器如Apache[參考Internet RFC 3875]提供的CGI接口中獲取的值。 要將這些不同的值提取出來(lái),你可以像這么這樣寫:

def wsgi_app(environ, start_response): method = environ[’REQUEST_METHOD’] path = environ[’PATH_INFO’] # Parse the query parameters params = cgi.FieldStorage(environ[’wsgi.input’], environ=environ)

我們展示了一些常見的值。environ[’REQUEST_METHOD’] 代表請(qǐng)求類型如GET、POST、HEAD等。 environ[’PATH_INFO’] 表示被請(qǐng)求資源的路徑。 調(diào)用 cgi.FieldStorage() 可以從請(qǐng)求中提取查詢參數(shù)并將它們放入一個(gè)類字典對(duì)象中以便后面使用。

start_response 參數(shù)是一個(gè)為了初始化一個(gè)請(qǐng)求對(duì)象而必須被調(diào)用的函數(shù)。 第一個(gè)參數(shù)是返回的HTTP狀態(tài)值,第二個(gè)參數(shù)是一個(gè)(名,值)元組列表,用來(lái)構(gòu)建返回的HTTP頭。例如:

def wsgi_app(environ, start_response): pass start_response(’200 OK’, [(’Content-type’, ’text/plain’)])

為了返回?cái)?shù)據(jù),一個(gè)WSGI程序必須返回一個(gè)字節(jié)字符串序列。可以像下面這樣使用一個(gè)列表來(lái)完成:

def wsgi_app(environ, start_response): pass start_response(’200 OK’, [(’Content-type’, ’text/plain’)]) resp = [] resp.append(b’Hello Worldn’) resp.append(b’Goodbye!n’) return resp

或者,你還可以使用 yield :

def wsgi_app(environ, start_response): pass start_response(’200 OK’, [(’Content-type’, ’text/plain’)]) yield b’Hello Worldn’ yield b’Goodbye!n’

這里要強(qiáng)調(diào)的一點(diǎn)是最后返回的必須是字節(jié)字符串。如果返回結(jié)果包含文本字符串,必須先將其編碼成字節(jié)。 當(dāng)然,并沒有要求你返回的一定是文本,你可以很輕松的編寫一個(gè)生成圖片的程序。

盡管WSGI程序通常被定義成一個(gè)函數(shù),不過(guò)你也可以使用類實(shí)例來(lái)實(shí)現(xiàn),只要它實(shí)現(xiàn)了合適的 __call__() 方法。例如:

class WSGIApplication: def __init__(self): ... def __call__(self, environ, start_response) ...

我們已經(jīng)在上面使用這種技術(shù)創(chuàng)建 PathDispatcher 類。 這個(gè)分發(fā)器僅僅只是管理一個(gè)字典,將(方法,路徑)對(duì)映射到處理器函數(shù)上面。 當(dāng)一個(gè)請(qǐng)求到來(lái)時(shí),它的方法和路徑被提取出來(lái),然后被分發(fā)到對(duì)應(yīng)的處理器上面去。 另外,任何查詢變量會(huì)被解析后放到一個(gè)字典中,以 environ[’params’] 形式存儲(chǔ)。 后面這個(gè)步驟太常見,所以建議你在分發(fā)器里面完成,這樣可以省掉很多重復(fù)代碼。 使用分發(fā)器的時(shí)候,你只需簡(jiǎn)單的創(chuàng)建一個(gè)實(shí)例,然后通過(guò)它注冊(cè)各種WSGI形式的函數(shù)。 編寫這些函數(shù)應(yīng)該超級(jí)簡(jiǎn)單了,只要你遵循 start_response() 函數(shù)的編寫規(guī)則,并且最后返回字節(jié)字符串即可。

當(dāng)編寫這種函數(shù)的時(shí)候還需注意的一點(diǎn)就是對(duì)于字符串模板的使用。 沒人愿意寫那種到處混合著 print() 函數(shù) 、XML和大量格式化操作的代碼。 我們上面使用了三引號(hào)包含的預(yù)先定義好的字符串模板。 這種方式的可以讓我們很容易的在以后修改輸出格式(只需要修改模板本身,而不用動(dòng)任何使用它的地方)。

最后,使用WSGI還有一個(gè)很重要的部分就是沒有什么地方是針對(duì)特定web服務(wù)器的。 因?yàn)闃?biāo)準(zhǔn)對(duì)于服務(wù)器和框架是中立的,你可以將你的程序放入任何類型服務(wù)器中。 我們使用下面的代碼測(cè)試測(cè)試本節(jié)代碼:

if __name__ == ’__main__’: from wsgiref.simple_server import make_server # Create the dispatcher and register functions dispatcher = PathDispatcher() pass # Launch a basic server httpd = make_server(’’, 8080, dispatcher) print(’Serving on port 8080...’) httpd.serve_forever()

上面代碼創(chuàng)建了一個(gè)簡(jiǎn)單的服務(wù)器,然后你就可以來(lái)測(cè)試下你的實(shí)現(xiàn)是否能正常工作。 最后,當(dāng)你準(zhǔn)備進(jìn)一步擴(kuò)展你的程序的時(shí)候,你可以修改這個(gè)代碼,讓它可以為特定服務(wù)器工作。

WSGI本身是一個(gè)很小的標(biāo)準(zhǔn)。因此它并沒有提供一些高級(jí)的特性比如認(rèn)證、cookies、重定向等。 這些你自己實(shí)現(xiàn)起來(lái)也不難。不過(guò)如果你想要更多的支持,可以考慮第三方庫(kù),比如 WebOb 或者 Paste

以上就是Python 如何創(chuàng)建一個(gè)簡(jiǎn)單的REST接口的詳細(xì)內(nèi)容,更多關(guān)于Python 創(chuàng)建REST接口的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本午夜精品久久久久| 欧美日韩va| 欧美黄页在线免费观看| 日韩成人午夜精品| 国产91精品对白在线播放| 国产精品伦理久久久久久| 国产欧美自拍| 国产精品亚洲综合在线观看| 日本一区二区中文字幕| 日韩精品a在线观看91| 日韩欧美久久| 日韩精品亚洲一区二区三区免费| 在线精品一区| 日韩高清一区| 国产欧美一级| 久久av网址| 精品国内亚洲2022精品成人| 国产在线观看91一区二区三区| 精品美女在线视频| 精品久久99| 美女av在线免费看| 久久狠狠婷婷| 六月天综合网| 日韩高清在线不卡| 欧美精品aa| 蜜臀国产一区| 黄色成人精品网站| 青青青国产精品| 狠狠久久伊人中文字幕| 久久精品高清| 亚洲专区视频| 精品国产三区在线| 天堂资源在线亚洲| 亚洲精品系列| 日韩久久一区| 国产盗摄——sm在线视频| 91久久久久| 91精品丝袜国产高跟在线| 国产夫妻在线| 蜜桃一区二区三区在线| 久久成人高清| 欧美.日韩.国产.一区.二区 | 亚洲黄页一区| 日韩精品导航| 久久久777| 日韩精品社区| 蜜臀国产一区| 最新亚洲国产| 麻豆国产精品| 亚洲一区二区三区久久久| 日韩三级精品| 久久久精品五月天| 免费日韩视频| 欧美日韩在线播放视频| 中文久久精品| 久久一级电影| 日韩欧美字幕| 国产情侣久久| 欧美+亚洲+精品+三区| 精品视频自拍| 快she精品国产999| 婷婷五月色综合香五月| www.九色在线| 欧美在线综合| 国产在线看片免费视频在线观看| 99精品电影| 国产乱码精品一区二区亚洲| 精品国产精品国产偷麻豆| 成人福利av| 丝袜美腿成人在线| 欧美在线91| 影院欧美亚洲| 麻豆精品新av中文字幕| 亚洲先锋成人| 日本免费新一区视频| 亚洲天堂黄色| 青青国产精品| 蜜桃传媒麻豆第一区在线观看| 久久精品一本| 免费在线观看一区二区三区| 亚洲精选成人| 久久电影tv| 久久av中文| 久久亚洲视频| 激情婷婷综合| 麻豆视频久久| 热久久国产精品| 97视频热人人精品免费| 少妇高潮一区二区三区99| 成人在线免费观看网站| 青草国产精品| 99tv成人| а√天堂8资源中文在线| 日韩伦理一区| 免费一级片91| 91在线成人| 亚洲资源网站| 国产精品宾馆| 日韩在线视频精品| 久久国产精品毛片| 国产精品一国产精品k频道56| 久久精品亚洲| 成人羞羞视频播放网站| 国产精品羞羞答答在线观看| 婷婷色综合网| 精品99在线| 美女网站久久| 日韩一区欧美| 国产经典一区| 日韩黄色av| 在线看片不卡| 精品中文一区| 日韩欧美精品一区| 97精品国产| 免费在线亚洲欧美| 91精品国产一区二区在线观看| 蜜桃免费网站一区二区三区| 久久精选视频| 四虎8848精品成人免费网站| 青青草91视频| 青青草国产成人99久久| 久久国产视频网| 日韩中文一区二区| 日韩精品成人在线观看| 日韩欧美中文字幕一区二区三区| 国产在线成人| 蜜桃一区二区三区| 亲子伦视频一区二区三区| 99精品在线免费在线观看| 国产一区二区三区四区五区传媒| 精品一区不卡| 你懂的国产精品永久在线| 国产精品视频一区二区三区综合| 悠悠资源网久久精品| 国产精品毛片一区二区三区| 久久精品亚洲人成影院| 久久久久久久久久久妇女| 免费看av不卡| 欧美日韩在线播放视频| 欧洲精品一区二区三区| 秋霞影院一区二区三区| 给我免费播放日韩视频| 久久国产三级| 麻豆久久一区二区| 久久免费精品| 日本国产精品| 岛国av在线播放| 激情丁香综合| 久久国产免费| 久久不射中文字幕| 视频在线在亚洲| 欧美日韩伊人| 国产精品亚洲片在线播放| 成午夜精品一区二区三区软件| 久久永久免费| 99久久久久| 国产亚洲福利| 国产成人免费av一区二区午夜| 欧美日本一区| 中文视频一区| 久久精品99久久久| 美女av一区| 欧美不卡高清一区二区三区| 国产精品xxxav免费视频| 中文字幕一区二区三区四区久久 | 亚洲va久久久噜噜噜久久| 中文视频一区| 日本中文字幕一区二区视频 | 亚洲香蕉网站| 免费观看在线综合色| 日本成人中文字幕| 日本大胆欧美人术艺术动态| 久久不射中文字幕| 国产精品麻豆成人av电影艾秋| 麻豆精品在线播放| 欧美亚洲激情| 蜜桃视频免费观看一区| 久久亚洲国产精品尤物| 樱桃视频成人在线观看| 久热综合在线亚洲精品| 久久狠狠亚洲综合| 久久一区二区中文字幕| 亚洲一区av| 中文av在线全新| 狠狠爱成人网| 国产精品香蕉| 国产suv精品一区二区四区视频 | 国产日韩欧美| 都市激情国产精品| 一区二区国产在线| 久久精品97| 久久精品国产www456c0m| 免费看精品久久片| 精品久久一区| 欧美日韩激情在线一区二区三区| 爽爽淫人综合网网站| 国产乱子精品一区二区在线观看 | 快she精品国产999| 97精品久久| 91久久在线|