Docker-mailman: قم بإزالة example.com باعتباره الموقع الافتراضي في django

تم إنشاؤها على ٢١ أبريل ٢٠١٧  ·  9تعليقات  ·  مصدر: maxking/docker-mailman

في الوقت الحالي ، عندما يظهر مثيل ، يتم تعيين الموقع الافتراضي على example.com (لسبب ما).

غيّر ذلك أو أضف تعليمات لتغيير معرّف الموقع إلى النطاق الفعلي المستخدم.

bug documentation web

ال 9 كومينتر

ما هو أسوأ ، إذا قمت بحذف example.com من قائمة المواقع ، فسأحصل على "خطأ في الخادم (500)" ويصبح التثبيت غير قابل للاستخدام.

إليك ما هو موجود في سجلات الويب لرجل البريد:

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 نعم ، تحتاج إلى تغيير SITE_ID الافتراضي في إعدادات Django إلى أي موقع تستخدمه.

القيمة الافتراضية هي 1 في الحاوية settings.py وهي تتوافق مع example.com.

يجب عليك تغييره إلى 2 ، والذي أفترض أنه يشير إلى مجالك بـ settings_local.py . يمكنك إضافة ما يلي:
SITE_ID=2

maxking سيكون من الأفضل إذا كان بإمكاني استبدال example.com هذا التعليق . أو عن طريق استعلام SQL في حاوية قاعدة البيانات ... هل يمكنك المساعدة؟

ulrith Yep ، سوف ينقلك سطر أوامر 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 في الواقع لست على دراية ببايثون. هل يمكنك من فضلك إعطائي مقتطف رمز (من الناحية المثالية سطر واحد) والذي سيحل محل Site: example.com إلى Site: mydomain.tld لـ Mailman 3 المثبت حديثًا؟

حسنًا ، كما اتضح ، أنشأ Django الموقع الافتراضي examples.com نفسه ولا توجد طريقة لإيقاف هذا السلوك فعليًا.

إذن ، ها هي خياراتك إذا كنت ترغب في إنشاء موقع ويب جديد أثناء بدء التشغيل.

  • الطريقة "الصحيحة" للقيام بذلك هي استخدام تركيبات 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 وسيتم إنشاء موقعك تلقائيًا. ثم قمت بتغيير SITE_ID=100 في settings_local.py ويجب أن تعمل الأشياء!

ومع ذلك ، قد يكون القيام بذلك الآن باستخدام الحاويات أمرًا صعبًا حيث لا توجد طريقة سهلة لتشغيل أوامر مخصصة بالفعل عند بدء التشغيل (تسمى أيضًا نقطة الدخول في مصطلحات 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 بدون تدخل يدوي ، إلا إذا كتبت بالطبع بعض السحر 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

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات