시스템 점검 프레임워크

시스템 검사 프레임워크는 Django 프로젝트의 유효성을 검사하기 위한 일련의 정적 검사입니다. 일반적인 문제를 감지하고 해결 방법에 대한 힌트를 제공합니다. 프레임워크는 확장 가능하므로 자체 검사를 쉽게 추가할 수 있습니다.

자신의 검사를 추가하고 Django의 시스템 검사와 통합하는 방법에 대한 자세한 내용은 :doc:`System check topic guide </topics/checks>`을 참조하십시오.

API 레퍼런스

“체크 메세지”

class CheckMessage(level, msg, hint=None, obj=None, id=None)

시스템 검사에서 발생하는 경고 및 오류는 ``CheckMessage``의 인스턴스여야 합니다. 인스턴스는 보고 가능한 단일 오류 또는 경고를 캡슐화합니다. 또한 메시지에 적용할 수 있는 컨텍스트 및 힌트와 필터링 목적으로 사용되는 고유 식별자를 제공합니다.

생성자 인수는 다음과 같습니다:

“레벨”
메시지의 심각도입니다. 미리 정의된 값 중 하나를 사용합니다: DEBUG, INFO, WARNING, ERROR, CRITICAL. 레벨이 ``ERROR``보다 크거나 같으면, Django는 관리 명령이 실행되지 않도록 합니다. ``ERROR``보다 낮은 수준의 메시지(예: 경고)는 콘솔에 보고되지만 음소거될 수 있습니다.
“msg”
문제를 설명하는 짧은(80자 미만) 문자열입니다. 문자열은 개행 문자를 포함하지 않아야 합니다.
“힌트”
문제 해결을 위한 힌트를 제공하는 한 줄 문자열입니다. 힌트를 제공할 수 없거나, 오류 메시지에서 힌트가 자명한 경우 힌트를 생략하거나 None 값을 사용할 수 있습니다.
“오브젝트”
선택 사항. 메시지에 대한 컨텍스트를 제공하는 객체(예: 문제가 발견된 모델). 객체는 모델, 필드, 관리자 또는 __str__() 메서드를 정의하는 다른 객체여야 합니다. 이 메서드는 모든 메시지를 보고할 때 사용되며 그 결과가 메시지보다 우선합니다.
“아이디”
선택적 문자열. 문제의 고유 식별자. 식별자는 applabel.X001 패턴을 따라야 합니다. 여기서 X``는 메시지 심각도를 나타내는 ``CEWID 문자 중 하나입니다(중요의 경우 C, 오류의 경우 E). 등등). 번호는 애플리케이션에서 할당할 수 있지만, 해당 애플리케이션 내에서 고유한 값이어야 합니다.

공통 수준으로 메시지를 더 쉽게 만들 수 있는 하위 클래스가 있습니다. 그것들을 사용할 때 level 인수는 클래스 이름에 의해 암시되기 때문에 생략할 수 있습니다.

class Debug(msg, hint=None, obj=None, id=None)
class Info(msg, hint=None, obj=None, id=None)
class Warning(msg, hint=None obj=None, id=None)
class Error(msg, hint=None, obj=None, id=None)
class Critical(msg, hint=None, obj=None, id=None)

내장되어있는 태그들

Django의 시스템 체크들은 다음의 태그들을 사용하여 정리되어 있습니다.

  • admin: 관리 사이트 선언을 확인합니다.
  • async_support: 비동기 관련 구성을 확인합니다.
  • caches: 캐시 관련 구성을 확인합니다.
  • 호환성: 버전 업그레이드와 관련된 잠재적인 문제를 표시합니다.
  • database: 데이터베이스 관련 구성 문제를 확인합니다. 데이터베이스 검사는 일반 검사처럼 정적 코드 분석 이상의 작업을 수행하기 때문에 기본적으로 실행되지 않습니다. 이들은 migrate 명령에 의해서만 실행되거나 check 명령을 호출할 때 --database 옵션을 사용하여 구성된 데이터베이스 별칭을 지정하는 경우에만 실행됩니다.
  • files: 파일 관련 구성을 확인합니다.
  • models: 모델, 필드 및 관리자 정의를 확인합니다.
  • security: 보안 관련 구성을 확인합니다.
  • signals: 신호 선언 및 처리기 등록을 확인합니다.
  • sites: django.contrib.sites 구성을 확인합니다.
  • staticfiles: django.contrib.staticfiles 구성을 확인합니다.
  • templates: 템플릿 관련 구성을 확인합니다.
  • translation: 번역 관련 설정을 확인합니다.
  • urls: URL 구성을 확인합니다.

일부 확인은 여러 태그로 등록될 수 있습니다.

핵심 시스템 체크

비동기 지원

다음 검사는 :doc:`/topics/async`에 대한 설정을 확인합니다:

  • async.E001: 배포 시 DJANGO_ALLOW_ASYNC_UNSAFE 환경 변수를 설정하면 안 됩니다. 설정하면 :ref:`비동기 안전 보호 <async-safety>`이 비활성화됩니다.

이전 버전과의 호환성

