Comment puis-je obtenir l'URL complète / absolue (par exemple https://example.com/some/path
) dans Django sans le module Sites ? C'est juste idiot ... Je ne devrais pas avoir besoin d'interroger ma base de données pour accrocher l'URL!
Je veux l'utiliser avec reverse()
.
Réponses:
Utilisez la méthode request.build_absolute_uri () pratique sur demande, passez-lui l'URL relative et elle vous en donnera une complète.
Par défaut, l'URL absolue de
request.get_full_path()
est renvoyée, mais vous pouvez lui passer une URL relative comme premier argument pour la convertir en URL absolue.la source
{{ request.build_absolute_uri }}{{ object.get_absolute_url }}
- et heyho, URL complète.{% if request.is_secure %}https://{% else %}http://{% endif %}{{ request.get_host }}{{ object.get_absolute_url }}
car il y{{ request.build_absolute_uri }}
avait une barre oblique de fin et j'ai{{ object.get_absolute_url }}
commencé avec une barre oblique entraînant des doubles barres obliques dans l'URL.Si vous souhaitez l'utiliser avec
reverse()
vous pouvez le faire:request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))
la source
url_name
au lieu deview_name
)def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
Vous pouvez également l'utiliser
get_current_site
dans le cadre de l'application sites (from django.contrib.sites.models import get_current_site
). Il prend un objet de demande et prend par défaut l'objet de site avec lequel vous avez configuréSITE_ID
dans settings.py si la demande l'estNone
. En savoir plus dans la documentation pour utiliser le framework de sitespar exemple
Il n'est pas aussi compact / soigné que
request.build_absolute_url()
, mais il est utilisable lorsque les objets de demande ne sont pas disponibles et que vous avez une URL de site par défaut.la source
django.contrib.sites
dans votreINSTALLED_APPS
, il ne touche pas le DB du tout, et de fournir des informations basées sur l'objet de la demande (voir get_current_site )build_absolute_uri
semble toujours la solution la plus simple et la plus propre.Si vous ne pouvez pas y accéder,
request
vous ne pouvez pas l'utiliserget_current_site(request)
comme recommandé dans certaines solutions ici. Vous pouvez utiliser une combinaison du framework Sites natif et à laget_absolute_url
place. Configurez au moins un site dans l'administrateur, assurez-vous que votre modèle dispose d'une méthode get_absolute_url () , puis:https://docs.djangoproject.com/en/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls
la source
request
àNone
ou appelget_current_site(None)
.Si vous ne voulez pas accéder à la base de données, vous pouvez le faire avec un paramètre. Ensuite, utilisez un processeur de contexte pour l'ajouter à chaque modèle:
la source
À votre avis, procédez comme suit:
la source
django-fullurl
Si vous essayez de le faire dans un modèle Django, j'ai publié un petit paquet PyPI
django-fullurl
pour vous permettre de remplacerurl
et destatic
balises de modèle avecfullurl
etfullstatic
, comme ceci:Nous espérons que ces badges resteront à jour automatiquement:
Dans une vue, vous pouvez bien sûr utiliser à la
request.build_absolute_uri
place.la source
request
objet pour obtenir le nom de domaine. Dans ce cas, vous devez utiliser lesites
framework à la place, qui obtient le nom de domaine de la base de données. Voirdjango-absoluteuri
, mentionné dans la section "voir aussi" du fichier README de ce package PyPI.Pour créer un lien complet vers une autre page à partir d'un modèle, vous pouvez utiliser ceci:
request.META.HTTP_HOST donne le nom d'hôte et url le nom relatif. Le moteur de modèle les concatène ensuite en une URL complète.
la source
http
dans ce contexte) et une://
partie de l'URL, donc il ne fournira pas une URL complète .Encore une autre façon. Vous pouvez l'utiliser
build_absolute_uri()
dans votreview.py
et le transmettre au modèle.view.py
votre-template.html
la source
HttpRequest.build_absolute_uri(request)
est équivalent àrequest.build_absolute_uri()
non?Examinez le
Request.META
dictionnaire qui entre. Je pense qu'il a un nom de serveur et un port de serveur.la source
Essayez le code suivant:
la source
Cela a fonctionné pour moi dans mon modèle:
J'avais besoin de l'url complète pour la transmettre à une fonction js fetch. J'espère que cela vous aidera.
la source
Je sais que c'est une vieille question. Mais je pense que les gens se heurtent encore beaucoup à cela.
Il existe quelques bibliothèques qui complètent la fonctionnalité Django par défaut. J'en ai essayé quelques-uns. J'aime la bibliothèque suivante lors du référencement inverse des URL absolues:
https://github.com/fusionbox/django-absoluteuri
Un autre que j'aime parce que vous pouvez facilement mettre en place un domaine, un protocole et un chemin est:
https://github.com/RRMoelker/django-full-url
Cette bibliothèque vous permet d'écrire simplement ce que vous voulez dans votre modèle, par exemple:
la source
Si vous utilisez le framework django REST, vous pouvez utiliser la fonction inverse de
rest_framework.reverse
. Cela a le même comportement quedjango.core.urlresolvers.reverse
, sauf qu'il utilise un paramètre de demande pour créer une URL complète.Modifié pour mentionner la disponibilité uniquement dans le cadre REST
la source
request=request
. Il ne semble pas non plus que la demande soit documentée ici docs.djangoproject.com/en/1.9/ref/urlresolvers/#reverseJ? ai compris:
Obtenez l'URI complet avec le schéma, l'hôte, le chemin du port et la requête.
la source
Il existe également ABSOLUTE_URL_OVERRIDES comme paramètre
https://docs.djangoproject.com/en/2.1/ref/settings/#absolute-url-overrides
Mais cela remplace get_absolute_url (), ce qui n'est peut-être pas souhaitable.
Au lieu d'installer le framework de sites juste pour cela ou de faire certaines des autres choses mentionnées ici qui reposent sur un objet de demande, je pense que la meilleure solution est de le placer dans models.py
Définissez BASE_URL dans settings.py, puis importez-le dans models.py et créez une classe abstraite (ou ajoutez-la à celle que vous utilisez déjà) qui définit get_truly_absolute_url (). Cela pourrait être aussi simple que:
Sous-classe et maintenant vous pouvez l'utiliser partout.
la source
Comme mentionné dans d'autres réponses,
request.build_absolute_uri()
est parfait si vous y avez accèsrequest
et lesites
cadre est excellent tant que différentes URL pointent vers différentes bases de données.Cependant, mon cas d'utilisation était légèrement différent. Mon serveur de transfert et le serveur de production accèdent à la même base de données, mais
get_current_site
tous deux ont renvoyé le premiersite
dans la base de données. Pour résoudre ce problème, vous devez utiliser une sorte de variable d'environnement. Vous pouvez soit utiliser 1) une variable d'environnement (quelque chose commeos.environ.get('SITE_URL', 'localhost:8000')
) ou 2) différentsSITE_ID
s pour différents serveurs ET différents settings.py .J'espère que quelqu'un trouvera cela utile!
la source
Je suis tombé sur ce fil parce que je cherchais à créer un URI absolu pour une page de réussite.
request.build_absolute_uri()
m'a donné un URI pour ma vue actuelle, mais pour obtenir l'URI de ma vue de réussite, j'ai utilisé ce qui suit ....request.build_absolute_uri (reverse ('success_view_name'))
la source
request.get_host()
vous donnera le domaine.la source
Vous pouvez aussi utiliser:
Cela fonctionne bien pour moi,
Je ne sais pas trop comment cela fonctionne. Je crois que c'est un peu plus bas et retournera le nom d'hôte de votre serveur, qui pourrait être différent du nom d'hôte utilisé par votre utilisateur pour accéder à votre page.
la source
Vous pouvez essayer "request.get_full_path ()"
la source