Docker-mailman: Remova example.com como o SITE padrão no Django

Criado em 21 abr. 2017  ·  9Comentários  ·  Fonte: maxking/docker-mailman

Agora, quando uma instância é exibida, o site padrão é definido como example.com (por algum motivo).

Altere isso ou adicione instruções para alterar a id do site para o domínio real que está sendo usado.

bug documentation web

Todos 9 comentários

O que é pior, se eu excluir example.com da lista de sites, recebo 'Erro de servidor (500)' e a instalação se torna inutilizável.

Aqui está o que está nos logs do 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 Sim, você precisa mudar o SITE_ID padrão nas configurações do Django para qualquer site que você esteja usando.

Por padrão, o valor é 1 no contêiner settings.py e corresponde a example.com.

Você deve alterá-lo para 2, que suponho que apontaria para seu domínio em settings_local.py . Você pode adicionar o seguinte:
SITE_ID=2

@maxking Seria melhor se eu pudesse substituir example.com pelo meu domínio real com algum comando como mencionei neste comentário . Ou por consulta sql em container de banco de dados ... Você pode ajudar?

@ulrith Sim, a linha de comando do Django o deixará em um REPL python onde você pode fazer o que quiser, até mesmo para o banco de dados de produção ;-)

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)

Se você precisar ler mais sobre isso, aqui está um link para o framework Sites do Django.

@maxking Na verdade, não estou familiarizado com Python. Você poderia me fornecer um trecho de código (de preferência um liner) que substituirá Site: example.com por Site: mydomain.tld para o Mailman 3 recém-instalado?

OK, então o Django cria o próprio site examples.com padrão e não há como interromper esse comportamento.

Então, aqui estão suas opções se você deseja criar um novo site durante a inicialização.

  • A maneira "certa" de fazer isso seria usando os acessórios do Django. As luminárias permitem que você carregue dados codificados permanentemente no banco de dados para qualquer propósito que você possa ter. Então, você cria manualmente um arquivo serializado como JSON, YAML ou XML e executa o comando: python manage.py loaddata <nameoffixture> e o django carrega esses dados no banco de dados. Por exemplo:

O arquivo abaixo foi salvo em fixtures/gen_site.yaml :

- model: sites.Site
  pk: 100
  fields:
    domain: gmail.com
    name: Google

Então, você executa python manage.py loaddata gen_site e seu site é criado automaticamente. Então você muda seu SITE_ID=100 no settings_local.py e tudo deve funcionar!

No entanto, fazer isso agora com os contêineres provavelmente é difícil, pois não há uma maneira fácil de realmente executar comandos personalizados na inicialização (também chamado de ponto de entrada na terminologia do Docker). Abri um novo exemplar nº 61 para rastrear esse problema.

  • A segunda opção para você será executar manualmente este comando:
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)"

Observe que o comando acima é destinado ao django, então você precisa anexar docker-compose exec -T mailman-web antes do comando acima.
Este comando criará um novo site denominado mysite.tld . Ele também imprimirá id que você então teria que colocar em SITE_ID=101 e reiniciar sua instância do Django para que isso tenha efeito. Este comando não falhará se o site já existir no banco de dados.
Eu diria que este também não é a melhor maneira de fazê-lo porque em primeiro lugar, você precisa reiniciar o recipiente para que isso tenha efeito (somente primeira vez, mas que é igualmente ruim) e em segundo lugar, não há nenhuma maneira de editar automaticamente o settings_local.py para refletir o novo SITE_ID sem intervenção manual, a menos, claro, se você escrever alguma mágica sed ou awk .

  • A terceira opção é apenas editar o domínio example.com e atualizá-lo para o domínio que desejar.
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')"

Isso não exigiria nenhuma mudança em lugar nenhum, mas em meu teste local descobri que o nome de exibição no topo não muda a menos que eu reinicie o servidor Django, e isso só será necessário na primeira vez. A meu ver, esta parece ser a melhor opção, depois da primeira, para a qual estou disposto a adicionar suporte nas imagens do container.

@maxking A última opção funciona

Deve ser resolvido.

A variável de ambiente DEFAULT_FROM_DOMAIN agora também substitui o domínio padrão example.com.

A descrição, entretanto, não é alterada e pode ser alterada no site de administração do Django.

Fixado em # 95

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

daamien picture daamien  ·  12Comentários

strarsis picture strarsis  ·  5Comentários

belzebubek picture belzebubek  ·  12Comentários

morbidick picture morbidick  ·  7Comentários

kodeshpa picture kodeshpa  ·  3Comentários