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

您的位置:首頁技術文章
文章詳情頁

Python 如何創建一個簡單的REST接口

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

問題

你想使用一個簡單的REST接口通過網絡遠程控制或訪問你的應用程序,但是你又不想自己去安裝一個完整的web框架。

解決方案

構建一個REST風格的接口最簡單的方法是創建一個基于WSGI標準(PEP 3333)的很小的庫,下面是一個例子:

# 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

為了使用這個調度器,你只需要編寫不同的處理器,就像下面這樣:

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

要測試下這個服務器,你可以使用一個瀏覽器或 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接口時,通常都是服務于普通的HTTP請求。但是跟那些功能完整的網站相比,你通常只需要處理數據。 這些數據以各種標準格式編碼,比如XML、JSON或CSV。 盡管程序看上去很簡單,但是以這種方式提供的API對于很多應用程序來講是非常有用的。

例如,長期運行的程序可能會使用一個REST API來實現監控或診斷。 大數據應用程序可以使用REST來構建一個數據查詢或提取系統。 REST還能用來控制硬件設備比如機器人、傳感器、工廠或燈泡。 更重要的是,REST API已經被大量客戶端編程環境所支持,比如Javascript, Android, iOS等。 因此,利用這種接口可以讓你開發出更加復雜的應用程序。

為了實現一個簡單的REST接口,你只需讓你的程序代碼滿足Python的WSGI標準即可。 WSGI被標準庫支持,同時也被絕大部分第三方web框架支持。 因此,如果你的代碼遵循這個標準,在后面的使用過程中就會更加的靈活!

在WSGI中,你可以像下面這樣約定的方式以一個可調用對象形式來實現你的程序。

import cgidef wsgi_app(environ, start_response): pass

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

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’] 代表請求類型如GET、POST、HEAD等。 environ[’PATH_INFO’] 表示被請求資源的路徑。 調用 cgi.FieldStorage() 可以從請求中提取查詢參數并將它們放入一個類字典對象中以便后面使用。

start_response 參數是一個為了初始化一個請求對象而必須被調用的函數。 第一個參數是返回的HTTP狀態值,第二個參數是一個(名,值)元組列表,用來構建返回的HTTP頭。例如:

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

為了返回數據,一個WSGI程序必須返回一個字節字符串序列。可以像下面這樣使用一個列表來完成:

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’

這里要強調的一點是最后返回的必須是字節字符串。如果返回結果包含文本字符串,必須先將其編碼成字節。 當然,并沒有要求你返回的一定是文本,你可以很輕松的編寫一個生成圖片的程序。

盡管WSGI程序通常被定義成一個函數,不過你也可以使用類實例來實現,只要它實現了合適的 __call__() 方法。例如:

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

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

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

最后,使用WSGI還有一個很重要的部分就是沒有什么地方是針對特定web服務器的。 因為標準對于服務器和框架是中立的,你可以將你的程序放入任何類型服務器中。 我們使用下面的代碼測試測試本節代碼:

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

上面代碼創建了一個簡單的服務器,然后你就可以來測試下你的實現是否能正常工作。 最后,當你準備進一步擴展你的程序的時候,你可以修改這個代碼,讓它可以為特定服務器工作。

WSGI本身是一個很小的標準。因此它并沒有提供一些高級的特性比如認證、cookies、重定向等。 這些你自己實現起來也不難。不過如果你想要更多的支持,可以考慮第三方庫,比如 WebOb 或者 Paste

