Como obtenho o nome de domínio do meu site atual de um modelo do Django? Eu tentei procurar na tag e nos filtros, mas nada lá.
python
django
django-templates
Jean-François Fabre
fonte
fonte
request.META['HTTP_HOST']
fornece o domínio. Em um modelo seria{{ request.META.HTTP_HOST }}
.Host:
cabeçalho e recebe uma resposta de volta com o domínio falsificado em algum lugar da página, como isso cria uma brecha na segurança? Não vejo como isso difere de um usuário pegar o HTML gerado e se modificar antes de alimentá-lo em seu próprio navegador.Se você deseja o cabeçalho HTTP Host real, consulte o comentário de Daniel Roseman na resposta de @ Phsiao. A outra alternativa é que, se você estiver usando a estrutura contrib.sites , poderá definir um nome de domínio canônico para um Site no banco de dados (mapear o domínio de solicitação para um arquivo de configurações com o SITE_ID adequado é algo que você deve fazer através do seu configuração do servidor da web). Nesse caso, você está procurando:
você teria que colocar o objeto current_site em um contexto de modelo, se quiser usá-lo. Se você estiver usando tudo isso em qualquer lugar, poderá empacotar isso em um processador de contexto de modelo.
fonte
SITE_ID
configuração é igual aoid
atributo do site atual no aplicativo Sites (você pode encontrarid
no painel de administração de Sites). Quando você chamaget_current
, o Django pega o seuSITE_ID
e retorna oSite
objeto com esse ID do banco de dados.print("get_current_site: ", get_current_site(request)) print("absolute uri: ", request.build_absolute_uri()) print("HTTP_HOST: ", request.META['HTTP_HOST']) get_current_site: localhost:8001 absolute uri: http://localhost:8001/... HTTP_HOST: localhost:8001
Eu descobri o
{{ request.get_host }}
método.fonte
HTTP_X_FORWARDED_HOST
cabeçalho HTTP.request.build_absolute_uri
( docs.djangoproject.com/en/dev/ref/request-response/... )Complementando Carl Meyer, você pode criar um processador de contexto como este:
module.context_processors.py
local settings.py
settings.py
modelos retornando instância de contexto em que o site da URL é {{SITE_URL}}
você pode escrever sua própria rotina se desejar manipular subdomínios ou SSL no processador de contexto.
fonte
A variação do processador de contexto que eu uso é:
O
SimpleLazyObject
wrapper garante que a chamada ao banco de dados ocorra apenas quando o modelo realmente usa osite
objeto. Isso remove a consulta das páginas de administração. Ele também armazena em cache o resultado.e inclua-o nas configurações:
No modelo, você pode usar
{{ site.domain }}
para obter o nome de domínio atual.edit: para suportar também a troca de protocolo, use:
fonte
SimpleLazyObject
aqui, porque o lambda não será chamado se nada acessar o 'site' de qualquer maneira.SimpleLazyObject
, cadaRequestContext
um chamaráget_current_site()
e, portanto, executará uma consulta SQL. O wrapper garante que a variável seja avaliada apenas quando for realmente usada no modelo.SimpleLazyObject
que há para evitar a reavaliação da função, que não é realmente necessário uma vez que oSite
objeto é armazenado em cache.from django.contrib.sites.shortcuts import get_current_site
Sei que essa pergunta é antiga, mas me deparei com ela procurando uma maneira pitônica de obter o domínio atual.
fonte
build_absolute_uri
está documentado aqui .Rápido e simples, mas não bom para produção:
(em uma exibição)
(em um modelo)
Certifique-se de usar um RequestContext , que é o caso se você estiver usando renderização .
Não confie
request.META['HTTP_HOST']
na produção: essas informações vêm do navegador. Em vez disso, use a resposta do @ CarlMeyerfonte
request.scheme
. Talvez apenas disponível em versões mais recentes do django.request.scheme
foi adicionado no Django 1.7.{{ request.get_host }}
deve proteger contra ataques de cabeçalho do host HTTP quando usado junto com aALLOWED_HOSTS
configuração (adicionada no Django 1.4.4).Observe que
{{ request.META.HTTP_HOST }}
não possui a mesma proteção. Veja os documentos :Quanto ao uso do
request
em seu modelo, as chamadas de função de renderização de modelo foram alteradas no Django 1.8 , assim você não precisa mais lidarRequestContext
diretamente.Veja como renderizar um modelo para uma visualização, usando a função de atalho
render()
:Veja como renderizar um modelo para um email, qual IMO é o caso mais comum em que você deseja o valor do host:
Aqui está um exemplo de adição de um URL completo em um modelo de email; request.scheme deve obter
http
ouhttps
dependendo do que você está usando:fonte
Eu uso uma tag de modelo personalizado. Adicione, por exemplo
<your_app>/templatetags/site.py
:Use-o em um modelo como este:
fonte
get_current
é um método documentado: docs.djangoproject.com/en/dev/ref/contrib/sites/…'http://%s'
pode ser um problema em caso dehttps
conexão; esquema não é dinâmico neste caso.Semelhante à resposta do usuário panchicore, foi o que fiz em um site muito simples. Ele fornece algumas variáveis e as disponibiliza no modelo.
SITE_URL
manteria um valor comoexample.com
SITE_PROTOCOL
manteria um valor comohttp
ouhttps
SITE_PROTOCOL_URL
manteria um valor comohttp://example.com
ouhttps://example.com
SITE_PROTOCOL_RELATIVE_URL
manteria um valor como//example.com
.module / context_processors.py
settings.py
Então, em seus modelos, usá-los como
{{ SITE_URL }}
,{{ SITE_PROTOCOL }}
,{{ SITE_PROTOCOL_URL }}
e{{ SITE_PROTOCOL_RELATIVE_URL }}
fonte
Em um modelo do Django, você pode fazer:
fonte
django.template.context_processors.request
, também [este how-to ajudou] ( simpleisbetterthancomplex.com/tips/2016/07/20/... )Se você usa o processador de contexto "request" e está usando a estrutura de sites do Django e possui o middleware Site instalado (ou seja, suas configurações incluem estas):
... então você terá o
request
objeto disponível nos modelos e ele conterá uma referência à correnteSite
para a solicitação comorequest.site
. Você pode recuperar o domínio em um modelo com:fonte
E essa abordagem? Funciona para mim. Também é usado no django-registration .
fonte
localhost
isso fornecerá umhttps
esquema (é considerado seguro) que não funcionará se você tiver um URL estático (apenashttp://127.0.0.1
válido, nãohttps://127.0.0.1
). Portanto, não é o ideal quando ainda está em desenvolvimento.fonte
Você pode usar
{{ protocol }}://{{ domain }}
em seus modelos para obter seu nome de domínio.fonte