Comment puis-je obtenir le plein/URL absolue (avec nom de domaine) dans Django?
Comment puis-je obtenir le plein/URL absolue (par exemple,https://example.com/some/path
) dans Django sans le module des Sites? C'est tout simplement ridicule... je ne devrais pas besoin d'interroger ma DB à s'accrocher à l'URL!
Je veux l'utiliser avec reverse()
.
- Juste une parenthèse: Le module des sites ne touche que la DB, pour la première fois, il a besoin du nom du site, le résultat est mis en cache dans un module variable (SITE_CACHE) qui va rester jusqu'à ce que la re-compilation du module ou de la SiteManager.clear_cache() la méthode est appelée. Voir: code.djangoproject.com/svn/django/tags/releases/1.3/django/...
Vous devez vous connecter pour publier un commentaire.
Utilisation pratique demande.build_absolute_uri() méthode sur demande, transmettre l'url relative, et il va vous donner plein.
Par défaut, l'URL absolue pour
request.get_full_path()
est retourné, mais vous pouvez passer une URL relative comme premier argument pour le convertir en une URL absolue.{{ request.build_absolute_uri }}{{ object.get_absolute_url }}
- et heyho, url complète.self.context
, ou, au moins, vous pouvez le mettre dans votre vue.{% if request.is_secure %}https://{% else %}http://{% endif %}{{ request.get_host }}{{ object.get_absolute_url }}
parce que{{ request.build_absolute_uri }}
avait une barre oblique{{ object.get_absolute_url }}
commencé par une barre oblique, ce qui double les barres obliques dans l'URL./
renvoie le chemin absolu avec le chemin relatif remplacé avec juste le string. Exemplerequest.get_full_path()
retourne/foo/bar/
request.build_full_uri('baz')
retournehttp://domain.com/foo/bar/baz
request.build_full_uri('/baz')
retournehttp://domain.com/baz
ipdb> HttpRequest.build_absolute_uri(la_url) *** AttributeError: 'str' object has no attribute 'get_full_path'
{{ request.build_absolute_uri }}{{ object.get_absolute_url }}
peut travailler que sur la page d'accueil, en raison de//
être interprété comme/
.Si vous voulez l'utiliser avec
reverse()
vous pouvez faire ceci :request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))
url_name
au lieu deview_name
)def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
Vous pouvez également utiliser
get_current_site
dans le cadre des sites d'application (from django.contrib.sites.models import get_current_site
). Il prend un objet de requête, et par défaut à l'objet du site que vous avez configuré avecSITE_ID
dans settings.py si la demande estNone
. Lire la suite dans la documentation pour en utilisant les sites de cadrepar exemple
Il n'est pas aussi compact/soigné que
request.build_absolute_url()
, mais n'est utilisable que lorsque l'on demande les objets ne sont pas disponibles, et vous avez un site par défaut l'url.django.contrib.sites
dans votreINSTALLED_APPS
, il ne sera pas touché la DB à tous, et de fournir de l'information fondée sur l'objet de la Requête (voir la section get_current_site)build_absolute_uri
ressemble toujours le plus facile et plus propre solution.get_current_site(request)
avec un appel àstr
, de cette façon, vous obtenez une chaîne au lieu d'un objet de Sitelocalhost
et point respectifsSITE_ID
- t-il?request.scheme + '://'
au lieu dehttp://
parce que c'est du HTTPS dans la production et HTTP localement.Si vous ne pouvez pas obtenir l'accès à
request
alors vous ne pouvez pas utiliserget_current_site(request)
comme recommandé dans quelques solutions ici. Vous pouvez utiliser une combinaison des Sites indigènes cadre etget_absolute_url
à la place. Mis en place au moins un Site dans l'admin, assurez-vous que votre modèle dispose d'un get_absolute_url() méthode, puis:https://docs.djangoproject.com/en/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls
Si vous ne voulez pas de frapper la base de données, vous pourriez le faire avec un paramètre. Ensuite, utilisez un contexte de processeur pour l'ajouter à chaque modèle:
django-fullurl
Si vous essayez de faire cela dans un Django template, j'ai publié un petit PyPI paquet
django-fullurl
pour vous permettre de remplacerurl
etstatic
balises de modèle avecfullurl
etfullstatic
, comme ceci:Ces badges devrait rester à jour automatiquement:
Dans une vue, vous pouvez bien sûr utiliser à la place.
request
objet pour obtenir le nom de domaine. Dans ce cas, vous devez utiliser lesites
cadre au lieu de cela, qui reçoit le nom de domaine à partir de la base de données. Voirdjango-absoluteuri
, mentionné dans la section "voir aussi" de le README de ce PyPI paquet.De votre point de vue, il suffit de faire ceci:
Pour créer un lien vers une autre page à partir d'un modèle, vous pouvez utiliser ceci:
demande.MÉTA.HTTP_HOST donne le nom de l'hôte, et l'url donne le nom relatif. Le moteur de template puis concatène dans une url complète.
http
dans ce contexte) et://
partie de l'URL, de sorte qu'il ne fournit pas de une url complète de la page.Encore une autre façon. Vous pouvez utiliser
build_absolute_uri()
dans votreview.py
et la passer au modèle.view.py
your-template.html
HttpRequest.build_absolute_uri(request)
est équivalent àrequest.build_absolute_uri()
n'est-ce pas?Examiner
Request.META
dictionnaire qui vient dans. Je pense qu'il a un nom de serveur et le port du serveur.Essayez le code suivant:
Je sais que c'est une vieille question. Mais je pense que les gens courent encore dans beaucoup.
Il ya un couple de bibliothèques de compléter la valeur par défaut de Django fonctionnalité. J'ai essayé un peu. J'aime la bibliothèque suivantes lors de l'inverse du référencement des urls absolues:
https://github.com/fusionbox/django-absoluteuri
Un autre que j'aime parce que vous pouvez facilement mettre ensemble un domaine, le protocole et le chemin d'accès est:
https://github.com/RRMoelker/django-full-url
Cette bibliothèque vous permet de simplement écrire ce que vous voulez dans votre modèle, par exemple:
Cela a fonctionné pour moi dans mon template:
J'avais besoin de la totalité de l'url pour passer à un js fonction d'extraction.
J'espère que cela vous aidera.
Si vous utilisez django REST framework, vous pouvez utiliser la fonction d'inversion de
rest_framework.reverse
. Ce comportement est le même quedjango.core.urlresolvers.reverse
, sauf qu'il utilise un paramètre de la requête pour construire une URL complète.Édité parler de leur disponibilité dans le RESTE de cadre
request=request
. Il ne semble pas que la demande est documentée ici docs.djangoproject.com/en/1.9/ref/urlresolvers/#reverseJe l'ai eu:
Obtenir l'uri complet avec schéma, l'hôte, le port de chemin et de requête.
Il est également ABSOLUTE_URL_OVERRIDES disponibles en tant que paramètre de
https://docs.djangoproject.com/en/2.1/ref/settings/#absolute-url-overrides
Mais qui remplace get_absolute_url(), qui peut ne pas être souhaitable.
Au lieu d'installer des sites de cadre de juste pour ce ou de faire certaines des autres choses mentionnés ici, qui s'appuie sur l'objet de demande, je pense que la meilleure solution est de les placer dans un models.py
Définir BASE_URL dans settings.py puis de l'importer dans models.py et de faire une classe abstraite (ou l'ajouter à celui que vous utilisez déjà) qui définit get_truly_absolute_url(). Il pourrait être aussi simple que:
Sous-classe, et maintenant vous pouvez l'utiliser partout.
request.get_host()
vous donnera le domaine.Vous pouvez essayer de "demande.get_full_path()"
Vous pouvez également utiliser:
Cela fonctionne bien pour moi,
Je ne suis pas entièrement sûr de savoir comment il fonctionne. Je crois que c'est un peu plus faible niveau et sera de retour à votre nom d'hôte du serveur, qui peut être différent du nom d'hôte utilisé par votre utilisateur pour accéder à votre page.