Have you ever wanted multiple views to match to the same URL? Now you can.
You may once have tried something like this:
urlpatterns = [
url('/app/(\w+)/$', app.views.people),
url('/app/(\w+)/$', app.views.place),
]
However, if you try this, /app/san-francisco/ will only map to app.views.people. Raising an Http404 from app.views.people doesn’t help: you only get a 404 in the browser because Django stops resolving URLs at the first match.
Well, django-multiurl solves this problem. Just pip install django-multiurl, then do this:
from multiurl import multiurl
urlpatterns = [
multiurl(
url('/app/(\w+)/$', app.views.people),
url('/app/(\w+)/$', app.views.place),
)
]
Now in your views, raise multiurl.ContinueResolving anywhere you’d like to break out of the view and keep resolving. For example, here’s what app.views.people might look like:
from multiurl import ContinueResolving
def people(request, name):
try:
person = Person.objects.get(name=name)
except Person.DoesNotExist:
raise ContinueResolving
return render(...)
That’s it! ContinueResolving will cause multiurl to continue onto the next view (app.views.place, in this example).
A few notes to round things out:
If you don’t want to use ContinueResolving – perhaps you’d rather continue using get_object_or_404, or you’re using third-party views that you can’t modify to raise ContinueResolving, you can pass a catch argument into multiurl to control which exceptions are considered “continue” statements. For example, to allow Http404 exceptions to continue resolving, do this:
urlpatterns = [ multiurl( url('/app/(\w+)/$', app.views.people), url('/app/(\w+)/$', app.views.place), catch = (Http404, ContinueResolving) ) ]As you can see, catch should be a tuple of exceptions. It’s probably a good idea to always include ContinueResolving in the tuple.
If the last view in a multiurl raises ContinueResolving (or another “continuing” exception), a 404 will be raised instead. That is, if resolving “falls off the end” of some multi-urls, you’ll get the 404 you expect.
Reverse URL resolution just works as expected. Name your sub-URLs and then reverse your heart out.
Contributing
Development takes place on GitHub; pull requests are welcome. Run tests with tox.
Metadata
Release files for django-multiurl 1.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| django-multiurl-1.5.0.tar.gz | 4.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_multiurl-1.5.0-py2.py3-none-any.whl | Python 2, Python 3 | none | any | Details |
Total release size: 9.2 kB
Release files / django-multiurl-1.5.0.tar.gz
| Download URL | django-multiurl-1.5.0.tar.gz |
|---|---|
| Size | 4.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fddb8e43b8aef2172a46b6dc5522ea9f52ab2861049d00f4464448aead63f6b9
|
|
BLAKE2b-256 checksum How to use checksums |
09acca31cdca007879613099c8c289265b94d044ba4f282257ac241e2e4cac9d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.5
|
Release files / django_multiurl-1.5.0-py2.py3-none-any.whl
| Download URL | django_multiurl-1.5.0-py2.py3-none-any.whl |
|---|---|
| Size | 4.7 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
66e804e311531c580654ec1b343074abaf6d08fb7520ed5be7b6b9a887a79259
|
|
BLAKE2b-256 checksum How to use checksums |
9737de7ab76a7ede088b4d5c934c107a4e7818db45852045a37e3fd91f43f820
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.5
|
Security for django-multiurl 1.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.