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.
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.
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.
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.
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