Я хочу иметь возможность создать обратную ссылку на ссылающийся URL, если реферер был представлением, а если он не был представлением, обратную ссылку на страницу по умолчанию (не спрашивайте ... это странно требование).

По сути, если пользователь перешел на рассматриваемую страницу из другого представления на том же сайте django, обратная ссылка должна возвращать к этому представлению.

Если пользователь вошел с внешнего сайта, обратная ссылка должна перейти в представление по умолчанию.

Javascript - не идеальное решение, хотя я готов рассмотреть его, если нет другого выхода.

2
Chris R 24 Авг 2010 в 02:50

2 ответа

Лучший ответ

Используйте django.core.urlresolvers.resolve, чтобы выяснить, внутренний URL-адрес Django или нет. Если это не так, он поднимет django.core.urlresolvers.Resolver404, в противном случае он вернет соответствующий объект, который вы можете проанализировать при необходимости. При необходимости вы можете скормить ему переменную среды REFERER и заменить URL-адрес URL-адресом по умолчанию, если resolve вызывает Resolver404.

edit : На самом деле нет, resolve очевидно работает только с компонентами пути URL-адресов. Таким образом, вам придется деконструировать заголовок REFERER, используя urlparse, чтобы понять out, если это правильный домен, и если это так, используйте resolve в компоненте пути проанализированного URL-адреса, чтобы выяснить, является ли URL-адрес частью вашего сайта Django или нет.

# code not tested, YMMV, etc. 

from urlparse import urlparse

from django.core import urlresolvers

HOME = 'http://my.site.com/'

def generate_back_url(url, default_url=HOME):
    parsed = urlparse(url)
    if parsed.netloc == 'my.site.com':
        try:
            urlresolvers.resolve(parsed.path)
        except urlresolvers.Resolver404:
            back_url = default_url
        else:
            back_url = url
    else:
        back_url = default_url
    return back_url

# ...

def my_view(request):
    # ...
    # truth be told I'm not sure whether the .get() is necessary, sorry.
    back_url = generate_back_url(request.META.get('REFERER', HOME))
    # ...
4
Devin Jeanpierre 23 Авг 2010 в 23:19

Вместо этого используйте django.utils.http.is_safe_url().

from django.utils.http import is_safe_url

def my_view(request):
    # ...
    if is_safe_url(url=url, host=request.get_host()):
        back_url = url
    else:
        back_url = default_url
2
Rockallite 7 Май 2013 в 14:53