누락 된 부분은 통과 부분이라고 생각합니다. 제품 은 자원입니까? 글쎄 그것은 당신의 순회가 무엇을 만들어 내느냐에 달려 있습니다. 은 제품을 생산할 수 있습니다 .....
아마 이걸보기에서 끝까지 걸어서 어플을 만들 때 어떻게 구성할까요?
다음은 일반적인보기입니다.
@view_config(context=Product, permission="view")
def view_product(context, request):
pass # would do stuff
컨텍스트가 Product의 인스턴스 일 때이 뷰가 호출됩니다. 해당 인스턴스의 acl 속성에 "보기" 권한이있는 경우 입니다. 그렇다면 Product의 인스턴스가 컨텍스트가되는 방법은 무엇입니까?
이것은 순회 마법이 들어오는 곳입니다. 순회의 논리는 단순한 사전 사전입니다. 당신은 어떻게 든
/product/1
같은 URL이 있다면 그래서이 당신을 위해 일할 수있는 한 가지 방법입니다, 일부 자원은보기가 결정될 수 있도록 컨텍스트를 결정하기 위해 URL의 세그먼트로 이송 될 필요가있다 . 경우 우리는 이제이 문서에 포함되며, 난 당신이 알아야 할 기본 사항까지 그것을 을 끓여을 시도하고있어 뭔가 같은 ...
class ProductContainer(object):
"""
container = ProductContainer()
container[1]
>>> <Product(1)>
"""
def __init__(self, request, name="product", parent=None):
self.__name__ = name
self.__parent__ = parent
self._request = request
def __getitem__(self, key):
p = db.get_product(id=key)
if not p:
raise KeyError(key)
else:
p.__acl__ = [(Allow, Everyone,"view")]
p.__name__ = key
p.__parent__ = self
return p
있었다 무엇. ProductContainer는 사전처럼 작동하는 개체입니다. "이름"및 "부모" URL 생성 메서드가 제대로 작동하려면 피라미드에서 특성이 필요합니다.
이제 우리는 트래버스 할 수있는 리소스를 갖게되었습니다. ProductContainer를 통과하기 위해 피라미드에 을 어떻게 말합니까? 구성자 객체를 통해이를 수행합니다.
config = Configurator()
config.add_route(name="product",
path="/product/*traverse",
factory=ProductContainer)
config.scan()
application = config.make_wsgi_app()
공장 매개 변수는 호출을 기대하고 그것에게 현재 요청을 손. ProductContainer가 그렇게됩니다. 은 으로 처리됩니다.
이 간단한 예제에서는 조금 더 보일 수도 있지만, 가능하면 가능성을 상상해보십시오. 이 패턴을 사용하면 아주 세밀한 사용 권한 모델 인 을 사용할 수 있습니다.
로우 레벨 acl과 같이 매우 세분화 된 권한 모델을 원하지 않거나 필요로하지 않으려면 아마도 루트가 아닌 경로를 단일 루트 팩터 리로 사용할 수 있습니다.
class RootFactory(object):
def __init__(self, request):
self._request = request
self.__acl__ = [(Allow, Everyone, "view")] # todo: add more acls
@view_config(permission="view", route_name="orders")
def view_product(context, request):
order_id, product_id = request.matchdict["order_id"], request.matchdict["product_id"]
pass # do what you need to with the input, the security check already happened
config = Configurator(root_factory=RootFactory)
config.add_route(name="orders",
path="/order/{order_id}/products/{product_id}")
config.scan()
application = config.make_wsgi_app()
참고 : 나는 분명히 당신이
젠장 ... 나는 아직도이 추상 개념을 이해할 수 없다. __name__ 값은 config.add_route (name = "")의 것과 동일해야합니까? 그것은 Traversal이/photo/1과 같이 들어오는 URL을 매칭 할 때 사용할 Resource를 결정하는 방법입니까? 내 앱의 예를 설명하려고 할 수 있습니까? 내 응용 프로그램은 제품 주문을 처리합니다. 각 주문에는 1 개 또는 여러 개의 제품이있을 수 있습니다. 즉, __parent__ 특성을 Order 자원으로 설정하고 __name__ 특성을 Product 자원의 이름으로 지정해야합니까? – Mark
죄송합니다. 위 내용이 충분하지 않았습니다. ProductConatiner를 보면, 문서에서 언급 한 것과 같은 "Factory"입니까? 이것은 내 리소스가 Product라는 python-couchdb 객체가 될 수 있다는 점을 감안할 때 각 리소스에 대한 팩토리를 만들어야한다는 것을 의미합니까? – Mark
add_route의 이름은 시스템의 모든 경로에 대해 고유해야합니다. 경로의 세그먼트와 일치 할 필요는 없습니다. 나는 단지 그것을 "제품"으로 명명 할 수있다. –