Docker-mailman: Hapus example.com sebagai SITE default di Django

Dibuat pada 21 Apr 2017  ·  9Komentar  ·  Sumber: maxking/docker-mailman

Saat ini, ketika sebuah instance muncul, situs default diatur ke example.com (untuk beberapa alasan).

Ubah itu atau tambahkan instruksi untuk mengubah id situs ke domain sebenarnya yang sedang digunakan.

bug documentation web

Semua 9 komentar

Yang lebih buruk, jika saya menghapus example.com dari daftar situs saya mendapatkan 'Server error (500)' dan instalasi menjadi tidak dapat digunakan.

Inilah yang ada di log web tukang pos:

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 Ya, Anda perlu mengubah default SITE_ID dalam pengaturan Django ke situs apa pun yang Anda gunakan.

Secara default, nilainya adalah 1 di settings.py container dan sesuai dengan example.com.

Anda harus mengubahnya menjadi 2, yang saya kira akan mengarah ke domain Anda di settings_local.py . Anda dapat menambahkan yang berikut ini:
SITE_ID=2

@maxking Akan lebih baik jika saya dapat mengganti example.com dengan domain saya yang sebenarnya dengan beberapa perintah seperti yang saya sebutkan di komentar ini . Atau dengan permintaan sql dalam wadah basis data ... Bisakah Anda membantu?

@ulrith Ya, baris perintah Django akan menjatuhkan Anda ke REPL python di mana Anda dapat melakukan apa pun yang Anda inginkan, bahkan ke database produksi ;-)

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)

Jika Anda perlu membaca lebih lanjut tentang ini, berikut adalah tautan ke kerangka kerja Situs Django.

@maxking Sebenarnya saya tidak akrab dengan Python. Bisakah Anda memberi saya potongan kode (idealnya satu liner) yang akan menggantikan Site: example.com ke Site: mydomain.tld untuk Mailman 3 yang baru diinstal?

OK, jadi ternyata, Django membuat situs default examples.com itu sendiri dan tidak ada cara untuk benar-benar menghentikan perilaku ini.

Jadi, inilah pilihan Anda jika Anda ingin membuat situs web baru saat startup.

  • Cara "benar" untuk melakukan ini adalah menggunakan perlengkapan Django. Fixtures memungkinkan Anda untuk memuat data hardcode ke dalam database untuk tujuan apa pun yang Anda miliki. Jadi, Anda secara manual membuat file yang diserialisasi sebagai JSON, YAML atau XML dan menjalankan perintah: python manage.py loaddata <nameoffixture> dan django memuat data itu ke dalam database. Sebagai contoh:

File di bawah ini disimpan ke fixtures/gen_site.yaml :

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

Kemudian, Anda menjalankan python manage.py loaddata gen_site dan Situs Anda telah dibuat secara otomatis. Kemudian Anda mengubah SITE_ID=100 di settings_local.py dan semuanya akan berfungsi!

Namun, melakukan ini sekarang dengan wadah mungkin sulit karena tidak ada cara mudah untuk benar-benar menjalankan perintah khusus saat startup (juga disebut entrypoint dalam terminologi Docker). Saya telah membuka edisi baru #61 untuk melacak masalah itu.

  • Opsi kedua bagi Anda adalah menjalankan perintah ini secara manual:
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)"

Perhatikan bahwa perintah di atas dimaksudkan untuk Django, jadi Anda perlu menambahkan docker-compose exec -T mailman-web sebelum perintah di atas.
Perintah ini akan membuat situs baru bernama mysite.tld . Itu juga akan mencetak id yang kemudian harus Anda letakkan di bawah SITE_ID=101 dan memulai ulang instans Django Anda agar ini berlaku. Perintah ini tidak akan gagal jika situs sudah ada di database.
Saya akan mengatakan ini juga bukan cara terbaik untuk melakukannya karena pertama, Anda perlu me-restart wadah agar ini berlaku (hanya pertama kali, tetapi itu sama buruknya) dan kedua, tidak ada cara untuk secara otomatis mengedit settings_local.py untuk mencerminkan SITE_ID tanpa intervensi manual, kecuali jika Anda menulis sihir sed atau awk .

  • Opsi ketiga adalah mengedit domain example.com dan memperbaruinya ke domain apa pun yang Anda inginkan.
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')"

Ini tidak memerlukan perubahan apapun dimanapun, tetapi dalam pengujian lokal saya, saya menemukan bahwa nama tampilan di atas tidak berubah kecuali saya me-restart server Django, dan itu hanya akan diperlukan untuk pertama kalinya. Menurut saya, ini terlihat seperti opsi terbaik, setelah yang pertama, yang ingin saya tambahkan dukungannya dalam gambar kontainer.

@maxking Opsi terakhir berfungsi seperti pesona! Terima kasih

Harus diselesaikan.

Variabel lingkungan DEFAULT_FROM_DOMAIN sekarang juga menggantikan domain default example.com.

Namun deskripsi tidak diubah dan dapat diubah dari situs admin Django.

Tetap di #95

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

daamien picture daamien  ·  12Komentar

belzebubek picture belzebubek  ·  12Komentar

strarsis picture strarsis  ·  5Komentar

morbidick picture morbidick  ·  7Komentar

DarwinSurvivor picture DarwinSurvivor  ·  3Komentar