Джанго URL-адрес детали - PullRequest
       4

Джанго URL-адрес детали

2 голосов
/ 07 февраля 2011

Я должен назначить для работы над одним проектом Django.Мне нужно знать о URL, скажем, http: // .... Так как с 'urls.py' у нас действительно есть 'сырая' информация.Как я узнаю о полном имени URL;означает с

http + домен + параметры

Amit.

Ответы [ 2 ]

8 голосов
/ 07 февраля 2011

Посмотрите на этот фрагмент:
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.Это объяснено здесь, в документах .
Это просто вопрос использования:

def some_view(request):
    # ...
    return render_to_response('my_template.html',
                          my_data_dictionary,
                          context_instance=RequestContext(request))
1 голос
/ 07 февраля 2011

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')

Если вы используете прокси, вам, вероятно, будет полезно, чтобы заголовки HTTP были доступны в HttpRequest.META

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...