Как я могу создать URL-ссылку в django, которая будет переходить в ссылочный вид? - PullRequest
2 голосов
/ 24 августа 2010

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 24 августа 2010

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

edit : На самом деле, нет, resolveпо-видимому, работает только с компонентами пути URL-адресов.Поэтому вам придется деконструировать заголовок REFERER, используя urlparse , чтобы выяснить, является ли это правильным доменом, и если это так, используйте 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))
    # ...
2 голосов
/ 07 мая 2013

Используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...