호환성 검사는 Django를 업그레이드한 후 발생할 수 있는 잠재적 문제에 대해 경고합니다.

  • 2_0.W001: URL 패턴 ``<pattern>``에는 ``(?P<``를 포함하거나 ``^``로 시작하거나 ``$``로 끝나는 ``route``가 있습니다. 이것은 ``url()``에서 :func:`~django.urls.path`로 마이그레이션할 때 발생한 오류일 것입니다.
  • 4_0.E001: Django 4.0부터 CSRF_TRUSTED_ORIGINS 설정의 값은 스킴(보통 http:// 또는 https://)로 시작해야 하지만 ‘<hostname>’을 찾았습니다.

캐시들

다음 검사는 CACHES 설정이 올바르게 구성되었는지 확인합니다:

  • caches.E001: CACHES 설정에서 'default' 캐시를 정의해야 합니다.
  • caches.W002: <cache> 구성은 해당 LOCATION <CACHES-LOCATION>`가 :setting:`MEDIA_ROOT/STATIC_ROOT/:setting:`STATICFILES_DIRS`와 일치/내부에 있음/포함하고 있기 때문에 캐시를 노출하거나 데이터 손상으로 이어질 수 있습니다.
  • caches.W003: <cache> 캐시 :setting:`LOCATION <CACHES-LOCATION>`는 상대적입니다. 대신 절대 경로를 사용하십시오.

데이터베이스

MySQL 과 MariaDB

MySQL 또는 MariaDB를 사용하는 경우, 다음 검사가 수행됩니다:

  • mysql.E001: MySQL/MariaDB는 고유한 CharFields가 max_length > 255를 갖는 것을 허용하지 않습니다. 이 검사는 실제 최대 크기는 여러 요인에 따라 달라지므로 Django 3.1에서*``mysql.W003``*으로 변경되었습니다.
  • mysql.W002: 데이터베이스 연결 ``<alias>``에 대해 MySQL/MariaDB Strict Mode가 설정되지 않았습니다. :ref:`mysql-sql-mode`를 참조하십시오.
  • mysql.W003: MySQL/MariaDB는 고유한 CharFields가 max_length > 255를 갖는 것을 허용하지 않을 수 있습니다.

파일 관리하기

다음 검사는 :doc:`/topics/files`에 대한 설정을 확인합니다:

모델 필드들

  • fields.E001: 필드 이름은 underscore로 끝나서는 안됩니다.
  • fields.E002: 필드 이름들은 ``”__”``을 포함해서는 안됩니다.
  • fields.E003: ``pk``는 필드 이름으로 사용될 수 없는 예약어입니다.
  • fields.E004: choices must be a mapping (e.g. a dictionary) or an iterable (e.g. a list or tuple).
  • fields.E005: choices must be a mapping of actual values to human readable names or an iterable containing (actual value, human readable name) tuples.
  • fields.E006: db_index``는 ``None, True 또는 False 중 하나여야 합니다.
  • fields.E007: Primary key는 ``null=True``여서는 안됩니다.
  • fields.E008: 모든 ``validators``는 호출 가능해야 합니다.
  • fields.E009: max_length``가 너무 작아 ``choices``(``<count> 문자)의 가장 긴 값에 맞지 않습니다.
  • fields.E010: <field> 기본값은 모든 필드 인스턴스 간에 공유되지 않도록 인스턴스 대신 콜러블이어야 합니다.
  • fields.E011: <database> does not support default database values with expressions (db_default).
  • fields.E012: <expression> cannot be used in db_default.
  • fields.E100: ``AutoField``는 primary_key=True로 설정되어야 합니다.
  • fields.E110: BooleanFields는 null 값을 허용하지 않습니다. 이 검사는 Django 2.1에서 null 값 지원이 추가되기 전에 나타났습니다.
  • fields.E120: CharField``는 ``max_length 속성을 정의해야 합니다.
  • fields.E121: ``max_length``는 양의 정수여야 합니다.
  • fields.W122: ``max_length``는 ``<integer field type>``과 함께 사용할 때 무시됩니다.
  • fields.E130: DecimalFields는 decimal_places 속성을 정의해야 합니다.
  • fields.E131: ``decimal_places``는 음이 아닌 정수여야 합니다.
  • fields.E132: DecimalFields는 max_digits 속성을 정의해야 합니다.
  • fields.E133: ``max_digits``는 양의 정수여야 합니다.
  • fields.E134: ``max_digits``는 ``decimal_places``보다 크거나 같아야 합니다.
  • fields.E140: FilePathFields에는 allow_files 또는 ``allow_folders``가 True로 설정되어 있어야 합니다.
  • fields.E150: GenericIPAddressFields는 ``null=False``인 경우 ``blank=True``를 가질 수 없습니다. 빈 값은 null로 저장되기 때문입니다.
  • fields.E160: auto_now, auto_now_adddefault 옵션은 상호 배타적입니다. 이러한 옵션 중 하나만 존재할 수 있습니다.
  • fields.W161: 고정된 기본값이 제공됩니다.
  • fields.W162: <database>``은 ``<field data type> 열에 대한 데이터베이스 인덱스를 지원하지 않습니다.
  • fields.W163: <database> 은 열에 대한 설명을 지원하지 않습니다. (db_comment).
  • fields.E170: ``BinaryField``의 ``default``는 문자열일 수 없습니다. 대신 바이트 콘텐츠를 사용하세요.
  • fields.E180: <database>``은 ``JSONFields를 지원하지 않습니다.
  • fields.E190: <database>``은 ``<field_type>s에서 데이터베이스 데이터 정렬을 지원하지 않습니다.
  • fields.E220: <database> does not support GeneratedFields.
  • fields.E221: <database> does not support non-persisted GeneratedFields.
  • fields.E222: <database> does not support persisted GeneratedFields.
  • fields.E223: GeneratedField.output_field has errors: …
  • fields.W224: GeneratedField.output_field has warnings: …
  • fields.E900: 이전 마이그레이션 지원을 제외하고 ``IPAddressField``가 제거되었습니다.
  • fields.W900: ``IPAddressField``는 더 이상 사용되지 않습니다. 이에 대한 지원(이전 마이그레이션 제외)은 Django 1.9에서 제거됩니다. 이 검사는 Django 1.7 및 1.8에서 나타납니다.
  • fields.W901: ``CommaSeparatedIntegerField``는 더 이상 사용되지 않습니다. 이에 대한 지원(이전 마이그레이션 제외)은 Django 2.0에서 제거됩니다. 이 검사는 Django 1.10 및 1.11에서 나타납니다.
  • fields.E901: ``CommaSeparatedIntegerField``는 이전 마이그레이션 지원을 제외하고 제거되었습니다.
  • fields.W902: ``FloatRangeField``는 더 이상 사용되지 않으며 Django 3.1에서 제거됩니다. 이 검사는 Django 2.2 및 3.0에서 나타납니다.
  • fields.W903: ``NullBooleanField``는 더 이상 사용되지 않습니다. 이에 대한 지원(이전 마이그레이션 제외)은 Django 4.0에서 제거됩니다. 이 검사는 Django 3.1 및 3.2에서 나타납니다.
  • fields.E903: 이전 마이그레이션 지원을 제외하고 ``NullBooleanField``가 제거되었습니다.
  • fields.W904: ``django.contrib.postgres.fields.JSONField``는 더 이상 사용되지 않습니다. 이에 대한 지원(이전 마이그레이션 제외)은 Django 4.0에서 제거됩니다. 이 검사는 Django 3.1 및 3.2에서 나타납니다.
  • fields.E904: ``django.contrib.postgres.fields.JSONField``는 이전 마이그레이션 지원을 제외하고 제거되었습니다.
  • fields.W905: ``django.contrib.postgres.fields.CICharField``는 더 이상 사용되지 않습니다. Django 5.1에서는 이에 대한 지원(이전 마이그레이션을 제외하고) 이 제거될 예정입니다.
  • fields.W906: django.contrib.postgres.fields.CIEmailField 는 더 이상 사용되지 않습니다. Django 5.1에서는 이에 대한 지원(이전 마이그레이션을 제외하고) 이 제거될 예정입니다.
  • fields.W907: django.contrib.postgres.fields.CITextField 는 더 이상 사용되지 않습니다. Django 5.1에서는 이에 대한 지원(이전 마이그레이션을 제외하고) 이 제거될 예정입니다.

파일 필드

  • fields.E200: ``unique``는 ``FileField``에 대한 유효한 인수가 아닙니다. 이 검사는 Django 1.11*에서 제거되었습니다.
  • fields.E201: ``primary_key``는 ``FileField``에 대한 유효한 인수가 아닙니다.
  • fields.E202: FileField``의 ``upload_to 인자는 절대 경로가 아닌 상대 경로여야 합니다.
  • fields.E210: Pillow가 설치되지 않았기 때문에 ``ImageField``를 사용할 수 없습니다.

모델

  • models.E001: <swappable>``은 ``app_label.app_name 형식이 아닙니다.
  • models.E002: ``<SETTING>``은 설치되지 않았거나 추상적인 ``<model>``를 참조합니다.
  • models.E003: 모델은 중간 모델 ``<app_label>.<model>``를 통해 두 개의 동일한 다대다 관계를 가집니다.
  • models.E004: ``id``는 필드가 ``primary_key=True``도 설정한 경우에만 필드 이름으로 사용할 수 있습니다.
  • models.E005: 상위 모델 <model>``의 ``<field name> 필드가 상위 모델 <model>``의 ``<field name> 필드와 충돌합니다.
  • models.E006: 필드 ``<field name>``이 모델 ``<model>``의 필드 ``<field name>``와 충돌합니다.
  • models.E007: 필드 ``<field name>``에는 다른 필드에서 사용하는 열 이름 ``<column name>``가 있습니다.
  • models.E008: ``index_together``는 리스트 혹은 튜플이어야 합니다.
  • models.E009: 모든 index_together 요소들은 리스트이거나 튜플이어야 합니다.
  • models.E010: ``unique_together``는 반드시 리스트 이거나 투플이어야 합니다.
  • models.E011: 모든 unique_together 요소는 목록 또는 튜플이어야 합니다.
  • models.E012: ``constraints/indexes/index_together/unique_together``는 존재하지 않는 필드 ``<field name>``을 참조합니다.
  • models.E013: constraints/indexes/index_together/unique_together``는 ``ManyToManyField <field name>``을 참조하지만 ``ManyToManyFields는 해당 옵션에 대해 지원되지 않습니다.
  • models.E014: ``ordering``은 (하나의 필드로만 주문하려는 경우에도) 튜플 또는 리스트이어야 합니다.
  • models.E015: ``ordering``은 존재하지 않는 필드, 관련 필드 또는 조회 ``<field name>``을 나타냅니다.
  • models.E016: constraints/indexes/index_together/unique_together``는 모델 ``<model>``에 로컬이 아닌 ``<field_name> 필드를 참조합니다.
  • models.E017: 프록시 모델 ``<model>``에는 모델 필드가 포함되어 있습니다.
  • models.E018: 자동 생성된 열 이름이 필드 ``<field>``에 비해 너무 깁니다. 데이터베이스 ``<alias>``의 최대 길이는 ``<maximum length>``입니다.
  • models.E019: M2M 필드 ``<M2M field>``에 대해 자동 생성된 열 이름이 너무 깁니다. 데이터베이스 ``<alias>``의 최대 길이는 ``<maximum length>``입니다.
  • models.E020: <model>.check() 클래스 메서드가 현재 재정의되었습니다.
  • models.E021: ordering``order_with_respect_to``는 함께 사용할 수 없습니다.
  • models.E022: ``<function>``에는 ``<app label>.<model>``에 대한 지연 참조가 포함되어 있지만 앱 ``<app label>``는 설치되지 않았거나 모델 ``<model>``를 제공하지 않습니다.
  • models.E023: 모델 이름 ``<model>``은 쿼리 조회 구문과 충돌하므로 밑줄로 시작하거나 끝날 수 없습니다.
  • models.E024: 모델 이름 ``<model>``은 쿼리 조회 구문과 충돌하므로 이중 밑줄을 포함할 수 없습니다.
  • models.E025: 속성 ``<property name>``이 관련 필드 접근자와 충돌합니다.
  • models.E026: 모델은 ``primary_key=True``인 필드를 두 개 이상 가질 수 없습니다.
  • models.W027: ``<database>``은 검사 제약 조건을 지원하지 않습니다.
  • models.E028: db_table <db_table>``은 여러 모델에서 사용됩니다: ``<model list>.
  • models.E029: 인덱스 이름 ``<index>``은 모델 ``<model>``에 고유하지 않습니다.
  • models.E030: 인덱스 이름 <index>``은 모델 간에 고유하지 않습니다: ``<model list>.
  • models.E031: 구속조건 이름 ``<constraint>``은 모델 ``<model>``에 대해 고유하지 않습니다.
  • models.E032: 제약 조건 이름 <constraint>``은 모델 간에 고유하지 않습니다: ``<model list>.
  • models.E033: 인덱스 이름 ``<index>``은 밑줄이나 숫자로 시작할 수 없습니다.
  • models.E034: 인덱스 이름 <index>``은 ``<max_length> 문자보다 길 수 없습니다.
  • models.W035: db_table <db_table>``은 여러 모델에서 사용됩니다: ``<model list>.
  • models.W036: ``<database>``은 조건이 있는 고유 제약 조건을 지원하지 않습니다.
  • models.W037: ``<database>``은 조건이 있는 인덱스를 지원하지 않습니다.
  • models.W038: ``<database>``은 지연 가능한 고유 제약 조건을 지원하지 않습니다.
  • models.W039: ``<database>``은 키가 아닌 열이 있는 고유 제약 조건을 지원하지 않습니다.
  • models.W040: ``<database>``은 키가 아닌 열이 있는 인덱스를 지원하지 않습니다.
  • models.E041: ``constraints``는 조인된 필드 ``<field name>``을 참조합니다.
  • models.W042: 기본 키 유형을 정의하지 않을 때 사용되는 자동 생성 기본 키(기본적으로 django.db.models.AutoField).
  • models.W043: ``<database>``은 식에 대한 인덱스를 지원하지 않습니다.
  • models.W044: ``<database>``은 식에 대한 고유 제약 조건을 지원하지 않습니다.
  • models.W045: 검사 제약 조건 <constraint>``에는 ``RawSQL() 표현식이 포함되어 있으며 모델 full_clean() 동안 유효성이 검사되지 않습니다.
  • models.W046: <database> 는 테이블에 대한 설명을 지원하지 않습니다.(db_table_comment).
  • models.W047: <database> does not support unique constraints with nulls distinct.

보안

보안 검사는 사이트를 안전하게 만들지 않습니다. 코드를 감사하거나, 침입 탐지를 수행하거나, 특히 복잡한 작업을 수행하지 않습니다. 오히려, 사이트의 보안을 개선하는 데 도움이 될 수 있는 자동화된 간단한 체크리스트를 수행하는 데 도움이 됩니다.

이러한 검사 중 일부는 특정 배포 구성에 적합하지 않을 수 있습니다. 예를 들어 로드 밸런서에서 HTTP에서 HTTPS로의 리디렉션을 수행하는 경우 :setting:`SECURE_SSL_REDIRECT`를 활성화하지 않은 것에 대해 지속적으로 경고를 받으면 짜증이 날 것입니다. 불필요한 검사를 중지하려면 :setting:`SILENCED_SYSTEM_CHECKS`를 사용하세요.

check --deploy 옵션을 사용하는 경우, 다음 검사가 실행됩니다:

  • security.W001: MIDDLEWARE`에 :class:`django.middleware.security.SecurityMiddleware`가 없으므로 :setting:`SECURE_HSTS_SECONDS, SECURE_CONTENT_TYPE_NOSNIFF, :setting :SECURE_REFERRER_POLICY, SECURE_CROSS_ORIGIN_OPENER_POLICYSECURE_SSL_REDIRECT 설정은 적용되지 않습니다.
  • security.W002: MIDDLEWARE`에 :class:`django.middleware.clickjacking.XFrameOptionsMiddleware`가 없으므로 페이지가 `’x-frame-options’``와 함께 제공되지 않습니다. 헤더. 사이트를 프레임으로 제공해야 하는 타당한 이유가 없는 한, 이 헤더를 활성화하여 클릭재킹 공격을 방지하는 것이 좋습니다.
  • security.W003: 현재 미들웨어(django.middleware.csrf.CsrfViewMiddlewareMIDDLEWARE 안에 없습니다)를 통한 Django에 내재된 사이트 간 요청 위조 보호 기능을 사용하지 않는 것 같습니다. 미들웨어를 활성화하는 것이 허점을 남기지 않도록 하는 가장 안전한 방법입니다.
  • security.W004: SECURE_HSTS_SECONDS 설정에 대한 값을 설정하지 않았습니다. 전체 사이트가 SSL을 통해서만 제공되는 경우 값을 설정하고 :ref:`HTTP Strict Transport Security <http-strict-transport-security>`을 활성화하는 것이 좋습니다. 설명서를 먼저 읽으십시오. 부주의하게 HSTS를 활성화하면 돌이킬 수 없는 심각한 문제가 발생할 수 있습니다.
  • security.W005: SECURE_HSTS_INCLUDE_SUBDOMAINS 설정을 ``True``로 설정하지 않았습니다. 이것이 없으면, 귀하의 사이트는 하위 도메인에 대한 안전하지 않은 연결을 통한 공격에 잠재적으로 취약합니다. 도메인의 모든 하위 도메인이 SSL을 통해서만 제공되어야 한다고 확신하는 경우에만 ``True``로 설정하십시오.
  • security.W006: SECURE_CONTENT_TYPE_NOSNIFF 설정이 ``True``로 설정되지 않았으므로 페이지가 ``’X-Content-Type-Options: nosniff’``와 함께 제공되지 않습니다. 헤더. 브라우저가 콘텐츠 유형을 잘못 식별하지 않도록 이 헤더를 활성화하는 것을 고려해야 합니다.
  • security.W007: SECURE_BROWSER_XSS_FILTER 설정이 True``로 설정되어 있지 않으므로 페이지에 ``'X-XSS-Protection: 1; mode=block' 헤더. 브라우저의 XSS 필터링을 활성화하고 XSS 공격을 방지하려면 이 헤더를 활성화하는 것을 고려해야 합니다. 이 검사는 Django 3.0에서 * ``X-XSS-Protection`` *헤더가 최신 브라우저에서 더 이상 인정되지 않으므로 제거되었습니다.
  • security.W008: SECURE_SSL_REDIRECT 설정이 ``True``로 설정되지 않았습니다. SSL 및 비 SSL 연결 모두에서 사이트를 사용할 수 있어야 하는 경우가 아니면 이 설정을 ``True``로 설정하거나 로드 밸런서 또는 리버스 프록시 서버를 구성하여 모든 연결을 HTTPS로 리디렉션할 수 있습니다.
  • security.W009: SECRET_KEY`의 문자가 50자 미만이거나, 고유 문자가 5자 미만이거나, Django에서 자동으로 생성되었음을 나타내는 `’django-insecure-‘`` 접두사가 붙습니다. 긴 무작위 값을 생성하십시오. 그렇지 않으면 Django의 보안에 중요한 많은 기능이 공격에 취약합니다.
  • security.W010: 설정:`INSTALLED_APPS`에 :mod:`django.contrib.sessions`가 있지만, :setting:`SESSION_COOKIE_SECURE`를 ``True``로 설정하지 않았습니다. :setting:`SESSION_COOKIE_SECURE`를 ``True``로 설정하면 네트워크 트래픽 스니퍼가 사용자 세션을 하이재킹하기가 더 어려워집니다.
  • security.W011: :setting:`MIDDLEWARE`에 :class:`django.contrib.sessions.middleware.SessionMiddleware`가 있지만 :setting:`SESSION_COOKIE_SECURE`를 ``True``로 설정하지 않았습니다. 보안 전용 세션 쿠키를 사용하면 네트워크 트래픽 스니퍼가 사용자 세션을 하이재킹하기가 더 어려워집니다.
  • security.W012: :setting:`SESSION_COOKIE_SECURE`가 ``True``로 설정되지 않았습니다. 보안 전용 세션 쿠키를 사용하면 네트워크 트래픽 스니퍼가 사용자 세션을 하이재킹하기가 더 어려워집니다.
  • security.W013: :setting:NSTALLED_APPS`에 django.contrib.sessions가 있지만 설정:SESSION_COOKIE_HTTPONLY`를 ``True``로 설정하지 않았습니다. ``HttpOnly` 세션 쿠키를 사용하면 크로스 사이트 스크립팅 공격이 사용자 세션을 하이재킹하는 것이 더 어려워집니다.
  • security.W014: MIDDLEWARE`에 :class:`django.contrib.sessions.middleware.SessionMiddleware`가 있지만 :setting:`SESSION_COOKIE_HTTPONLY`를 ``True``로 설정하지 않았습니다. . ``HttpOnly` 세션 쿠키를 사용하면 크로스 사이트 스크립팅 공격이 사용자 세션을 하이재킹하는 것이 더 어려워집니다.
  • security.W015: SESSION_COOKIE_HTTPONLY`가 ``True``로 설정되지 않았습니다. ``HttpOnly` 세션 쿠키를 사용하면 크로스 사이트 스크립팅 공격이 사용자 세션을 하이재킹하는 것이 더 어려워집니다.
  • security.W016: :setting:`CSRF_COOKIE_SECURE`가 ``True``로 설정되지 않았습니다. 보안 전용 CSRF 쿠키를 사용하면 네트워크 트래픽 스니퍼가 CSRF 토큰을 훔치기가 더 어려워집니다.
  • security.W017: CSRF_COOKIE_HTTPONLY`가 ``True``로 설정되지 않았습니다. ``HttpOnly` CSRF 쿠키를 사용하면 교차 사이트 스크립팅 공격이 CSRF 토큰을 훔치기가 더 어려워집니다. 이 검사는 Django 1.11에서 CSRF_COOKIE_HTTPONLY 설정이 실질적인 이점을 제공하지 않기 때문에 제거되었습니다.
  • security.W018: 배포 시 :setting:`DEBUG`를 ``True``로 설정하면 안 됩니다.
  • security.W019: MIDDLEWARE`에 :class:`django.middleware.clickjacking.XFrameOptionsMiddleware`가 있지만 :setting:`X_FRAME_OPTIONS`가 `’DENY’``로 설정되지 않았습니다. 귀하의 사이트가 프레임의 다른 부분을 제공해야 할 타당한 이유가 없다면 ``’DENY’’로 변경해야 합니다.
  • security.W020: :setting:`ALLOWED_HOSTS`는 배포 시 비어 있으면 안 됩니다.
  • security.W021: SECURE_HSTS_PRELOAD 설정을 ``True``로 설정하지 않았습니다. 이것이 없으면 사이트를 브라우저 사전 로드 목록에 제출할 수 없습니다.
  • security.W022: SECURE_REFERRER_POLICY 설정을 지정하지 않았습니다. 이것이 없으면 귀하의 사이트는 Referrer-Policy 헤더를 보내지 않습니다. 사용자 개인 정보를 보호하려면 이 헤더를 활성화하는 것을 고려해야 합니다.
  • security.E023: SECURE_REFERRER_POLICY 설정을 잘못된 값으로 설정했습니다.
  • security.E024: SECURE_CROSS_ORIGIN_OPENER_POLICY 설정을 잘못된 값으로 설정했습니다.
  • security.W025: SECRET_KEY_FALLBACKS[n] <SECRET_KEY_FALLBACKS>`의 문자가 50자 미만이거나 고유 문자가 5자 미만이거나 Django에 의해 자동으로 생성되었음을 나타내는 `’django-insecure-‘`` 접두사가 붙어 있습니다. 길고 임의의 값을 생성하십시오. 그렇지 않으면 Django의 보안에 중요한 많은 기능이 공격에 취약합니다.

다음 검사는 보안 관련 설정이 올바르게 구성되었는지 확인합니다:

  • security.E100: DEFAULT_HASHING_ALGORITHM``은 ``'sha1' 또는 ``’sha256’``이어야 합니다. 이 검사는 Django 3.1 및 3.2에서 나타납니다.
  • security.E101: CSRF 실패 뷰 ``’path.to.view’``가 올바른 수의 인수를 사용하지 않습니다.
  • security.E102: CSRF 실패 뷰 ``’path.to.view’``를 가져올 수 없습니다.

시그널

  • signals.E001: <handler>``이 발신자 ``<app label>.<model>``에 대한 지연 참조로 ``<signal> 시그널에 연결되었지만, 앱 ``<app label>``가 설치되지 않았거나, 모델 `<model>`을 제공하지 않습니다.

템플릿

다음 검사는 TEMPLATES 설정이 올바르게 구성되었는지 확인합니다:

  • templates.E001: TEMPLATES`에 `’APP_DIRS’: True``가 있지만 OPTIONS``에 ``'loaders'``도 지정합니다. ``APP_DIRS``를 제거하거나 ``'loaders' 옵션을 제거하십시오.
  • templates.E002: string_if_invalid in TEMPLATES OPTIONS <TEMPLATES-OPTIONS>`은 문자열이어야 하지만 다음과 같았습니다: ``{value}` ({type}) .
  • templates.E003:<name>``은 여러 템플릿 태그 모듈에 사용됩니다: ``<module list>. *이 검사는 Django 4.1.2*에서 *``templates.W003``으로 변경되었습니다.
  • templates.W003:<name>``은 여러 템플릿 태그 모듈에 사용됩니다: ``<module list>.

번역

변환 구성에서 다음 검사가 수행됩니다:

  • translation.E001: LANGUAGE_CODE 설정에 잘못된 값을 제공했습니다: <value>.
  • translation.E002: LANGUAGES 설정: ``<value>``에 잘못된 언어 코드를 제공했습니다.
  • translation.E003: LANGUAGES_BIDI 설정: ``<value>``에 잘못된 언어 코드를 제공했습니다.
  • translation.E004: LANGUAGES 설정에 없는 값을 LANGUAGE_CODE 설정에 제공했습니다.

URL들

URL 구성에서 다음 검사가 수행됩니다:

  • urls.W001: URL 패턴 ``<pattern>``은 ``$``로 끝나는 ``route``와 함께 :func:`~django.urls.include`를 사용합니다. URL을 포함한 문제를 피하기 위해 ``route``에서 달러 기호를 제거하십시오.
  • urls.W002: URL 패턴 ``<pattern>``에 ``/``로 시작하는 ``route``가 있습니다. 이 슬래시는 불필요하므로 제거하십시오. 이 패턴이 include() 패턴 뒤에 ``/``가 있는지 확인하십시오.
  • urls.W003: URL 패턴 ``<pattern>``에 ``:``을 포함하는 ``이름``이 있습니다. 모호한 네임스페이스 참조를 방지하려면 콜론을 제거하십시오.
  • urls.E004: URL 패턴 ``<pattern>``이 잘못되었습니다. ``urlpatterns``가 path() 및/또는 re_path() 인스턴스의 목록인지 확인하십시오.
  • urls.W005: URL 네임스페이스 ``<namespace>``이 고유하지 않습니다. 이 네임스페이스의 모든 URL을 되돌릴 수 없을 수도 있습니다.
  • urls.E006: MEDIA_URL/ STATIC_URL 설정은 슬래시로 끝나야 합니다.
  • urls.E007: 사용자 지정 handlerXXX 보기 ``’path.to.view’``가 올바른 수의 인수를 사용하지 않습니다(…).
  • urls.E008: 사용자 지정 handlerXXX 보기 ``’path.to.view’``를 가져올 수 없습니다.
  • urls.E009: URL 패턴 <pattern>``에 유효하지 않은 보기가 있습니다. ``<view> 대신 ``<view>.as_view()``를 전달하십시오.
  • urls.W010: Your URL pattern <pattern> has an unmatched <angle bracket>.

“contrib” 앱 체크들

관리자

관리 검사는 모두 admin 태그의 일부로 수행됩니다.

관리 사이트에 등록된 :class:`~django.contrib.admin.ModelAdmin`(또는 하위 클래스)에서 다음 검사가 수행됩니다:

  • admin.E001: raw_id_fields 값은 리스트 또는 튜플이어야 합니다.
  • admin.E002: raw_id_fields[n] 값은 <model> 필드가 아닌 ``<field name>``을 나타냅니다.
  • admin.E003: raw_id_fields[n] 값은 외래 키 또는 다대다 필드여야 합니다.
  • admin.E004: fields 값은 리스트 또는 튜플이어야 합니다.
  • admin.E005: ``fieldsets``와 ``fields``가 모두 지정되었습니다.
  • admin.E006: fields 값에 중복 필드가 포함되어 있습니다.
  • admin.E007: fieldsets 값은 리스트 또는 튜플이어야 합니다.
  • admin.E008: fieldsets[n] 값은 리스트 또는 튜플이어야 합니다.
  • admin.E009: ``fieldsets[n]``의 값은 길이가 2여야 합니다.
  • admin.E010: fieldsets[n][1] 값은 사전이어야 합니다.
  • admin.E011: fieldsets[n][1] 값은 fields 키를 포함해야 합니다.
  • admin.E012: ``fieldsets[n][1]``에 중복된 필드가 있습니다.
  • admin.E013: The value of fields[n]/filter_horizontal[n]/filter_vertical[n]/fieldsets[n][m] cannot include the ManyToManyField <field name>, because that field manually specifies a relationship model.
  • admin.E014: exclude 값은 리스트 또는 튜플이어야 합니다.
  • admin.E015: exclude 값에 중복 필드가 포함되어 있습니다.
  • admin.E016: form 값은 ``BaseModelForm``에서 상속되어야 합니다.
  • admin.E017: filter_vertical 값은 리스트 또는 튜플이어야 합니다.
  • admin.E018: filter_horizontal 값은 리스트 또는 튜플이어야 합니다.
  • admin.E019: filter_vertical[n]/filter_horizontal[n] 값은 <model> 필드가 아닌 ``<field name>``을 참조합니다.
  • admin.E020: filter_vertical[n]/filter_horizontal[n] 값은 다대다 필드여야 합니다.
  • admin.E021: radio_fields 값은 사전이어야 합니다.
  • admin.E022: radio_fields 값은 ``<model>``의 필드가 아닌 ``<field name>``을 참조합니다.
  • admin.E023: radio_fields 값은 ForeignKey 인스턴스가 아닌 <field name>``을 참조하며 ``choices 정의가 없습니다.
  • admin.E024: radio_fields[<field name>] 값은 admin.HORIZONTAL 또는 ``admin.VERTICAL``이어야 합니다.
  • admin.E025: view_on_site 값은 호출 가능하거나 부울 값이어야 합니다.
  • admin.E026: prepopulated_fields 값은 사전이어야 합니다.
  • admin.E027: prepopulated_fields 값은 <model> 필드가 아닌 ``<field name>``을 참조합니다.
  • admin.E028: prepopulated_fields 값은 <field name>``을 참조하며, ``DateTimeField, ForeignKey, OneToOneField 또는 ManyToManyField 필드가 아니어야 합니다.
  • admin.E029: prepopulated_fields[<field name>] 값은 목록 또는 튜플이어야 합니다.
  • admin.E030: prepopulated_fields 값은 ``<model>``의 필드가 아닌 ``<field name>``을 참조합니다.
  • admin.E031: ordering 값은 리스트 또는 튜플이어야 합니다.
  • admin.E032: ordering 값에는 무작위 순서 마커 ``?``가 있지만, 다른 필드도 포함합니다.
  • admin.E033: ordering 값은 <model> 필드가 아닌 ``<field name>``을 나타냅니다.
  • admin.E034: readonly_fields 값은 목록 또는 튜플이어야 합니다.
  • admin.E035: The value of readonly_fields[n] refers to <field_name>, which is not a callable, an attribute of <ModelAdmin class>, or an attribute of <model>.
  • admin.E036: autocomplete_fields 값은 리스트 또는 튜플이어야 합니다.
  • admin.E037: autocomplete_fields[n] 값은 <model> 필드가 아닌 ``<field name>``을 참조합니다.
  • admin.E038: autocomplete_fields[n] 값은 외래 키 또는 다대다 필드여야 합니다.
  • admin.E039: 모델 ``<model>``에 대한 관리자는 ``<modeladmin>.autocomplete_fields``에 의해 참조되도록 등록되어야 합니다.
  • admin.E040: ``<modeladmin>``은 ``<other_modeladmin>.autocomplete_fields``에 의해 참조되기 때문에, ``search_fields``를 정의해야 합니다.

모델 관리자

관리 사이트에 등록된 :class:`~django.contrib.admin.ModelAdmin`에서 다음 검사가 수행됩니다:

  • admin.E101: save_as 값은 부울이어야 합니다.
  • admin.E102: save_on_top 값은 부울이어야 합니다.
  • admin.E103: inlines 값은 리스트 또는 튜플이어야 합니다.
  • admin.E104: ``<InlineModelAdmin class>``은 ``InlineModelAdmin``에서 상속해야 합니다.
  • admin.E105: <InlineModelAdmin class>``에는 ``model 속성이 있어야 합니다.
  • admin.E106: <InlineModelAdmin class>.model 값은 ``Model``이어야 합니다.
  • admin.E107: list_display 값은 리스트 또는 튜플이어야 합니다.
  • admin.E108: list_display[n]``의 값은 콜러블이 아닌 ``<label>, 또는 ``<ModelAdmin class>``의 속성 또는 ``<model>``의 속성이나 메서드를 참조합니다.
  • admin.E109: The value of list_display[n] must not be a many-to-many field or a reverse foreign key.
  • admin.E110: list_display_links 값은 리스트, 튜플 또는 ``None``이어야 합니다.
  • admin.E111: list_display_links[n] 값은 ``list_display``에 정의되지 않은 ``<label>``을 참조합니다.
  • admin.E112: list_filter 값은 리스트 또는 튜플이어야 합니다.
  • admin.E113: ``list_filter[n]``의 값은 ``ListFilter``에서 상속되어야 합니다.
  • admin.E114: ``list_filter[n]``의 값은 ``FieldListFilter``에서 상속되어야 합니다.
  • admin.E115: ``list_filter[n][1]``의 값은 ``FieldListFilter``에서 상속되어야 합니다.
  • admin.E116: list_filter[n] 의 값은 필드를 참조하지 않는 ``<label>``을 참조합니다.
  • admin.E117: `list_select_related``의 값은 부울, 튜플 또는 리스트여야 합니다.
  • admin.E118: ``list_per_page``의 값은 정수여야 합니다.
  • admin.E119: ``list_max_show_all``의 값은 정수여야 합니다.
  • admin.E120: ``list_editable``의 값은 리스트 또는 튜플이어야 합니다.
  • admin.E121: ``list_editable[n]``의 값은 ``<model>``의 필드가 아닌 ``<label>``을 나타냅니다.
  • admin.E122: ``list_editable[n]``의 값은 ``list_display``에 포함되지 않은 ``<label>``을 참조합니다.
  • admin.E123: list_editable[n]``의 값은 ``list_editable``과 ``list_display_links 모두에 있을 수 없습니다.
  • admin.E124: list_editable[n]``의 값은 ``list_display (<label>)의 첫 번째 필드를 참조하며, ``list_display_links``를 설정하지 않으면 사용할 수 없습니다.
  • admin.E125: ``list_editable[n]``의 값은 관리자를 통해 편집할 수 없는 ``<field name>``을 참조합니다.
  • admin.E126: ``search_fields``의 값은 리스트 또는 튜플이어야 합니다.
  • admin.E127: ``date_hierarchy``의 값은 필드를 참조하지 않는 ``<field name>``를 참조합니다.
  • admin.E128: date_hierarchy``의 값은 ``DateField 혹은 ``DateTimeField``여야한다.
  • admin.E129: ``<modeladmin>``는 ``<action>``동작에 대한 ``has_<foo>_permission()``메서드를 정의해야합니다.
  • admin.E130: ``<modeladmin>``에 정의된 동작의 ``__name__``특성은 고유해야 합니다. 이름 ``<name>``는 고유하지 않습니다.

InlineModelAdmin

다음 검사는 :class:`~django.contrib.admin.ModelAdmin`에 인라인으로 등록된 모든 :class:`~django.contrib.admin.InlineModelAdmin`에 대해 수행됩니다.

  • admin.E201: 필드 ``<field name>``은 상위 모델``<app_label>.<model>``의 외부 키이기 때문에 제외할 수 없습니다.
  • admin.E202: <model> has no ForeignKey to <parent model>./ <model> has more than one ForeignKey to <parent model>. You must specify a fk_name attribute.
  • admin.E203: ``extra``의 값은 정수여야 합니다.
  • admin.E204: ``max_num``의 값은 정수여야합니다.
  • admin.E205: ``min_num``의 값은 정수여야합니다.
  • admin.E206: ``formset``의 값은 ``BaseModelFormSet``에서 상속되어야 합니다.

GenericInlineModelAdmin

다음 검사는 :class:`~django.contrib.admin.ModelAdmin`에 인라인으로 등록된 모든 :class:`~django.contrib.contenttypes.admin.GenericInlineModelAdmin`에 대해 수행됩니다.

  • admin.E301: ``’ct_field’````<model>``의 필드가 아닌 ``<label>``을 참조합니다.
  • admin.E302: ``’ct_fk_field’````<model>``의 필드가 아닌 ``<label>``을 참조합니다.
  • admin.E303: ``<model>``에는 ``GenericForeignKey``가 없습니다.
  • admin.E304: ``<model>``에는 내용 유형 필드 ``<field name>``와 객체 ID 필드 ``<field name>``을 사용하는 ``GenericForeignKey``가 없습니다.

AdminSite

디폴트 AdminSite:에 대해 다음 검사가 수행됩니다.

auth

  • auth.E001: ``REQUIRED_FIELDS``는 리스트 혹은 튜플이어야 합니다.
  • auth.E002: 사용자 지정 모델에 대해 ``USERNAME_FIELD``로 명명된 필드는 ``REQUIRED_FIELDS``에 포함되어서는 안 됩니다.
  • auth.E003: ``<field>``은 ``USERNAME_FIELD``로 명명되므로 고유해야 합니다.
  • auth.W004: ``<field>``은 ``USERNAME_FIELD``로 명명되지만 고유한 이름은 아닙니다.
  • auth.E005: The permission codenamed <codename> clashes with a builtin permission for model <model>.
  • auth.E006: The permission codenamed <codename> is duplicated for model <model>.
  • auth.E007: The verbose_name of model <model> must be at most 244 characters for its builtin permission names to be at most 255 characters.
  • auth.E008: The permission named <name> of model <model> is longer than 255 characters.
  • auth.C009: <User model>.is_anonymous must be an attribute or property rather than a method. Ignoring this is a security issue as anonymous users will be treated as authenticated!
  • auth.C010: <User model>.is_authenticated must be an attribute or property rather than a method. Ignoring this is a security issue as anonymous users will be treated as authenticated!
  • auth.E011: The name of model <model> must be at most 93 characters for its builtin permission names to be at most 100 characters.
  • auth.E012: The permission codenamed <codename> of model <model> is longer than 100 characters.

contenttypes

모델에 GenericForeignKey 또는 GenericRelation:가 포함된 경우 다음 검사가 수행됩니다.

  • contenttypes.E001: GenericForeignKey 객체 ID는 존재하지 않는 필드``<field>``을 참조합니다.
  • contenttypes.E002: GenericForeignKey 내용 유형은 존재하지 않는 필드 ``<field>``을 참조합니다.
  • contenttypes.E003: ``<field>``은 ``ForeignKey``가 아니다.
  • contenttypes.E004: ``<field>``은 ``contenttypes.ContentType``에 대한``ForeignKey``가 아닙니다.
  • contenttypes.E005: 모델 이름은 최대 100자여야 합니다.

postgres

django.contrib.postgres model fields:에 대해 다음 검사가 수행됩니다.

  • postgres.E001: Base field for array has errors: …
  • postgres.E002: 배열의 기본 필드는 관련 필드일 수 없습니다.
  • postgres.E003: <field> default should be a callable instead of an instance so that it’s not shared between all field instances. This check was changed to fields.E010 in Django 3.1.
  • postgres.W004: Base field for array has warnings: …

sites

다음 점검은 CurrentSiteManager:를 사용하여 모든 모델에서 수행됩니다.

  • sites.E001: ``CurrentSiteManager``에서 ``<field name>``이라는 이름의 필드를 찾을 수 없습니다.
  • sites.E002: ``CurrentSiteManager``는 외부 키 또는 다대다 필드가 아니므로 ``<field>``을 사용할 수 없습니다.

다음 검사를 통해 :mod:`django.contrib.sites`가 확인됩니다.

  • sites.E101: SITE_ID 설정은 정수여야 합니다.

staticfiles

다음 검사를 통해 :mod:`django.contrib.staticfiles`가 올바르게 구성되어 있는지 확인합니다:

  • staticfiles.E001: :setting:`STATICFILES_DIRS`설정은 튜플 또는 목록이 아닙니다.
  • staticfiles.E002: STATICFILES_DIRS 설정에는 :setting:`STATIC_ROOT`설정이 포함되지 않아야 합니다.
  • staticfiles.E003: STATICFILES_DIRS 설정의 접두사 ``<prefix>``은 슬래시로 끝날 수 없습니다.
  • staticfiles.W004: :setting:`STATICFILES_DIRS`의 디렉토리 ``<directory>``은 존재하지 않습니다.
  • staticfiles.E005: The STORAGES setting must define a staticfiles storage.