[python] Django 템플릿 내 사이트의 도메인 이름을 얻으려면 어떻게해야합니까?

Django 템플릿 내에서 현재 사이트의 도메인 이름을 어떻게 얻습니까? 태그와 필터를 보려고했지만 아무것도 없습니다.



답변

원하는 것은 요청 컨텍스트에 액세스하는 것입니다. RequestContext를 참조하십시오.


답변

실제 HTTP 호스트 헤더를 원하면 @Phsiao의 답변에 대한 Daniel Roseman의 의견을 참조하십시오. 다른 대안은 contrib.sites 프레임 워크를 사용하는 경우 데이터베이스의 사이트에 대한 표준 도메인 이름을 설정할 수 있습니다 (요청 도메인을 올바른 SITE_ID를 사용하여 설정 파일로 매핑하는 것은 사용자가 직접 수행해야하는 것임) 웹 서버 설정). 이 경우 찾고 있습니다 :

from django.contrib.sites.models import Site

current_site = Site.objects.get_current()
current_site.domain

current_site 객체를 사용하려면 템플릿 컨텍스트에 current_site 객체를 직접 넣어야합니다. 모든 곳에서 사용하는 경우 템플릿 컨텍스트 프로세서로 패키지화 할 수 있습니다.


답변

나는 그 {{ request.get_host }}방법을 발견했다 .


답변

Carl Meyer를 보완하면 다음과 같은 컨텍스트 프로세서를 만들 수 있습니다.

module.context_processors.py

from django.conf import settings

def site(request):
    return {'SITE_URL': settings.SITE_URL}

로컬 설정 .py

SITE_URL = 'http://google.com' # this will reduce the Sites framework db call.

settings.py

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    "module.context_processors.site",
    ....
 )

URL 사이트가 컨텍스트 인스턴스를 반환하는 템플릿은 {{SITE_URL}}입니다.

컨텍스트 프로세서에서 하위 도메인 또는 SSL을 처리하려는 경우 자체 루틴을 작성할 수 있습니다.


답변

내가 사용하는 컨텍스트 프로세서의 변형은 다음과 같습니다.

from django.contrib.sites.shortcuts import get_current_site
from django.utils.functional import SimpleLazyObject


def site(request):
    return {
        'site': SimpleLazyObject(lambda: get_current_site(request)),
    }

SimpleLazyObject래퍼 템플릿이 실제로 사용하면 DB 호출에만 발생 확인합니다site 개체를. 관리 페이지에서 쿼리가 제거됩니다. 또한 결과를 캐시합니다.

설정에 포함하십시오.

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    "module.context_processors.site",
    ....
)

템플릿 {{ site.domain }}에서 현재 도메인 이름을 얻는 데 사용할 수 있습니다 .

편집 : 프로토콜 전환도 지원 하려면 다음 을 사용하십시오.

def site(request):
    site = SimpleLazyObject(lambda: get_current_site(request))
    protocol = 'https' if request.is_secure() else 'http'

    return {
        'site': site,
        'site_root': SimpleLazyObject(lambda: "{0}://{1}".format(protocol, site.domain)),
    }


답변

나는이 질문이 오래되었다는 것을 알고 있지만 현재 도메인을 얻는 파이썬적인 방법을 찾고 있습니다.

def myview(request):
    domain = request.build_absolute_uri('/')[:-1]
    # that will build the complete domain: http://foobar.com


답변

빠르고 간단하지만 생산에는 좋지 않습니다.

(보기에서)

    request.scheme               # http or https
    request.META['HTTP_HOST']    # example.com
    request.path                 # /some/content/1/

(템플릿에서)

{{ request.scheme }} :// {{ request.META.HTTP_HOST }} {{ request.path }}

render를 사용하는 경우 RequestContext 를 사용해야합니다 .

request.META['HTTP_HOST']프로덕션을 신뢰하지 마십시오 . 해당 정보는 브라우저에서 제공됩니다. 대신 @CarlMeyer의 답변을 사용하십시오.