Django URL详细信息

时间:2011-02-07 12:34:56

标签: django url

我必须分配一个Django项目的工作。我需要知道URL,http:// .... 因为'urls.py'我们确实有'原始'信息。我如何了解完整的URL名称;用

表示
  

HTTP +域+参数

阿米特。

2 个答案:

答案 0 :(得分:8)

看看这个片段:
http://djangosnippets.org/snippets/1197/

我这样修改了它:

from django.contrib.sites.models import RequestSite
from django.contrib.sites.models import Site

def site_info(request):
    site_info = {'protocol': request.is_secure() and 'https' or 'http'}
    if Site._meta.installed:
        site_info['domain'] = Site.objects.get_current().domain
        site_info['name'] = Site.objects.get_current().name
    else:
        site_info['domain'] = RequestSite(request).domain
        site_info['name'] = RequestSite(request).name
    site_info['root'] = site_info['protocol'] + '://' + site_info['domain']
    return {'site_info':site_info}

if / else是因为Django Site API的不同版本

此代码段实际上是一个上下文处理器,因此您必须将其粘贴到应用程序中名为context_processors.py的文件中,然后添加到您的设置中:

TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_SETTINGS.TEMPLATE_CONTEXT_PROCESSORS + (
    'name-of-your-app.context_processors.site_info',
)

+这里要注意我们要覆盖django设置的可能的默认上下文处理器,现在或将来,我们只需将这一个添加到元组中。

最后,请确保在返回回复时在视图中使用RequestContext,而不仅仅是Context。这解释了here in the docs 这只是一个使用问题:

def some_view(request):
    # ...
    return render_to_response('my_template.html',
                          my_data_dictionary,
                          context_instance=RequestContext(request))

答案 1 :(得分:1)

不同的Web服务器将以不同的方式处理HTTPS状态。

对于我的Nginx反向代理到Apache + WSGI设置,我明确设置了一个头,apache(django)可以检查连接是否安全。

此信息在URL中不可用,但在视图请求对象中可用。

django使用request.is_secure()来确定连接是否安全。它是如何做的取决于后端 http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.is_secure

例如,对于mod_python,它是以下代码:

def is_secure(self):
    try:
        return self._req.is_https()
    except AttributeError:
        # mod_python < 3.2.10 doesn't have req.is_https().
        return self._req.subprocess_env.get('HTTPS', '').lower() in ('on', '1')

如果您使用代理,您可能会发现在HttpRequest.META中可以使用HTTP标头很有用

http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META

更新:如果您要记录每个安全请求,请将上述示例与中间件一起使用

class LogHttpsMiddleware(object):
    def process_request(self, request):
            if request.is_secure():
                 protocol = 'https'
            else:
                 protocol = 'http'
            print "%s://www.mydomain.com%s" % (protocol, request.path)

LogHttpsMiddleware添加到settings.py MIDDLEWARE_CLASSES