tutorial org introduccion djangogirls blog django url cron

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:

  1. Agregue ''django.contrib.sites'' a su configuración de INSTALLED_APPS .

  2. Defina una configuración SITE_ID:

    SITE_ID = 1

  3. Ejecutar migrar.