Docker-mailman: Entfernen Sie example.com als Standard-SITE in django

Erstellt am 21. Apr. 2017  ·  9Kommentare  ·  Quelle: maxking/docker-mailman

Wenn gerade eine Instanz auftaucht, wird die Standard-Site auf example.com gesetzt (aus irgendeinem Grund).

Ändern Sie dies oder fügen Sie Anweisungen hinzu, um die Site-ID in die tatsächlich verwendete Domain zu ändern.

bug documentation web

Alle 9 Kommentare

Was noch schlimmer ist, wenn ich example.com aus der Site-Liste lösche, erhalte ich 'Serverfehler (500)' und die Installation wird unbrauchbar.

Hier ist was in den Mailman-Web-Logs:

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 Ja, Sie müssen die Standardeinstellung SITE_ID in Djangos Einstellungen auf die von Ihnen verwendete Site ändern.

Standardmäßig ist der Wert 1 in settings.py des Containers und entspricht example.com.

Sie sollten es auf 2 ändern, was vermutlich auf Ihre Domain in settings_local.py verweisen würde. Sie können Folgendes hinzufügen:
SITE_ID=2

@maxking Es wäre besser, wenn ich example.com durch meine tatsächliche Domain mit einem Befehl ersetzen könnte, wie ich ihn in diesem Kommentar erwähnt habe . Oder per SQL-Abfrage im Datenbankcontainer... Können Sie helfen?

@ulrith Yep, die Django-Befehlszeile führt Sie in eine Python-REPL, in der Sie alles tun können, was Sie möchten, sogar mit der Produktionsdatenbank ;-)

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)

Wenn Sie mehr darüber erfahren möchten , finden Sie hier einen Link zum Django.

@maxking Eigentlich bin ich mit Python nicht vertraut. Könnten Sie einen Code - Snippet geben Sie mir bitte (idealerweise einen Liner) , die Website ersetzen: example.com auf der Website: mydomain.tld für den neu installierte Mailman 3?

OK, wie sich herausstellt, erstellt Django die standardmäßige examples.com Site selbst und es gibt keine Möglichkeit, dieses Verhalten tatsächlich zu stoppen.

Hier sind also Ihre Optionen, wenn Sie während des Starts eine neue Website erstellen möchten.

  • Der "richtige" Weg, dies zu tun, wäre die Verwendung von Djangos Fixtures. Mit Fixtures können Sie hartcodierte Daten für jeden Zweck in die Datenbank laden. Sie erstellen also manuell eine Datei, die als JSON, YAML oder XML serialisiert ist, und führen den Befehl aus: python manage.py loaddata <nameoffixture> und django lädt diese Daten in die Datenbank. Beispielsweise:

Die folgende Datei wird unter fixtures/gen_site.yaml gespeichert:

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

Dann führen Sie python manage.py loaddata gen_site und Ihre Site wird automatisch erstellt. Dann ändern Sie Ihre SITE_ID=100 in die settings_local.py und die Dinge sollten funktionieren!

Dies ist jedoch derzeit mit den Containern wahrscheinlich schwierig, da es keine einfache Möglichkeit gibt, benutzerdefinierte Befehle beim Start auszuführen (in der Docker-Terminologie auch als Einstiegspunkt bezeichnet). Ich habe eine neue Ausgabe Nr. 61 geöffnet, um dieses Problem zu verfolgen.

  • Die zweite Option für Sie besteht darin, diesen Befehl manuell auszuführen:
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)"

Beachten Sie, dass der obige Befehl für django gedacht ist, also müssen Sie docker-compose exec -T mailman-web vor dem obigen Befehl anhängen.
Dieser Befehl erstellt eine neue Site namens mysite.tld . Es wird auch die id ausgeben, die Sie dann unter SITE_ID=101 ablegen und Ihre Django-Instanz neu starten müssen, damit dies wirksam wird. Dieser Befehl schlägt nicht fehl, wenn die Site bereits in der Datenbank vorhanden ist.
Ich würde sagen, dass dies auch nicht der beste Weg ist, weil Sie erstens den Container neu starten müssen, damit dies wirksam wird (nur beim ersten Mal, aber das ist genauso schlimm) und zweitens gibt es keine Möglichkeit, das settings_local.py automatisch zu bearbeiten SITE_ID ohne manuelles Eingreifen wiederzugeben, es sei denn, Sie schreiben etwas sed oder awk Zauberei.

  • Die dritte Option besteht darin, einfach die Domain example.com zu bearbeiten und sie auf die gewünschte Domain zu aktualisieren.
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')"

Dies würde nirgendwo Änderungen erfordern, aber bei meinen lokalen Tests habe ich festgestellt, dass sich der Anzeigename oben nicht ändert, es sei denn, ich starte den Django-Server neu, und er wird nur zum ersten Mal benötigt. Meiner Meinung nach scheint dies die beste Option nach der ersten zu sein, für die ich bereit bin, Unterstützung in den Container-Images hinzuzufügen.

@maxking Die letzte Option funktioniert wie ein Zauber! Vielen Dank

Sollte gelöst werden.

Die Umgebungsvariable DEFAULT_FROM_DOMAIN ersetzt jetzt auch die Standarddomäne example.com.

Die Beschreibung wird jedoch nicht geändert und kann auf der Django-Admin-Site geändert werden.

Behoben in #95

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen