Comment obtenir le nom de domaine de mon site actuel à partir d'un modèle Django? J'ai essayé de regarder dans la balise et les filtres mais rien là-bas.
python
django
django-templates
Jean-François Fabre
la source
la source
request.META['HTTP_HOST']
vous donne le domaine. Dans un modèle, ce serait{{ request.META.HTTP_HOST }}
.Host:
tête et obtient une réponse avec le domaine usurpé quelque part sur une page, comment cela crée-t-il une faille de sécurité? Je ne vois pas en quoi cela diffère d'un utilisateur prenant le HTML généré et se modifiant avant de le nourrir dans son propre navigateur.Si vous voulez l'en-tête HTTP Host réel, consultez le commentaire de Daniel Roseman sur la réponse de @ Phsiao. L'autre alternative est que si vous utilisez le framework contrib.sites , vous pouvez définir un nom de domaine canonique pour un site dans la base de données (mapper le domaine de requête à un fichier de paramètres avec le SITE_ID approprié est quelque chose que vous devez faire vous-même via votre configuration du serveur Web). Dans ce cas, vous recherchez:
vous devrez placer vous-même l'objet current_site dans un contexte de modèle si vous souhaitez l'utiliser. Si vous l'utilisez partout, vous pouvez l'empaqueter dans un processeur de contexte de modèle.
la source
SITE_ID
paramètre est égal à l'id
attribut du site actuel dans l'application Sites (vous pouvez le trouverid
dans le panneau d'administration de Sites). Lorsque vous appelezget_current
, Django prend votreSITE_ID
et renvoie l'Site
objet avec cet identifiant de la base de données.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
J'ai découvert la
{{ request.get_host }}
méthode.la source
HTTP_X_FORWARDED_HOST
en-tête HTTP.request.build_absolute_uri
( docs.djangoproject.com/en/dev/ref/request-response/… )En complément de Carl Meyer, vous pouvez créer un processeur de contexte comme celui-ci:
module.context_processors.py
paramètres locaux.py
settings.py
modèles renvoyant une instance de contexte dont l'URL du site est {{SITE_URL}}
vous pouvez écrire votre propre rutine si vous souhaitez gérer des sous-domaines ou SSL dans le processeur de contexte.
la source
La variante du processeur de contexte que j'utilise est:
L'
SimpleLazyObject
encapsuleur garantit que l'appel de base de données se produit uniquement lorsque le modèle utilise réellement l'site
objet. Cela supprime la requête des pages d'administration. Il met également en cache le résultat.et incluez-le dans les paramètres:
Dans le modèle, vous pouvez utiliser
{{ site.domain }}
pour obtenir le nom de domaine actuel.edit: pour prendre en charge également la commutation de protocole, utilisez:
la source
SimpleLazyObject
ici, car le lambda ne sera pas appelé si rien n'accède de toute façon au «site».SimpleLazyObject
, chacunRequestContext
appelleraget_current_site()
et exécutera donc une requête SQL. L'encapsuleur s'assure que la variable n'est évaluée que lorsqu'elle est réellement utilisée dans le modèle.SimpleLazyObject
est là pour éviter la réévaluation de la fonction, ce qui n'est pas vraiment nécessaire puisque l'Site
objet est mis en cache.from django.contrib.sites.shortcuts import get_current_site
Je sais que cette question est ancienne, mais je suis tombée dessus à la recherche d'un moyen pythonique pour obtenir le domaine actuel.
la source
build_absolute_uri
est documenté ici .Rapide et simple, mais pas bon pour la production:
(dans une vue)
(dans un modèle)
Assurez-vous d'utiliser un RequestContext , ce qui est le cas si vous utilisez render .
Ne faites pas confiance
request.META['HTTP_HOST']
à la production: ces informations proviennent du navigateur. Utilisez plutôt la réponse de @ CarlMeyerla source
request.scheme
. Peut-être uniquement disponible dans les versions plus récentes de django.request.scheme
été ajouté dans Django 1.7.{{ request.get_host }}
doit protéger contre les attaques d'en-tête HTTP Host lorsqu'il est utilisé avec leALLOWED_HOSTS
paramètre (ajouté dans Django 1.4.4).Notez que
{{ request.META.HTTP_HOST }}
n'a pas la même protection. Voir la documentation :En ce qui concerne l'utilisation de
request
dans votre modèle, les appels de la fonction de rendu de modèle ont changé dans Django 1.8 , vous n'avez donc plus à gérerRequestContext
directement.Voici comment rendre un modèle pour une vue, à l'aide de la fonction de raccourci
render()
:Voici comment rendre un modèle pour un e-mail, lequel IMO est le cas le plus courant où vous souhaitez la valeur d'hôte:
Voici un exemple d'ajout d'une URL complète dans un modèle d'e-mail; request.scheme devrait obtenir
http
ouhttps
selon ce que vous utilisez:la source
J'utilise une balise de modèle personnalisée. Ajouter à par exemple
<your_app>/templatetags/site.py
:Utilisez-le dans un modèle comme celui-ci:
la source
get_current
est une méthode documentée: docs.djangoproject.com/en/dev/ref/contrib/sites/…'http://%s'
pourrait être un problème en cas dehttps
connexion; schéma n'est pas dynamique dans ce cas.Semblable à la réponse de l'utilisateur panchicore, c'est ce que j'ai fait sur un site Web très simple. Il fournit quelques variables et les rend disponibles sur le modèle.
SITE_URL
tiendrait une valeur commeexample.com
SITE_PROTOCOL
tiendrait une valeur commehttp
ouhttps
SITE_PROTOCOL_URL
contiendrait une valeur commehttp://example.com
ouhttps://example.com
SITE_PROTOCOL_RELATIVE_URL
tiendrait une valeur comme//example.com
.module / context_processors.py
settings.py
Ensuite, sur vos modèles, les utiliser comme
{{ SITE_URL }}
,{{ SITE_PROTOCOL }}
,{{ SITE_PROTOCOL_URL }}
et{{ SITE_PROTOCOL_RELATIVE_URL }}
la source
Dans un modèle Django, vous pouvez faire:
la source
django.template.context_processors.request
aussi [ce guide a aidé] ( simpleisbetterthancomplex.com/tips/2016/07/20/… )Si vous utilisez le processeur de contexte "request" , et que vous utilisez le framework de sites Django et que le middleware du site est installé (c'est-à-dire que vos paramètres les incluent):
... alors vous aurez l'
request
objet disponible dans des modèles, et il contiendra une référence au courantSite
pour la demande sous forme derequest.site
. Vous pouvez ensuite récupérer le domaine dans un modèle avec:la source
Et cette approche? Travaille pour moi. Il est également utilisé dans django-registration .
la source
localhost
vous donnera unhttps
schéma (il est considéré comme sécurisé) qui ne fonctionnera pas si vous avez une URL statique (seulehttp://127.0.0.1
est valide, nonhttps://127.0.0.1
). Ce n'est donc pas idéal quand il est encore en développement.la source
Vous pouvez utiliser
{{ protocol }}://{{ domain }}
dans vos modèles pour obtenir votre nom de domaine.la source