现在,当实例出现时,默认站点设置为 example.com(出于某种原因)。
更改或添加说明以将站点 ID 更改为正在使用的实际域。
更糟糕的是,如果我从站点列表中删除 example.com,我会收到“服务器错误 (500)”并且安装变得无法使用。
以下是 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是的,您需要将 Django 设置中的默认SITE_ID
更改为您正在使用的任何站点。
默认情况下,容器的settings.py
的值为 1,它对应于 example.com。
您应该将其更改为 2,我想这将指向您在settings_local.py
。 您可以添加以下内容:
SITE_ID=2
@maxking如果我可以使用我在此评论中提到的某些命令将 example.com 替换为我的实际域会更好。 或者通过数据库容器中的 sql 查询...你能帮忙吗?
@ulrith 是的,Django 命令行会将您带入 Python REPL,您可以在其中执行任何您想做的事情,甚至是生产数据库 ;-)
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)
如果您需要阅读更多相关信息,这里是Django 站点框架的链接
@maxking其实我不熟悉 Python。 你能给我一个代码片段(最好是一个班轮),它将替换新安装的 Mailman 3 的 Site:example.com 到 Site:mydomain.tld?
好的,事实证明,Django 自己创建了默认的examples.com
站点,并且没有办法真正阻止这种行为。
因此,如果您想在启动期间创建一个新网站,这里有您的选择。
python manage.py loaddata <nameoffixture>
和 django 将该数据加载到数据库中。 例如:下面的文件保存到fixtures/gen_site.yaml
:
- model: sites.Site
pk: 100
fields:
domain: gmail.com
name: Google
然后,您运行python manage.py loaddata gen_site
并自动创建站点。 然后你在SITE_ID=100
中改变你的settings_local.py
并且事情应该工作!
但是,现在使用容器执行此操作可能很困难,因为没有简单的方法可以在启动时实际运行自定义命令(在 Docker 术语中也称为入口点)。 我打开了一个新问题 #61 来跟踪这个问题。
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)"
请注意,上述命令是针对 django 的,因此您需要在上述命令之前附加docker-compose exec -T mailman-web
。
此命令将创建一个名为mysite.tld
的新站点。 它还将打印出id
,然后您必须将其放在SITE_ID=101
并重新启动您的 Django 实例以使其生效。 如果该站点已存在于数据库中,则此命令不会失败。
我想说这也不是最好的方法,因为首先,您需要重新启动容器才能使其生效(只有第一次,但这同样糟糕),其次,无法自动编辑settings_local.py
无需人工干预即可反映新的SITE_ID
,除非您编写一些sed
或awk
魔法。
example.com
域并将其更新为您想要的任何域。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')"
这不需要在任何地方进行任何更改,但是在我的本地测试中,我发现除非我重新启动 Django 服务器,否则顶部的显示名称不会更改,并且只有第一次需要它。 在我看来,这看起来是最好的选择,在第一个之后,我愿意在容器映像中添加支持。
@maxking最后一个选项就像一个魅力! 谢谢
应该解决。
DEFAULT_FROM_DOMAIN 环境变量现在也替换了默认的 example.com 域。
然而,描述没有改变,可以从 Django 管理站点进行更改。
已在 #95 中修复