URL发布¶
(cubicweb.web.views.urlpublishing
)
你可以自己写 URLPathEvaluator 类来处理自定义路径。例如,如果你想 /my-card-id 要重定向到相应卡的主视图,您需要编写:
class CardWikiidEvaluator(URLPathEvaluator):
priority = 3 # make it be evaluated *before* RestPathEvaluator
def evaluate_path(self, req, segments):
if len(segments) != 1:
raise PathDontMatch()
rset = req.execute('Any C WHERE C wikiid %(w)s',
{'w': segments[0]})
if len(rset) == 0:
# Raise NotFound if no card is found
raise PathDontMatch()
return None, rset
另一方面,您还可以停用最终应用程序中的一些标准评估器。唯一要做的就是注销它们,例如在 registration_callback 在多维数据集中:
def registration_callback(vreg):
vreg.unregister(RestPathEvaluator)
你甚至可以替换 cubicweb.web.views.urlpublishing.URLPublisherComponent
如果要自定义整个工具链进程,或者要插入足够早的扩展点以控制请求参数,请初始化:
class SanitizerPublisherComponent(URLPublisherComponent):
"""override default publisher component to explicitly ignore
unauthorized request parameters in anonymous mode.
"""
unauthorized_form_params = ('rql', 'vid', '__login', '__password')
def process(self, req, path):
if req.session.anonymous_session:
self._remove_unauthorized_params(req)
return super(SanitizerPublisherComponent, self).process(req, path)
def _remove_unauthorized_params(self, req):
for param in req.form.keys():
if param in self.unauthorized_form_params:
req.form.pop(param)
def registration_callback(vreg):
vreg.register_and_replace(SanitizerPublisherComponent, URLPublisherComponent)
URL重写¶
(cubicweb.web.views.urlrewrite
)
SimpleReqRewriter
足以应付一定数量的简单案件。如果还不够, SchemaBasedRewriter
允许做更复杂的事情。
下面是一个例子 SimpleReqRewriter
使用纯字符串:
from cubicweb.web.views.urlrewrite import SimpleReqRewriter
class TrackerSimpleReqRewriter(SimpleReqRewriter):
rules = [
('/versions', dict(vid='versionsinfo')),
]
当URL为 <base_url>/versions ,视图 __regid__ 显示versionSinfo
下面是一个例子 SimpleReqRewriter
与正则表达式一起使用:
from cubicweb.web.views.urlrewrite import (
SimpleReqRewriter, rgx)
class BlogReqRewriter(SimpleReqRewriter):
rules = [
(rgx('/blogentry/([a-z_]+)\.rss'),
dict(rql=('Any X ORDERBY CD DESC LIMIT 20 WHERE X is BlogEntry,'
'X creation_date CD, X created_by U, '
'U login "%(user)s"'
% {'user': r'\1'}), vid='rss'))
]
当URL与正则表达式匹配时,视图 __regid__ 将显示与结果集匹配的rss
下面是一个例子 SchemaBasedRewriter
用途:
from cubicweb.web.views.urlrewrite import (
SchemaBasedRewriter, rgx, build_rset)
class TrackerURLRewriter(SchemaBasedRewriter):
rules = [
(rgx('/project/([^/]+)/([^/]+)/tests'),
build_rset(rql='Version X WHERE X version_of P, P name %(project)s, X num %(num)s',
rgxgroups=[('project', 1), ('num', 2)], vid='versiontests')),
]