現在、インスタンスが起動すると、デフォルトのサイトは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に精通していません。 新しくインストールされたMailman3のSite:example.comをSite:mydomain.tldに置き換えるコードスニペット(理想的には1つのライナー)を教えてください。
実は、Djangoはデフォルトのexamples.com
サイト自体を作成しており、この動作を実際に停止する方法はありません。
したがって、起動時に新しいWebサイトを作成する場合のオプションは次のとおりです。
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
を実行すると、サイトが自動作成されます。 次に、 settings_local.py
SITE_ID=100
を変更すると、問題なく動作するはずです。
ただし、起動時にカスタムコマンド(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
settings_local.py
を反映します。もちろん、 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で修正