跳转到主要内容

允许多个视图匹配相同的URL。

项目描述

https://travis-ci.org/raiderrobert/django-multiurl.svg?branch=master https://coveralls.io/repos/github/raiderrobert/django-multiurl/badge.svg?branch=master

您是否希望多个视图匹配到相同的URL?现在可以了。

您可能曾经尝试过类似这样的事情

urlpatterns = [
    url('/app/(\w+)/$', app.views.people),
    url('/app/(\w+)/$', app.views.place),
]

然而,如果您这样做,/app/san-francisco/ 将只会映射到 app.views.people。从 app.views.people 中引发 Http404 并无济于事:您只能在浏览器中看到404,因为Django在第一次匹配后就会停止解析URL。

好的,django-multiurl 解决了这个问题。只需 pip install django-multiurl,然后这样做

from multiurl import multiurl

urlpatterns = [
    multiurl(
        url('/app/(\w+)/$', app.views.people),
        url('/app/(\w+)/$', app.views.place),
    )
]

现在在您的视图中,在任何您想要跳出视图并继续解析的地方引发 multiurl.ContinueResolving。例如,这里是一个可能的 app.views.people 的样子

from multiurl import ContinueResolving

def people(request, name):
    try:
        person = Person.objects.get(name=name)
    except Person.DoesNotExist:
        raise ContinueResolving
    return render(...)

就这样!ContinueResolving 将导致 multiurl 继续到下一个视图(在这个例子中是 app.views.place)。

一些注意事项来总结一下

  • 如果您不想使用 ContinueResolving - 可能您更愿意继续使用 get_object_or_404,或者您正在使用无法修改以抛出 ContinueResolving 的第三方视图,您可以将 catch 参数传递给 multiurl 来控制哪些异常被视为“继续”语句。例如,要允许 Http404 异常继续解析,请这样做

    urlpatterns = [
        multiurl(
            url('/app/(\w+)/$', app.views.people),
            url('/app/(\w+)/$', app.views.place),
            catch = (Http404, ContinueResolving)
        )
    ]

    如您所见,catch 应该是一个异常元组。始终在元组中包含 ContinueResolving 可能是一个好主意。

  • 如果在 multiurl 中的最后一个视图抛出 ContinueResolving(或另一个“继续”异常),则将引发 404。也就是说,如果解析“超出”了一些多 URL 的范围,您将得到预期的 404。

  • 反向 URL 解析按预期工作。命名您的子 URL,然后尽情反向。

贡献

开发在 GitHub 上进行;欢迎提交拉取请求。使用 tox 运行测试。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

django-multiurl-1.5.0.tar.gz (4.6 kB 查看哈希值)

上传时间

构建分布

django_multiurl-1.5.0-py2.py3-none-any.whl (4.7 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面