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')),
        ]