ํ์ฌ ์ธ์คํด์ค๊ฐ ๋ํ๋๋ฉด ๊ธฐ๋ณธ ์ฌ์ดํธ๊ฐ example.com์ผ๋ก ์ค์ ๋ฉ๋๋ค (์ด๋ค ์ด์ ๋ก ๋ ).
์ด๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ฌ์ดํธ ID๋ฅผ ์ฌ์ฉ์ค์ธ ์ค์ ๋๋ฉ์ธ์ผ๋ก ๋ณ๊ฒฝํ๋ ์ง์นจ์ ์ถ๊ฐํ์ญ์์ค.
๋ ๋์ ๊ฒ์ ์ฌ์ดํธ ๋ชฉ๋ก์์ example.com์ ์ญ์ ํ๋ฉด '์๋ฒ ์ค๋ฅ (500)'๊ฐ ๋ฐ์ํ๊ณ ์ค์น๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ๋ฉ๋๋ค.
๋ค์์ 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 ์, Django์ ์ค์ ์์ ๊ธฐ๋ณธ SITE_ID
๋ฅผ ์ฌ์ฉ์ค์ธ ์ฌ์ดํธ๋ก ๋ณ๊ฒฝํด์ผํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก์ด ๊ฐ์ ์ปจํ
์ด๋์ settings.py
์ด๋ฉฐ example.com์ ํด๋นํฉ๋๋ค.
settings_local.py
์ ๋๋ฉ์ธ์ ๊ฐ๋ฆฌํค๋ 2๋ก ๋ณ๊ฒฝํด์ผํฉ๋๋ค. ๋ค์์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
SITE_ID=2
@maxking example.com์ ์ค์ ๋๋ฉ์ธ์ผ๋ก ๋์ฒด ํ ์ ์๋ค๋ฉด ์ด ์ฃผ์ ์์ ์ธ๊ธ ํ ๊ฒ๊ณผ ๊ฐ์ ๋ช ๋ น์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค. ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปจํ ์ด๋์ SQL ์ฟผ๋ฆฌ๋ก ... ๋์ ์ค ์ ์์ต๋๊น?
@ulrith ์, 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 ์ฌ์ค ์ ๋ ํ์ด์ฌ์ ์ต์ํ์ง ์์ต๋๋ค. ์๋ก ์ค์น๋ Mailman 3์ ๋ํด Site : example.com์ Site : mydomain.tld๋ก ๋์ฒด ํ ์ฝ๋ ์ค ๋ํซ (์ด์์ ์ผ๋ก๋ ํ๋์ ๋ผ์ด๋)์ ์๋ ค์ฃผ์๊ฒ ์ต๋๊น?
์ข์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก 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
๋ฅผ ์๋์ผ๋ก ํธ์ง ํ ์์๋ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ต์ ์ ๋ฐฉ๋ฒ์ด ์๋๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. sed
๋๋ awk
๋ง๋ฒ์ ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ์๋ ๊ฐ์
์์ด ์๋ก์ด SITE_ID
settings_local.py
์ ๋ฐ์ํฉ๋๋ค.
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์์ ์์ ๋จ