如何在django中创建将转到引用视图的URL链接?

时间:2010-08-23 22:50:33

标签: python django

我希望能够创建引用URL的反向链接,如果引用者是视图,如果它不是视图,则返回默认页面的反向链接(不要问......它的类型一个奇怪的要求)。

基本上,如果用户从同一个django网站上的另一个视图到达相关页面,则后面的链接应该是返回到该视图。

如果用户从外部站点进入,则后面的链接应该转到默认视图。

Javascript不是一个理想的解决方案,但如果没有别的办法,我愿意考虑它。

2 个答案:

答案 0 :(得分:4)

使用django.core.urlresolvers.resolve确定它是否是内部Django URL。如果不是,它将引发django.core.urlresolvers.Resolver404,否则它将返回一个匹配对象,您可以在必要时进行内省。您可以根据需要将REFERER环境变量提供给此,如果resolve引发Resolver404,则将网址替换为默认网址。

编辑:实际上,不,resolve显然只适用于网址的路径组件。因此,您必须使用urlparse解构REFERER标头,以确定它是否是正确的域,如果是,请在解析后的URL的路径组件上使用resolve来计算如果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))
    # ...

答案 1 :(得分:2)

改为使用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