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