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
廣告