如何从Django模板中获取当前站点的域名?我试着在标签和过滤器中寻找,但没有什么。
当前回答
我认为你想要的是访问请求上下文,参见RequestContext。
其他回答
{{请求。get_host}}在和ALLOWED_HOSTS设置(在Django 1.4.4中添加)一起使用时,可以防止HTTP主机头攻击。
注意{{request.META。HTTP_HOST}}没有相同的保护。查看文档:
ALLOWED_HOSTS A list of strings representing the host/domain names that this Django site can serve. This is a security measure to prevent HTTP Host header attacks, which are possible even under many seemingly-safe web server configurations. ... If the Host header (or X-Forwarded-Host if USE_X_FORWARDED_HOST is enabled) does not match any value in this list, the django.http.HttpRequest.get_host() method will raise SuspiciousOperation. ... This validation only applies via get_host(); if your code accesses the Host header directly from request.META you are bypassing this security protection.
至于在模板中使用请求,在Django 1.8中,模板渲染函数调用已经改变了,所以你不再需要直接处理RequestContext。
下面是如何渲染视图的模板,使用快捷函数render():
from django.shortcuts import render
def my_view(request):
...
return render(request, 'my_template.html', context)
下面是如何呈现一个电子邮件模板,IMO是更常见的情况下,你想要的主机值:
from django.template.loader import render_to_string
def my_view(request):
...
email_body = render_to_string(
'my_template.txt', context, request=request)
下面是一个在电子邮件模板中添加完整URL的示例;请求。Scheme应该获得HTTP或HTTPS,这取决于您使用的是什么:
Thanks for registering! Here's your activation link:
{{ request.scheme }}://{{ request.get_host }}{% url 'registration_activate' activation_key %}
from django.contrib.sites.models import Site
if Site._meta.installed:
site = Site.objects.get_current()
else:
site = RequestSite(request)
我认为你想要的是访问请求上下文,参见RequestContext。
如果您想要实际的HTTP Host报头,请参阅Daniel Roseman对@Phsiao的回答的评论。另一种选择是使用contrib。sites框架,你可以在数据库中为站点设置一个规范的域名(将请求域映射到一个具有正确SITE_ID的设置文件是你必须通过你的webserver设置自己做的事情)。在这种情况下,你要寻找:
from django.contrib.sites.models import Site
current_site = Site.objects.get_current()
current_site.domain
如果您想使用current_site对象,则必须自己将其放入模板上下文中。如果你到处都在使用它,你可以把它打包到一个模板上下文处理器中。
补充Carl Meyer,你可以做一个这样的上下文处理器:
module.context_processors.py
from django.conf import settings
def site(request):
return {'SITE_URL': settings.SITE_URL}
当地settings.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,可以编写自己的例程。
推荐文章
- 操作系统。makdirs在我的路径上不理解“~”
- 如何在Django模板中获得我的网站的域名?
- 在django Forms中定义css类
- 如何在Python中scp ?
- Numpy Max vs amax vs maximum
- 我应该在.gitignore文件中添加Django迁移文件吗?
- 每n行有熊猫
- 实例属性attribute_name定义在__init__之外
- 如何获取在Python中捕获的异常的名称?
- 第一次出现的值大于现有值的Numpy
- 如何从Python函数中返回两个值?
- 前一个月的Python日期
- Python中方括号括起来的列表和圆括号括起来的列表有什么区别?
- Python日志记录不输出任何东西
- 每n秒运行特定代码