org - ¿Cómo puedo obtener la URL(con protocolo y dominio) en Django(sin solicitud)?
https tutorial djangogirls org es (2)
TL; DR : No hay ninguna forma "estándar" de "Django-ish" de hacerlo, pero el principio DRY promovido por el marco asume el almacén de configuración único, por lo que una configuración personalizada parece ser una buena manera de hacerlo.
De forma predeterminada, Django puede servir cualquier número de dominios desde una sola instancia, y la solicitud HTTP (más precisamente, su encabezado HTTP_HOST
) es la única cosa que Django usa para determinar el host actual. Como sus trabajos cron están obviamente fuera del ciclo HTTP, debe almacenar su dominio en algún lugar en la configuración ...
# settings.py
DEFAULT_DOMAIN = ''https://foobar.com''
# or, depending on your configuration:
DEFAULT_DOMAIN = ''https://{}''.format(ALLOWED_HOSTS[0])
... con un pequeño procesador de contexto para facilitar el manejo de las plantillas:
# yourapp/context_processors.py
from django.conf import settings
def default_domain(request):
return {''default_domain'': settings.DEFAULT_DOMAIN}
... y luego utilízalo en tus correos electrónicos:
# yourapp/templates/email/body.html
<a href="{{ default_domain }}{% url ''target'' %}">Click here</a>
Alternativamente, puede hacer uso del marco de sites
, pero si está sirviendo un único dominio, la solución basada en configuración me parece mucho más simple y limpia.
Quiero enviar correos en un trabajo cron. El correo debe contener un enlace a mi solicitud.
En el trabajo cron, no tengo un objeto de solicitud y no puedo usar request.build_absolute_uri ().
AFAIK el marco del sitio puede ayudar aquí. ¿Pero no me da el protocolo (http vs https)?
Mi aplicación es reutilizable y, a veces, se aloja en http y, a veces, en sitios https.
Actualizar
Busco una forma de django común. Es posible crear configuraciones personalizadas, pero se prefiere una solución con los estándares de django.
Problema relacionado: https://code.djangoproject.com/ticket/16734
Hay un módulo estándar especial para esta tarea: Framework de Sitios . Agrega el modelo del sitio, que describe el sitio específico. Este modelo tiene un domain
campo para el dominio del proyecto y un name
- nombre del sitio legible para los humanos.
Usted asocia sus modelos con los sitios. Al igual que:
from django.db import models
from django.contrib.sites.models import Site
class Article(models.Model):
headline = models.CharField(max_length=200)
# ...
site = models.ForeignKey(Site, on_delete=models.CASCADE)
Cuando necesite hacer una url para el objeto, puede usar algo como el siguiente código:
>>> from django.contrib.sites.models import Site
>>> obj = MyModel.objects.get(id=3)
>>> obj.get_absolute_url()
''/mymodel/objects/3/''
>>> Site.objects.get_current().domain
''example.com''
>>> ''https://%s%s'' % (Site.objects.get_current().domain, obj.get_absolute_url())
''https://example.com/mymodel/objects/3/''
De esta manera puedes tener múltiples dominios y contenidos repartidos entre ellos. Incluso si tiene un solo dominio, le recomiendo que lo use para lograr una buena forma estándar y cómoda de mantener la configuración del dominio.
La instalación es bastante fácil:
Agregue
''django.contrib.sites''
a su configuración deINSTALLED_APPS
.Defina una configuración SITE_ID:
SITE_ID = 1
Ejecutar migrar.