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의 답변을 사용하십시오.