允许多个视图匹配相同的URL。
项目描述
您是否希望多个视图匹配到相同的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,然后尽情反向。
贡献
项目详情
django-multiurl-1.5.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fddb8e43b8aef2172a46b6dc5522ea9f52ab2861049d00f4464448aead63f6b9 |
|
MD5 | 5efc70eebae59913da4fd51a258ada45 |
|
BLAKE2b-256 | 09acca31cdca007879613099c8c289265b94d044ba4f282257ac241e2e4cac9d |
django_multiurl-1.5.0-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 66e804e311531c580654ec1b343074abaf6d08fb7520ed5be7b6b9a887a79259 |
|
MD5 | 8fa0a2940cc46b0544546ab8143c2798 |
|
BLAKE2b-256 | 9737de7ab76a7ede088b4d5c934c107a4e7818db45852045a37e3fd91f43f820 |