以上就是Python 如何創建一個簡單的REST接口的詳細內容,更多關于Python 創建REST接口的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品国产精品| 久久久久免费av| 三级一区在线视频先锋| 亚洲精品在线影院| 久久久久国产精品一区二区| 欧美99久久| 伊人久久成人| 日本不卡在线视频| 欧美精品不卡| 性感美女一区二区在线观看| 国产偷自视频区视频一区二区| 石原莉奈在线亚洲二区| 青草av.久久免费一区| 老鸭窝一区二区久久精品| 成人欧美一区二区三区的电影| 91精品蜜臀一区二区三区在线| 亚洲经典在线| 久久国产麻豆精品| 日本一区二区免费高清| 亚洲国产不卡| 欧美天堂一区| 久久久久久黄| 少妇高潮一区二区三区99| 丁香婷婷久久| 天堂成人国产精品一区| 国产经典一区| 亚洲一本视频| 国产乱子精品一区二区在线观看| 日韩国产一区| 欧美一区=区| 久久亚洲黄色| 欧美+日本+国产+在线a∨观看| 日本一区二区三区中文字幕| 麻豆一区在线| 日韩午夜av| 久久三级中文| 日韩中文字幕一区二区三区| 麻豆视频一区| 狠狠爱www人成狠狠爱综合网| 久久精品xxxxx| 国产国产精品| 久久99久久久精品欧美| 国产精品外国| 国产91在线播放精品| 一区二区三区午夜视频| 国产aa精品| 亚洲精品国产日韩| 久久久久久久久久久妇女| 日本不卡高清| 免费av一区| 精品三级国产| 日韩国产高清在线| 9色精品在线| 97精品一区| 国产精品一区二区三区www| 亚洲精品一区二区妖精| 成人亚洲一区| 国产精品亚洲四区在线观看| 亚洲欧美日韩一区在线观看| 亚洲国产成人二区| 国产精品丝袜在线播放| 亚洲毛片在线免费| 免费欧美一区| 欧美国产偷国产精品三区| 日本少妇一区二区| 久久福利影视| 欧美一区二区三区高清视频| 高清一区二区| 国产精品v日韩精品v欧美精品网站| 另类亚洲自拍| 亚洲高清影视| 久久美女性网| 天堂а√在线最新版中文在线| 国产精品久久久久久久久久齐齐| 在线一区二区三区视频| 女人天堂亚洲aⅴ在线观看| 老牛影视精品| 国产一区二区三区久久| 日韩1区2区日韩1区2区| 亚洲69av| 中文字幕一区二区精品区| 在线综合亚洲| 亚洲欧美日韩高清在线| 欧美精品羞羞答答| 亚洲va在线| 久久久成人网| 136国产福利精品导航网址| yellow在线观看网址| 高清久久精品| 日韩一区二区中文| 日本美女一区| 久久美女性网| 亚洲大片在线| 九一成人免费视频| 亚洲激情中文| 丝袜亚洲精品中文字幕一区| 玖玖玖国产精品| 综合激情婷婷| 午夜久久av| 欧美在线不卡| 欧美黄色精品| 裤袜国产欧美精品一区| 日韩精品诱惑一区?区三区| 蜜桃精品在线| 婷婷亚洲综合| 亚洲综合婷婷| 国产伦一区二区三区| 麻豆精品99| 韩日一区二区| 国产在线|日韩| 午夜精品网站| 最近国产精品视频| 欧美亚洲三区| 成人国产综合| 欧美日韩国产在线观看网站 | 国产亚洲综合精品| 丝袜诱惑制服诱惑色一区在线观看 | 999精品色在线播放| 特黄特色欧美大片| 尤物在线精品| 91大神在线观看线路一区| 久久99精品久久久野外观看| 97精品97| 午夜在线精品| 国产日韩一区二区三区在线 | 亚洲神马久久| 日韩精品国产精品| 美女av一区| 天堂av在线| 在线看片日韩| 精品视频一区二区三区四区五区| 色婷婷狠狠五月综合天色拍| 国产美女精品| 国产精品分类| 丝袜av一区| 日本一不卡视频| 国产传媒在线观看| 日韩影院免费视频| 久久av电影| 欧美日韩激情| 国产情侣久久| 激情久久婷婷| 国产精品va| 99视频精品视频高清免费| 色综合视频一区二区三区日韩| 首页国产精品| 亚洲久草在线| 高清不卡亚洲| 日韩在线成人| 久久精品观看| 国产欧美日韩在线观看视频| 久久国产亚洲| 你懂的亚洲视频| 亚洲经典在线| 成人午夜网址| 色综合视频一区二区三区日韩| 日韩电影免费网址| 国产欧美日韩精品一区二区免费 | 久久午夜精品| 国产精品yjizz视频网| 亚洲人亚洲人色久| 麻豆精品蜜桃| 你懂的国产精品| 视频一区二区三区入口| 成人va天堂| 久久三级毛片| 日韩在线成人| 伊人久久婷婷| 国产一区二区三区天码| 日韩一区二区三区精品| 九色精品91| 日韩电影在线视频| 国产精品一级在线观看| 蜜臀久久久久久久| 亚洲一级高清| а√天堂8资源中文在线| 国产欧美综合一区二区三区| 伊人久久大香伊蕉在人线观看热v| 婷婷综合六月| 麻豆91小视频| 久久精品超碰| 日韩精品福利一区二区三区| 久久av在线| 免费av一区| 久久久777| 欧美男人天堂| 精品五月天堂| av最新在线| 国产一区福利| 久久精品二区亚洲w码 | 日本国产亚洲| 香蕉久久一区| 偷拍亚洲精品| 日韩精品一页| 日韩国产一二三区| 四虎精品一区二区免费| 亚洲色诱最新| 老色鬼久久亚洲一区二区| 亚洲少妇诱惑| 免费观看久久久4p|