Docker-mailman: Eliminar example.com como el SITIO predeterminado en django

Creado en 21 abr. 2017  ·  9Comentarios  ·  Fuente: maxking/docker-mailman

En este momento, cuando aparece una instancia, el sitio predeterminado se establece en example.com (por alguna razón).

Cambie eso o agregue instrucciones para cambiar la identificación del sitio al dominio real que se está utilizando.

bug documentation web

Todos 9 comentarios

Lo que es peor, si elimino example.com de la lista de sitios, obtengo 'Error del servidor (500)' y la instalación se vuelve inutilizable.

Esto es lo que hay en los registros de mailman-web:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
    response = self._get_response(request)
  File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python2.7/site-packages/postorius/views/list.py", line 593, in list_index
    'domain_count': len(choosable_domains)})
  File "/usr/local/lib/python2.7/site-packages/django/shortcuts.py", line 30, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/usr/local/lib/python2.7/site-packages/django/template/loader.py", line 68, in render_to_string
    return template.render(context, request)
  File "/usr/local/lib/python2.7/site-packages/django/template/backends/django.py", line 66, in render
    return self.template.render(context)
  File "/usr/local/lib/python2.7/site-packages/django/template/base.py", line 206, in render
    with context.bind_template(self):
  File "/usr/local/lib/python2.7/contextlib.py", line 17, in __enter__
    return self.gen.next()
  File "/usr/local/lib/python2.7/site-packages/django/template/context.py", line 236, in bind_template
    updates.update(processor(self.request))
  File "/usr/local/lib/python2.7/site-packages/django_mailman3/context_processors.py", line 33, in common
    context["site_name"] = get_current_site(request).name
  File "/usr/local/lib/python2.7/site-packages/django/contrib/sites/shortcuts.py", line 15, in get_current_site
    return Site.objects.get_current(request)
  File "/usr/local/lib/python2.7/site-packages/django/contrib/sites/models.py", line 65, in get_current
    return self._get_site_by_id(site_id)
  File "/usr/local/lib/python2.7/site-packages/django/contrib/sites/models.py", line 35, in _get_site_by_id
    site = self.get(pk=site_id)
  File "/usr/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 385, in get
    self.model._meta.object_name
DoesNotExist: Site matching query does not exist.

@ulrith Sí, necesitas cambiar el SITE_ID predeterminado en la configuración de Django a cualquier sitio que estés usando.

Por defecto, el valor es 1 en el settings.py del contenedor y corresponde a example.com.

Debería cambiarlo a 2, que supongo que apuntaría a su dominio en settings_local.py . Puede agregar lo siguiente:
SITE_ID=2

@maxking Sería mejor si pudiera reemplazar example.com por mi dominio real con algún comando como lo mencioné en este comentario . O por consulta sql en el contenedor de la base de datos ... ¿Pueden ayudarme?

@ulrith Sí, la línea de comando de Django lo llevará a un REPL de Python donde puede hacer lo que desee, incluso en la base de datos de producción ;-)

maxking<strong i="7">@mailman</strong>:~$ docker exec -it mailman-web python manage.py shell
Python 2.7.13 (default, Jun 21 2017, 18:14:15) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.db import models
>>> from django.contrib.sites.models import Site
>>> Site.objects.all()
<QuerySet [<Site: lists.araj.me>]>
>>> Site.objects.create(name='Random Domain', domain='mail.araj.me')
<Site: mail.araj.me>
>>> Site.objects.all()
<QuerySet [<Site: lists.araj.me>, <Site: mail.araj.me>]>
>>> for each in Site.objects.all():
...     print(each.domain, each.id)
... 
(u'lists.araj.me', 2)
(u'mail.araj.me', 3)

Si necesita leer más sobre esto, aquí hay un enlace al marco de sitios de Django.

@maxking En realidad, no estoy familiarizado con Python. ¿Podría darme un fragmento de código (idealmente una línea) que reemplazará Site: example.com por Site: mydomain.tld para el Mailman 3 recién instalado?

Bien, resulta que Django crea el sitio examples.com predeterminado y no hay forma de detener este comportamiento.

Entonces, estas son sus opciones si desea crear un nuevo sitio web durante el inicio.

  • La forma "correcta" de hacer esto sería usando los accesorios de Django. Los accesorios le permiten cargar datos codificados en la base de datos para cualquier propósito que pueda tener. Entonces, crea manualmente un archivo que se serializa como JSON, YAML o XML y ejecuta el comando: python manage.py loaddata <nameoffixture> y django carga esos datos en la base de datos. Por ejemplo:

El archivo a continuación se guarda en fixtures/gen_site.yaml :

- model: sites.Site
  pk: 100
  fields:
    domain: gmail.com
    name: Google

Luego, ejecuta python manage.py loaddata gen_site y tiene su sitio creado automáticamente. Luego cambia su SITE_ID=100 en el settings_local.py y todo debería funcionar!

Sin embargo, hacer esto ahora mismo con los contenedores probablemente sea difícil, ya que no hay una manera fácil de ejecutar comandos personalizados en el inicio (también llamado punto de entrada en la terminología de Docker). Abrí un nuevo número 61 para rastrear ese problema.

  • La segunda opción para usted será ejecutar manualmente este comando:
python manage.py shell -c "from django.contrib.sites.models import Site; mysite,_=Site.objects.get_or_create(id=101, name='mysite.tld', domain='mysite.tld'); print(mysite.id, mysite.name)"

Tenga en cuenta que el comando anterior está destinado a django, por lo que debe agregar docker-compose exec -T mailman-web antes del comando anterior.
Este comando creará un nuevo sitio llamado mysite.tld . También imprimirá el id que luego tendrá que poner debajo de SITE_ID=101 y reiniciará su instancia de Django para que esto surta efecto. Este comando no fallará si el sitio ya existe en la base de datos.
Yo diría que esta tampoco es la mejor manera de hacerlo porque, en primer lugar, debe reiniciar el contenedor para que esto surta efecto (solo la primera vez, pero eso es igualmente malo) y, en segundo lugar, no hay forma de editar automáticamente el settings_local.py para reflejar el nuevo SITE_ID sin intervención manual, a menos que, por supuesto, escriba algo de magia sed o awk .

  • La tercera opción es simplemente editar el dominio example.com y actualizarlo al dominio que desee.
python manage.py shell -c "from django.contrib.sites.models import Site; Site.objects.filter(domain='example.com').update(name='My Site', domain='mysite.tld')"

Esto no requeriría ningún cambio en ninguna parte, pero en mis pruebas locales descubrí que el nombre para mostrar en la parte superior no cambia a menos que reinicie el servidor Django, y solo será necesario por primera vez. Según yo, esta parece la mejor opción, después de la primera, a la que estoy dispuesto a agregar soporte en las imágenes del contenedor.

@maxking ¡ La última opción funciona a las

Debería resolverse.

La variable de entorno DEFAULT_FROM_DOMAIN ahora también reemplaza el dominio predeterminado example.com.

Sin embargo, la descripción no se cambia y se puede cambiar desde el sitio de administración de Django.

Corregido en # 95

¿Fue útil esta página
0 / 5 - 0 calificaciones