Opened 11 years ago

Closed 11 years ago

Last modified 11 years ago

#21177 closed Bug (fixed)

redirect() doesn't support redirecting to relative urls

Reported by: acatton@… Owned by: nobody
Component: Core (URLs) Version: dev
Severity: Normal Keywords: redirect url relative
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Hi,

If we use redirect shortcut to redirect to a relative URL, it fails.

Like in this example:

from django.conf.urls import patterns, url
from django.shortcuts import redirect

Using redirect to red

urlpatterns = patterns('',
    url(r'^foo/bar/$', lambda request: redirect('../baz/')),
)

It raises a TypeError:

Traceback (most recent call last):
  File "lib/python2.7/site-packages/django/core/handlers/base.py", line 115, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "foo/foo/urls.py", line 9, in <lambda>
    url(r'^foo/bar/$', lambda request: redirect('../baz/')),
  File "lib/python2.7/site-packages/django/shortcuts/__init__.py", line 78, in redirect
    return redirect_class(resolve_url(to, *args, **kwargs))
  File "lib/python2.7/site-packages/django/shortcuts/__init__.py", line 151, in resolve_url
    return urlresolvers.reverse(to, args=args, kwargs=kwargs)
  File "lib/python2.7/site-packages/django/core/urlresolvers.py", line 496, in reverse
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
  File "lib/python2.7/site-packages/django/core/urlresolvers.py", line 379, in _reverse_with_prefix
    lookup_view = get_callable(lookup_view, True)
  File "lib/python2.7/site-packages/django/utils/functional.py", line 31, in wrapper
    result = func(*args)
  File "lib/python2.7/site-packages/django/core/urlresolvers.py", line 97, in get_callable
    mod = import_module(mod_name)
  File "lib/python2.7/site-packages/django/utils/importlib.py", line 28, in import_module
    raise TypeError("relative imports require the 'package' argument")

However, it looks like there's support for relative URL:

Here's my proposed patch in this case: https://github.com/django/django/pull/1670/files

Change History (4)

comment:1 by Daniele Procida, 11 years ago

Triage Stage: UnreviewedAccepted

comment:2 by acatton@…, 11 years ago

Is it possible to get this in master before Django 1.7?

comment:3 by Tim Graham, 11 years ago

Resolution: fixed
Status: newclosed

In e3d0790bd0b036ed3589659c1196e2c571e3dd8e:

Fixed #21177 -- Made resolve_url support relative URLs.

This fixes redirecting to relative URLs with django.shortcuts.redirect.

comment:4 by Tim Graham <timograham@…>, 11 years ago

In 8251438cb8c1d47779e9fc33cfa84dad9851a774:

Moved relative URL handling added in refs #21177 to a better place.

Thanks apollo13: "reverse() shouldn't know about absolute/relative paths."

Note: See TracTickets for help on using tickets.
Back to Top