기존 Django 프로젝트에 Wagtail 추가하는 방법¶
완전히 처음부터 Wagtail을 설치하려면, 새로운 Django 프로젝트와 그 프로젝트 내에 앱을 생성하세요. 이러한 작업에 대한 지침은 첫 번째 Django 앱 작성하기를 참조하세요. 프로젝트 디렉토리는 다음과 같이 보일 것입니다:
myproject/
myproject/
__init__.py
settings.py
urls.py
wsgi.py
myapp/
__init__.py
models.py
tests.py
admin.py
views.py
manage.py
앱 디렉토리에서 admin.py 와 views.py 를 안전하게 제거할 수 있습니다. Wagtail이 모델에 대한 이 기능을 제공하기 때문입니다. Django가 Wagtail을 로드하도록 구성하려면 settings.py 에 모듈과 변수를 추가하고 urls.py 에 URL 구성을 추가해야 합니다. 이러한 파일에 정의된 내용에 대한 더 완전한 보기는 Django 설정과 Django URL 디스패처를 참조하세요.
다음은 많은 상용구 Django 설정을 건너뛰는 설정 참조입니다. 지금 당장 설정에 신경 쓰지 않고 Wagtail 설치를 빠르게 시작하려면 바로 사용할 수 있는 예제 구성 파일를 참조하세요.
미들웨어 (settings.py)¶
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'wagtail.contrib.redirects.middleware.RedirectMiddleware',
]
Wagtail은 로그인 세션과 같은 기본 보안 및 기능을 다루기 위해 Django 미들웨어 모듈의 기본 세트에 의존합니다. 추가 미들웨어 모듈이 제공됩니다:
RedirectMiddleware
Wagtail은 사이트에 임의의 리디렉션을 추가하기 위한 간단한 인터페이스를 제공하며, 이 모듈이 그것을 가능하게 합니다.
앱 (settings.py)¶
INSTALLED_APPS = [
'myapp', # 사용자 자신의 앱
'wagtail.contrib.forms',
'wagtail.contrib.redirects',
'wagtail.embeds',
'wagtail.sites',
'wagtail.users',
'wagtail.snippets',
'wagtail.documents',
'wagtail.images',
'wagtail.search',
'wagtail.admin',
'wagtail',
'taggit',
'modelcluster',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Wagtail은 여러 Django 앱 모듈, 서드파티 앱을 필요로 하며, 자체적으로 여러 앱을 정의합니다. Wagtail은 모듈식으로 구축되었으므로 필요에 맞게 많은 Wagtail 앱을 생략할 수 있습니다. 사용자 자신의 앱(여기서는 myapp)은 모델, 템플릿, 정적 자산, 템플릿 태그 및 사이트에 대한 기타 사용자 정의 기능을 정의하는 곳입니다.
Wagtail 앱¶
wagtail
Page 클래스, Wagtail 트리 및 모델 필드와 같은 Wagtail의 핵심 기능.
wagtail.admin
페이지 편집 핸들러를 포함한 Wagtail의 관리 인터페이스.
wagtail.documents
Wagtail 문서 콘텐츠 유형.
wagtail.snippets
비-페이지 모델 및 객체에 대한 편집 인터페이스. 스니펫를 참조하세요.
wagtail.users
사용자 편집 인터페이스.
wagtail.images
Wagtail 이미지 콘텐츠 유형.
wagtail.embeds
Wagtail 리치 텍스트 필드의 oEmbed 및 Embedly 콘텐츠를 관리하는 모듈.
wagtail.search
페이지 콘텐츠를 위한 검색 프레임워크. 검색를 참조하세요.
wagtail.sites
Wagtail 사이트를 위한 관리 UI.
wagtail.contrib.redirects
사이트에 임의의 리디렉션을 생성하기 위한 관리자 인터페이스.
wagtail.contrib.forms
페이지에 양식을 만들고 제출물을 보기 위한 모델. 양식 빌더를 참조하세요.
서드파티 앱¶
taggit
Django를 위한 태깅 프레임워크. 이것은 Wagtail 내부에서 이미지 및 문서 태깅에 사용되며 사용자 자신의 모델에서도 사용할 수 있습니다. Wagtail 모델 레시피는 태그 기능을 참조하거나 Taggit 문서를 참조하세요.
modelcluster
Django ForeignKey 관계 기능의 확장으로, Wagtail 페이지에서 즉석 관련 객체 생성에 사용됩니다. 자세한 정보는 InlinePanel 또는 django-modelcluster github 프로젝트 페이지를 참조하세요.
URL 패턴¶
from django.contrib import admin
from wagtail import urls as wagtail_urls
from wagtail.admin import urls as wagtailadmin_urls
from wagtail.documents import urls as wagtaildocs_urls
urlpatterns = [
path('django-admin/', admin.site.urls),
path('admin/', include(wagtailadmin_urls)),
path('documents/', include(wagtaildocs_urls)),
# 자신의 바닐라 Django urls/views를 포함하기 위한 선택적 URL
re_path(r'', include('myapp.urls')),
# 위의 더 구체적인 규칙에 의해 잡히지 않은 모든 것을
# Wagtail의 서빙 메커니즘에 넘깁니다
re_path(r'', include(wagtail_urls)),
]
프로젝트의 urls.py 에 대한 이 코드 블록은 몇 가지 작업을 수행합니다:
바닐라 Django 관리자 인터페이스를
/django-admin/에 로드합니다Wagtail 관리자와 다양한 앱을 로드합니다
자체 URL 구성이 필요한 Wagtail 이외의 바닐라 Django 앱을 디스패치합니다(Wagtail만 필요할 수 있으므로 이는 선택 사항입니다)
Wagtail이 추가 URL 디스패칭을 처리하도록 합니다.
이것이 프로젝트의 URL 구성에 포함하고 싶은 모든 것은 아니지만, Wagtail이 번창하는 데 필요한 것입니다.
바로 사용할 수 있는 예제 구성 파일¶
이 두 파일은 프로젝트 디렉토리(myproject/myproject/)에 있어야 합니다.
settings.py¶
import os
PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
BASE_DIR = os.path.dirname(PROJECT_DIR)
DEBUG = True
# 애플리케이션 정의
INSTALLED_APPS = [
'myapp',
'wagtail.contrib.forms',
'wagtail.contrib.redirects',
'wagtail.embeds',
'wagtail.sites',
'wagtail.users',
'wagtail.snippets',
'wagtail.documents',
'wagtail.images',
'wagtail.search',
'wagtail.admin',
'wagtail',
'taggit',
'modelcluster',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'wagtail.contrib.redirects.middleware.RedirectMiddleware',
]
ROOT_URLCONF = 'myproject.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(PROJECT_DIR, 'templates'),
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'myproject.wsgi.application'
# 데이터베이스
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myprojectdb',
'USER': 'postgres',
'PASSWORD': '',
'HOST': '', # localhost의 경우 빈 문자열로 설정하세요.
'PORT': '', # 기본값의 경우 빈 문자열로 설정하세요.
'CONN_MAX_AGE': 600, # 데이터베이스 연결이 지속되어야 하는 시간(초)
}
}
# 국제화
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# 정적 파일 (CSS, JavaScript, 이미지)
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
STATICFILES_DIRS = [
os.path.join(PROJECT_DIR, 'static'),
]
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
ADMINS = [
# ('귀하의 이름', 'your_email@example.com'),
]
MANAGERS = ADMINS
# 기본적으로 더미 이메일 백엔드를 사용합니다. 개발/프로덕션/로컬 백엔드 구성
# https://docs.djangoproject.com/en/stable/topics/email/#email-backends 참조
EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
# 이 사이트에 유효한 호스트/도메인 이름; DEBUG가 False인 경우 필수
ALLOWED_HOSTS = []
# 이것을 고유하게 만들고, 누구와도 공유하지 마세요.
SECRET_KEY = 'change-me'
EMAIL_SUBJECT_PREFIX = '[Wagtail] '
INTERNAL_IPS = ('127.0.0.1', '10.0.2.2')
# 샘플 로깅 구성. 이 구성에 의해 수행되는 유일한 실질적인 로깅은
# DEBUG=False일 때 모든 HTTP 500 오류에 대해 사이트 관리자에게 이메일을 보내는 것입니다.
# 로깅 구성을 사용자 정의하는 방법에 대한 자세한 내용은
# https://docs.djangoproject.com/en/stable/topics/logging을 참조하세요.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
# WAGTAIL 설정
# 이것은 Wagtail 관리자에 로그인할 때 사용자를 환영하는
# Wagtail 설치의 사람이 읽을 수 있는 이름입니다.
WAGTAIL_SITE_NAME = 'My Project'
# 검색 백엔드 교체
#WAGTAILSEARCH_BACKENDS = {
# 'default': {
# 'BACKEND': 'wagtail.search.backends.elasticsearch8',
# 'INDEX': 'myapp'
# }
#}
# Wagtail 이메일 알림 발신 주소
# WAGTAILADMIN_NOTIFICATION_FROM_EMAIL = 'wagtail@myhost.io'
# Wagtail 이메일 알림 형식
# WAGTAILADMIN_NOTIFICATION_USE_HTML = True
# 문서 라이브러리의 문서에 허용되는 파일 확장자.
# 모든 파일을 허용하려면 이를 생략할 수 있지만, 신뢰할 수 없는 사용자가
# 파일을 업로드할 수 있도록 허용하는 경우 보안 위험을 초래할 수 있습니다.
# https://docs.wagtail.org/en/stable/advanced_topics/deploying.html#user-uploaded-files 참조
WAGTAILDOCS_EXTENSIONS = ['csv', 'docx', 'key', 'odt', 'pdf', 'pptx', 'rtf', 'txt', 'xlsx', 'zip']
# 기본 대소문자 구분 태그 처리를 반전
TAGGIT_CASE_INSENSITIVE = True
urls.py¶
from django.urls import include, path, re_path
from django.conf.urls.static import static
from django.views.generic.base import RedirectView
from django.contrib import admin
from django.conf import settings
import os.path
from wagtail import urls as wagtail_urls
from wagtail.admin import urls as wagtailadmin_urls
from wagtail.documents import urls as wagtaildocs_urls
urlpatterns = [
path('django-admin/', admin.site.urls),
path('admin/', include(wagtailadmin_urls)),
path('documents/', include(wagtaildocs_urls)),
# 위의 더 구체적인 규칙에 의해 잡히지 않은 모든 것을
# Wagtail의 서빙 메커니즘에 넘깁니다
re_path(r'', include(wagtail_urls)),
]
if settings.DEBUG:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns() # 개발 모드에서 gunicorn에 정적 파일이 어디에 있는지 알려줍니다
urlpatterns += static(settings.MEDIA_URL + 'images/', document_root=os.path.join(settings.MEDIA_ROOT, 'images'))
urlpatterns += [
path('favicon.ico', RedirectView.as_view(url=settings.STATIC_URL + 'myapp/images/favicon.ico'))
]