
- Python Pyramid 教程
- Python Pyramid - 首頁
- Python Pyramid - 概述
- Pyramid - 環境設定
- Python Pyramid - Hello World
- Pyramid - 應用配置
- Python Pyramid - URL 路由
- Python Pyramid - 檢視配置
- Python Pyramid - 路由字首
- Python Pyramid - 模板
- Pyramid - HTML 表單模板
- Python Pyramid - 靜態資源
- Python Pyramid - 請求物件
- Python Pyramid - 響應物件
- Python Pyramid - 會話
- Python Pyramid - 事件
- Python Pyramid - 訊息閃現
- Pyramid - 使用 SQLAlchemy
- Python Pyramid - Cookiecutter
- Python Pyramid - 建立專案
- Python Pyramid - 專案結構
- Python Pyramid - 包結構
- 手動建立專案
- 命令列 Pyramid
- Python Pyramid - 測試
- Python Pyramid - 日誌記錄
- Python Pyramid - 安全性
- Python Pyramid - 部署
- Python Pyramid 有用資源
- Python Pyramid - 快速指南
- Python Pyramid - 有用資源
- Python Pyramid - 討論
Python Pyramid - 檢視配置
術語“檢視配置”指的是將檢視可呼叫物件(函式、方法或類)與路由配置資訊關聯的機制。Pyramid 查詢給定 URL 模式的最佳可呼叫物件。
有三種方法可以配置檢視:
使用 add_view() 方法
使用 @view_config() 裝飾器
使用 @view_defaults() 類裝飾器
使用 add_view() 方法
這是透過呼叫Configurator物件的add_view()方法以命令式方式配置檢視的最簡單方法。
此方法使用以下引數:
name - 需要匹配此檢視可呼叫物件的檢視名稱。如果未提供名稱,則使用空字串(表示預設檢視)。
context - 此資源必須是 Python 類的物件,以便找到並呼叫此檢視。如果未提供 context,則使用值 None,它匹配任何資源。
route_name - 此值必須與路由配置宣告的名稱匹配,在呼叫此檢視之前必須匹配此名稱。如果提供了 route_name,則只有在命名路由匹配時才會呼叫檢視可呼叫物件。
request_type - 請求必須提供的介面,以便找到並呼叫此檢視。
request_method - 表示 HTTP REQUEST_METHOD 的字串(例如“GET”、“POST”、“PUT”、“DELETE”、“HEAD”或“OPTIONS”)或包含一個或多個這些字串的元組。只有當請求的 method 屬性與提供的 value 匹配時,才會呼叫檢視。
request_param - 此引數可以是任何字串或字串序列。只有當 request.params 字典具有與提供的 value 匹配的鍵時,才會呼叫檢視。
示例
在下面的示例中,定義了兩個函式getview()和postview(),並將其與相同名稱的兩個路由關聯。這些函式只是返回呼叫它們的 HTTP 方法的名稱。
當使用 GET 方法請求 URL /get 時,呼叫 getview() 函式。類似地,當使用 POST 方法請求/post路徑時,執行 postview() 函式。
from wsgiref.simple_server import make_server from pyramid.config import Configurator from pyramid.response import Response def getview(request): ret=request.method return Response('Method: {}'.format(ret)) def postview(request): ret=request.method return Response('Method: {}'.format(ret)) if __name__ == '__main__': with Configurator() as config: config.add_route('getview', '/get') config.add_route('postview', '/post') config.add_view(getview, route_name='getview',request_method='GET') config.add_view(postview,route_name='postview', request_method='POST') app = config.make_wsgi_app() server = make_server('0.0.0.0', 6543, app) server.serve_forever()
雖然可以使用 Web 瀏覽器作為 HTTP 客戶端傳送 GET 請求,但不能將其用於 POST 請求。因此,我們使用 CURL 命令列實用程式。
C:\Users\Acer>curl localhost:6543/get Method: GET C:\Users\Acer>curl -d "param1=value1" -H "Content-Type: application/json" -X POST https://:6543/post Method: POST
如前所述,request_method引數可以是一個或多個 HTTP 方法的列表。讓我們修改上面的程式並定義一個可以識別導致其執行的 HTTP 方法的單個oneview()函式。
def oneview(request): ret=request.method return Response('Method: {}'.format(ret))
此函式在應用程式的配置中為所有 HTTP 方法註冊。
config.add_route('oneview', '/view') config.add_view(oneview, route_name='oneview', request_method=['GET','POST', 'PUT', 'DELETE'])
輸出
CURL 輸出如下所示:
C:\Users\Acer>curl localhost:6543/view Method: GET C:\Users\Acer>curl -d "param1=value1" -H "Content-Type: application/json" -X POST https://:6543/view Method: POST C:\Users\Acer>curl -d "param1=value1" -H "Content-Type: application/json" -X PUT https://:6543/view Method: PUT C:\Users\Acer>curl -X DELETE https://:6543/view Method: DELETE
使用 @view_config() 裝飾器
無需以命令式方式新增檢視,可以使用 @view_config 裝飾器將配置的路由與函式、方法甚至可呼叫類關聯。
示例
如宣告式配置部分所述,註冊的路由可以與函式關聯,如下例所示:
from wsgiref.simple_server import make_server from pyramid.config import Configurator from pyramid.response import Response from pyramid.view import view_config @view_config(route_name='hello') def hello_world(request): return Response('Hello World!') if __name__ == '__main__': with Configurator() as config: config.add_route('hello', '/') config.scan() app = config.make_wsgi_app() server = make_server('0.0.0.0', 6543, app) server.serve_forever()
請注意,只有在呼叫 scan() 方法後,檢視才會新增到應用程式配置中。雖然消除了命令式新增檢視的需要,但效能可能會稍慢。
輸出
view_config() 裝飾器也可以使用與 add_view() 方法相同的引數。所有引數都可以省略。
@view_config() def hello_world(request): return Response('Hello World!')
在這種情況下,該函式將註冊任何路由名稱、任何請求方法或引數。
view_config 裝飾器放置在可呼叫檢視函式定義之前,如上例所示。如果要將其用作檢視可呼叫物件,也可以將其放在類的頂部。這樣的類必須具有 __call__() 方法。
在下面的 Pyramid 應用程式程式碼中,MyView 類用作可呼叫物件,並由@view_config裝飾器裝飾。
from wsgiref.simple_server import make_server from pyramid.config import Configurator from pyramid.response import Response from pyramid.view import view_config @view_config(route_name='hello') class MyView(object): def __init__(self, request): self.request = request def __call__(self): return Response('hello World') if __name__ == '__main__': with Configurator() as config: config.add_route('hello', '/') #config.add_view(MyView, route_name='hello') config.scan() app = config.make_wsgi_app() server = make_server('0.0.0.0', 6543, app) server.serve_forever()
請注意,我們可以透過顯式呼叫 add_view() 方法來新增檢視,而不是掃描檢視配置。
示例
如果類中的方法必須與不同的路由關聯,則應在每個方法的頂部使用單獨的 @view_config(),如下例所示。這裡,我們有兩個方法繫結到兩個單獨的路由。
from wsgiref.simple_server import make_server from pyramid.config import Configurator from pyramid.response import Response from pyramid.view import class MyView(object): def __init__(self, request): self.request = request @view_config(route_name='getview', request_method='GET') def getview(self): return Response('hello GET') @view_config(route_name='postview', request_method='POST') def postview(self): return Response('hello POST') if __name__ == '__main__': with Configurator() as config: config.add_route('getview', '/get') config.add_route('postview', '/post') config.scan() app = config.make_wsgi_app() server = make_server('0.0.0.0', 6543, app) server.serve_forever()
輸出
以下是 CURL 命令的輸出:
C:\Users\Acer>curl localhost:6543/get hello GET C:\Users\Acer>curl -d "param1=value1" -H "Content-Type: application/json" -X POST https://:6543/post hello POST
使用 @view_defaults() 裝飾器
view_defaults() 是一個類裝飾器。如果您必須將類中的方法新增為具有某些公共引數和某些特定引數的檢視,則可以在類的頂部指定view_defaults()裝飾器中的公共引數,並在每個方法之前使用單獨的view_config()來執行每個方法的配置。
示例
在下面的程式碼中,我們有不同的方法響應相同的路由,但具有不同的request_method。因此,我們將路由名稱定義為預設值,並在每個檢視配置中指定request_method。
from wsgiref.simple_server import make_server from pyramid.config import Configurator from pyramid.response import Response from pyramid.view import view_config from pyramid.view import view_defaults @view_defaults(route_name='myview') class MyView(object): def __init__(self, request): self.request = request @view_config( request_method='GET') def getview(self): return Response('hello GET') @view_config(request_method='POST') def postview(self): return Response('hello POST') @view_config(request_method='PUT') def putview(self): return Response('hello PUT') @view_config(request_method='DELETE') def delview(self): return Response('hello DELETE') if __name__ == '__main__': with Configurator() as config: config.add_route('myview', '/view') config.scan() app = config.make_wsgi_app() server = make_server('0.0.0.0', 6543, app) server.serve_forever()
輸出
使用不同的 HTTP 請求向伺服器傳送 CURL 命令如下:
C:\Users\Acer>curl localhost:6543/view hello GET C:\Users\Acer>curl -d "param1=value1" -H "Content-Type: application/json" -X POST https://:6543/view hello POST C:\Users\Acer>curl -d "param1=value1" -H "Content-Type: application/json" -X PUT https://:6543/view hello PUT C:\Users\Acer>curl -X DELETE https://:6543/view hello DELETE