Docker-mailman: 删除 example.com 作为 django 中的默认站点

创建于 2017-04-21  ·  9评论  ·  资料来源: maxking/docker-mailman

现在,当实例出现时,默认站点设置为 example.com(出于某种原因)。

更改或添加说明以将站点 ID 更改为正在使用的实际域。

bug documentation web

所有9条评论

更糟糕的是,如果我从站点列表中删除 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站点,并且没有办法真正阻止这种行为。

因此,如果您想在启动期间创建一个新网站,这里有您的选择。

  • 做到这一点的“正确”方法是使用 Django 的装置。 Fixtures 允许您将硬编码数据加载到数据库中,无论您出于何种目的。 因此,您手动创建一个序列化为 JSON、YAML 或 XML 的文件并运行命令: 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 ,除非您编写一些sedawk魔法。

  • 第三个选项是只编辑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 中修复

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

strarsis picture strarsis  ·  5评论

daamien picture daamien  ·  12评论

belzebubek picture belzebubek  ·  12评论

morbidick picture morbidick  ·  7评论

blite picture blite  ·  3评论