Docker-mailman: djangoのデフォルトサイトとしてexample.comを削除します

作成日 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に精通していません。 新しくインストールされたMailman3のSite:example.comをSite:mydomain.tldに置き換えるコードスニペット(理想的には1つのライナー)を教えてください。

実は、Djangoはデフォルトのexamples.comサイト自体を作成しており、この動作を実際に停止する方法はありません。

したがって、起動時に新しいWebサイトを作成する場合のオプションは次のとおりです。

  • これを行う「正しい」方法は、Djangoのフィクスチャを使用することです。 フィクスチャを使用すると、目的を問わず、ハードコードされたデータをデータベースにロードできます。 したがって、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を実行すると、サイトが自動作成されます。 次に、 settings_local.py SITE_ID=100を変更すると、問題なく動作するはずです。

ただし、起動時にカスタムコマンド(Dockerの用語ではエントリポイントとも呼ばれます)を実際に実行する簡単な方法がないため、コンテナーを使用してこれを実行することはおそらく困難です。 その問題を追跡するために、新しい問題#61を開きました。

  • 2番目のオプションは、次のコマンドを手動で実行することです。
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魔法を書く場合を除きます。

  • 3番目のオプションは、 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 評価