작성
·
68
0
질문을 온전히 이해할 수 있도록, 모든 맥락을 전달해주세요.
질문은 질문자가 번거로워야 보다 좋은 답변을 얻으실 수 있습니다.
시행착오를 알려주시면 곧바로 원하는 문제에 집중할 수 있습니다.
오류 메시지는 일부만 알려주시기보다 전체 오류 메시지를 캡처해서 주시면, 오류 파악에 도움이 됩니다.
당신의 파이썬/장고 페이스메이커가 되겠습니다. ;-)
인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
runserver 실행 시 하기의 오류가 발생합니다.
Exception ignored in : <function Componentregistry.__del__ at 0x2af53d0bf9a0>
Traceback (most recent call last):
File " .venv/lib/python3.10/site-packages/django_components/component_register.py", line 267, in __del__
AttributeError: 'NoneType' object has no attribute 'on_registry_deleted'
Watching for file changes with StatReloader
#...
일단 겉으로 보기에는 문제 없이 작동은 합니다.
settings.py는 django-components 설치 - 파이썬사랑방 튜토리얼 (pyhub.kr) 과 documentation을 보고 수정하였는데 위와 같은 문제가 발생하는 이유를 모르겠어서 혹시 아실까 싶어 질문드립니다.
from email.utils import getaddresses
import os, sys
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
from django.urls import reverse_lazy
from environ import Env
env = Env()
ENV_PATH = Path(env.str("ENV_PATH", default=str(BASE_DIR / ".env")))
if ENV_PATH.exists():
with ENV_PATH.open(encoding="utf-8") as f:
env.read_env(f, overwrite=True)
SECRET_KEY = env.str(
"SECRET_KEY",
default="django-insecure-k-7_h!2*)6jefsxn6k^2@o%jb5tozyd*6^ga+ded==osow#%!!",
)
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env.bool("DEBUG", default=True)
ALLOWED_HOSTS = env.list("ALLOWED_HOSTS", default=[])
CSRF_TRUSTED_ORIGINS = env.list("CSRF_TRUSTED_ORIGINS", default=[])
# Application definition
INSTALLED_APPS = [
# django apps
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
# third apps
"crispy_forms",
"crispy_bootstrap5",
"django_bootstrap5",
"django_components",
"django_extensions",
"django_filters",
"django_htmx",
"formtools", # will be deprecated, form wizard
"imagekit",
"taggit",
"template_partials",
# local apps
"accounts",
"board",
"core",
"pao",
"simater",
"dvmt",
# Django clenup should be placed last
"django_cleanup.apps.CleanupConfig",
]
CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
CRISPY_TEMPLATE_PACK = "bootstrap5"
TAGGIT_CASE_INSENSITIVE = env.bool("TAGGIT_CASE_INSENSITIVE", default=True)
if DEBUG:
INSTALLED_APPS += [
"debug_toolbar",
]
AUTH_USER_MODEL = "accounts.User" # Load customized user from accounts app
LOGIN_REDIRECT_URL = "/"
LOGIN_URL = reverse_lazy("accounts:login")
from django.core.exceptions import ImproperlyConfigured
EMAIL_HOST = env.str("EMAIL_HOST", default=None)
if DEBUG and EMAIL_HOST is None:
# EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
else:
try:
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_PORT = env.int("EMAIL_PORT")
EMAIL_USE_SSL = env.bool("EMAIL_USE_SSL", default=False)
EMAIL_USE_TLS = env.bool("EMAIL_USE_TLS", default=False)
EMAIL_HOST_USER = env.str("EMAIL_HOST_USER")
EMAIL_HOST_PASSWORD = env.str("EMAIL_HOST_PASSWORD")
DEFAULT_FROM_EMAIL = env.str("DEFAULT_FROM_EMAIL")
SERVER_EMAIL = env.str("SERVER_EMAIL", default=DEFAULT_FROM_EMAIL)
except ImproperlyConfigured as e:
print("ERROR:", e, file=sys.stderr)
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"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_htmx.middleware.HtmxMiddleware",
"csp.middleware.CSPMiddleware",
]
if DEBUG:
MIDDLEWARE = [
"debug_toolbar.middleware.DebugToolbarMiddleware",
] + MIDDLEWARE
ROOT_URLCONF = "config.urls"
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [
BASE_DIR / "core" / "templates",
# BASE_DIR / "core" / "src-django-components",
],
# "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",
],
"loaders": [
(
"django.template.loaders.cached.Loader",
[
# Default Django loader
"django.template.loaders.filesystem.Loader",
# Including this is the same as APP_DIRS=True
"django.template.loaders.app_directories.Loader",
# Components loader
"django_components.template_loader.Loader",
],
)
],
},
},
]
WSGI_APPLICATION = "config.wsgi.application"
# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
DEFAULT_DATABASE_URL = f"sqlite:///{BASE_DIR / 'db.sqlite3'}"
DATABASES = {
"default": env.db(default=DEFAULT_DATABASE_URL)
}
# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]
# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/
LANGUAGE_CODE = env.str(var="LANGUAGE_CODE", default="ko-kr")
TIME_ZONE = "Asia/Seoul"
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/
STATIC_URL = env.str("STATIC_URL", default="static/")
STATICFILES_DIRS = [
# BASE_DIR / "core" / "static",
# BASE_DIR / "core" / "src-django-components",
]
STATIC_ROOT = env.str("STATIC_ROOT", default=BASE_DIR / "staticfiles")
# django-components
# - context variable를 resolve하는 방식이 변경
from django_components import ComponentsSettings
COMPONENTS = ComponentsSettings(
dirs=[
Path(BASE_DIR) / "core" / "src-django-components",
],
)
# COMPONENTS = {
# "dirs": [
# # BASE_DIR / "components", # default
# BASE_DIR
# / "core"
# / "src-django-components",
# ],
# # "context_behavior": "django", # default
# }
STATICFILES_FINDERS = [
# Default finders
"django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder",
# Django components
"django_components.finders.ComponentsFileSystemFinder",
]
MIDDLEWARE += [
"django_components.middleware.ComponentDependencyMiddleware",
]
# Media files
MEDIA_URL = env.str("MEDIA_URL", default="media/")
MEDIA_ROOT = env.str("MEDIA_ROOT", default=BASE_DIR / "mediafiles")
# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
from django.contrib.messages import constants as messages_constants
if DEBUG:
MESSAGE_LEVEL = messages_constants.DEBUG
INTERNAL_IPS = env.list("INTERNAL_IPS", default=["127.0.0.1"])
if DEBUG:
# FORM_RENDERER = "core.forms.renderers.NoCacheDjangoTemplates"
INSTALLED_APPS += [
"django.forms",
]
DEFAULT_FILE_STORAGE = "django.core.files.storage.FileSystemStorage"
ADMIN_PREFIX = os.environ.get("ADMIN_PREFIX", "might/")
## django default loggings : django.utils.logs.DEFAULT_LOGGING
## LOGGING settings
LOGGING = {
#...
}
ADMINS = getaddresses([env.str("ADMINS", default="")])
# Django-csp settings
CSP_FRAME_ANCESTORS = env.list("CSP_FRAME_ANCESTORS", default=[])
CSP_DEFAULT_SRC = [
"'self'",
]
CSP_SCRIPT_SRC = ["'self'", "'unsafe-inline'", "'unsafe-eval'"] + CSP_FRAME_ANCESTORS
CSP_STYLE_SRC = [
"'self'",
"'unsafe-inline'",
] + CSP_FRAME_ANCESTORS
CSP_IMG_SRC = [
"'self'",
"data:",
] + CSP_FRAME_ANCESTORS
if not CSP_FRAME_ANCESTORS:
CSP_FRAME_ANCESTORS = ["'self'"]
답변 2
0
안녕하세요.
보여주신 runserver 시에 발생하는 에러는 django_components/component_register.py 내의 extensions 객체가 None인 상황인데요. 저는 처음 보는 상황이네요.
일단 저는 업데이트를 해보니 경고없이 잘 동작하는 상황이긴 합니다. 저도 재현이 되면 세부 내용을 확인해볼텐데요. 라이브러리 혹은 현재 프로젝트 내의 어떤 상황 때문일텐데요.
help@pyhub.kr 메일로 현재의 프로젝트를 압축해서 보내주시면 저도 한 번 확인해보겠습니다.
감사합니다. :-)
0
안녕하세요, 인프런 AI 인턴입니다.
pplkjh2님, Django-Components 사용 중 발생한 오류에 대해 고민이 있으시군요. 오류 메시지와 함께 문제가 발생하는 부분을 자세히 설명해주셔서 감사합니다. 이는 django-components 라이브러리에서 component registry와 관련된 삭제 시 발생하는 문제로 보입니다.
주요 오류 내용
- 발생한 오류는 ComponentRegistry.__del__
메서드에서 NoneType
의 객체에 접근하려고 할 때 AttributeError
가 발생하는 것입니다.
- 이 오류는 런타임 중에는 큰 영향을 주지 않지만 자주 발생한다면 로그나 디버깅 과정에서 불편을 초래할 수 있습니다.
해결 방법
1. 패키지 업데이트 및 확인:
- 우선 django-components
패키지가 최신 버전인지 확인해보세요. 최신 버전에는 이러한 버그가 수정되었을 수 있습니다.
- pip install --upgrade django-components
명령어로 업데이트를 시도해 보세요.
이러한 오류는 종종 메모리 정리 과정에서의 정상적인 현상일 수 있으며, 프로그램의 실행에는 문제를 일으키지 않을 수 있습니다. 그러나 로그에 빈번하게 나타난다면 위에 언급된 해결 방법을 시도해보세요. 오류의 근본적인 원인을 찾기 위해서는 라이브러리 자체의 코드 검토를 통해 원인 분석이 필요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
확인결과 0.139버전을 사용 시 django-components git의 tutorial에서도 같은 오류가 발생합니다. 버전을 0.135로 낮추니까 해당 문제가 해결되었습니다 (그 사이 버전은 테스트해보지 않았습니다). 다른 분들도 참고하시면 좋을거 같습니다.