Docker-mailman: Supprimer example.com comme SITE par défaut dans Django

Créé le 21 avr. 2017  ·  9Commentaires  ·  Source: maxking/docker-mailman

À l'heure actuelle, lorsqu'une instance apparaît, le site par défaut est défini sur example.com (pour une raison quelconque).

Modifiez cela ou ajoutez des instructions pour changer l'identifiant du site en le domaine réel utilisé.

bug documentation web

Tous les 9 commentaires

Pire encore, si je supprime example.com de la liste des sites, j'obtiens une "erreur de serveur (500)" et l'installation devient inutilisable.

Voici ce que contiennent les journaux 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 Oui, vous devez modifier le SITE_ID par défaut dans les paramètres de Django pour le site que vous utilisez.

Par défaut, la valeur est 1 dans le settings.py du conteneur et elle correspond à example.com.

Vous devriez le remplacer par 2, ce qui, je suppose, pointerait vers votre domaine dans settings_local.py . Vous pouvez ajouter les éléments suivants :
SITE_ID=2

@maxking Ce serait mieux si je pouvais remplacer example.com par mon domaine réel avec une commande comme je l'ai mentionné dans ce commentaire . Ou par requête SQL dans le conteneur de la base de données... Pouvez-vous m'aider ?

@ulrith Oui, la ligne de commande Django vous déposera dans un REPL python où vous pourrez faire tout ce que vous voulez, même dans la base de données de production ;-)

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)

Si vous avez besoin d'en savoir plus à ce sujet, voici un lien vers le framework Sites de Django.

@maxking En fait, je ne connais pas Python. Pourriez-vous s'il vous plaît me donner un extrait de code (idéalement une doublure) qui remplacera Site : example.com par Site : mydomain.tld pour le Mailman 3 nouvellement installé ?

OK, il s'avère que Django crée lui-même le site examples.com par défaut et il n'y a aucun moyen d'arrêter ce comportement.

Voici donc vos options si vous souhaitez créer un nouveau site Web au démarrage.

  • La "bonne" façon de le faire serait d'utiliser les appareils de Django. Les appareils vous permettent de charger des données codées en dur dans la base de données à toutes fins utiles. Ainsi, vous créez manuellement un fichier sérialisé en JSON, YAML ou XML et exécutez la commande : python manage.py loaddata <nameoffixture> et django charge ces données dans la base de données. Par example:

Le fichier ci-dessous est enregistré sous fixtures/gen_site.yaml :

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

Ensuite, vous exécutez python manage.py loaddata gen_site et votre site est automatiquement créé. Ensuite, vous changez votre SITE_ID=100 dans le settings_local.py et les choses devraient fonctionner !

Cependant, le faire maintenant avec les conteneurs est probablement difficile car il n'y a pas de moyen simple d'exécuter des commandes personnalisées au démarrage (également appelé point d'entrée dans la terminologie Docker). J'ai ouvert un nouveau numéro 61 pour suivre ce problème.

  • La deuxième option pour vous sera d'exécuter manuellement cette commande :
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)"

Notez que la commande ci-dessus est destinée à django, vous devez donc ajouter docker-compose exec -T mailman-web avant la commande ci-dessus.
Cette commande créera un nouveau site nommé mysite.tld . Il imprimera également les id que vous devrez ensuite mettre sous SITE_ID=101 et redémarrera votre instance Django pour que cela prenne effet. Cette commande n'échouera pas si le site existe déjà dans la base de données.
Je dirais que ce n'est pas non plus la meilleure façon de le faire car premièrement, vous devez redémarrer le conteneur pour que cela prenne effet (seulement la première fois, mais c'est tout aussi mauvais) et deuxièmement, il n'y a aucun moyen de modifier automatiquement le settings_local.py pour refléter le nouveau SITE_ID sans intervention manuelle, à moins bien sûr si vous écrivez awk magie sed ou awk .

  • La troisième option consiste simplement à modifier le domaine example.com et à le mettre à jour vers le domaine de votre choix.
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')"

Cela ne nécessiterait aucun changement nulle part, mais lors de mes tests locaux, j'ai découvert que le nom d'affichage en haut ne change pas à moins que je redémarre le serveur Django, et il ne sera requis que pour la toute première fois. Selon moi, cela semble être la meilleure option, après la première, pour laquelle je suis prêt à ajouter une prise en charge dans les images de conteneur.

@maxking La dernière option fonctionne à merveille ! Merci

Devrait être résolu.

La variable d'environnement DEFAULT_FROM_DOMAIN remplace désormais également le domaine example.com par défaut.

La description n'est cependant pas modifiée et peut être modifiée à partir du site d'administration de Django.

Corrigé dans #95

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

strarsis picture strarsis  ·  5Commentaires

belzebubek picture belzebubek  ·  12Commentaires

daamien picture daamien  ·  12Commentaires

morbidick picture morbidick  ·  7Commentaires

gpetukhov picture gpetukhov  ·  3Commentaires