일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Python
- 코딩테스트
- BAEKJOON
- vuejs
- 코테
- 코드품앗이
- DFS와BFS
- android
- cos pro 1급
- Flutter
- issue
- C++
- codingtest
- 개발
- AndroidStudio
- Algorithm
- cos pro
- 동적계획법
- django
- DFS
- 알고리즘
- 안드로이드스튜디오
- cos
- Vue
- 백준
- 파이썬
- 분할정복
- 안드로이드
- 동적계획법과최단거리역추적
- DART
- Today
- Total
Development Artist
[웹 서비스 A-Z][Django] #8 Mechanism 본문
지난 시간에는 Python 프로젝트를 만들고 그 안에 Django를 설치했습니다.
그리고 Django 서버를 구동까지 해보았습니다.
이번 시간에는 'python manage.py runserver' 를 치면 어떻게 동작하는지 그 과정을 살펴보도록 하겠습니다.
우선 우리는 manage.py를 살펴볼 필요가 있습니다.
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_server.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
다음은 manage.py 의 코드입니다. setdefault에 보시면 ‘DJANGO_SETTINGS_MODULE’ 이라는 key에 ‘[project name].settings’ value로 셋업하겠다는 의미를 볼 수 있습니다.
(setdefault를 추적하면 2개의 파라미터가 key-value 관계인 것을 확인할 수 있습니다.)
자 그렇다면 이제 우리는 무엇을 봐야 할까요?
맞습니다. [project name].settings를 보아야 겠습니다. 해당 settings 파일을 가지고서 Django 서버를 구동하니까요.
cat settings.py | egrep -v '^[[:space:]]*(#.*)?$'
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = 'django-insecure-9ol#g+_*+fxnt(r3v^@iq9d8lr3zkwoa-zd+u!6snlmnb8h&62'
**DEBUG = True**
**ALLOWED_HOSTS = []**
**INSTALLED_APPS** = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
**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',
]
**ROOT_URLCONF** = 'test_server.urls'
**TEMPLATES** = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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** = 'test_server.wsgi.application'
**DATABASES** = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
**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',
},
]
**LANGUAGE_CODE** = 'en-us'
**TIME_ZONE** = 'UTC'
USE_I18N = True
USE_TZ = True
**STATIC_URL** = 'static/'
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
- DEBUG : 기본 True로 개발시 로그를 남깁니다. 상용시 False로 설정.
- ALLOWED_HOSTS : 서버에 접근하는 host를 정합니다. 화이트리스트 기반입니다.
- INSTALLED_APPS : pip으로 설치하는 패키지 및 개발한 App을 적어주는 곳입니다.
- MIDDLEWARE : Django의 요청/응답 처리에 연결되는 프레임워크. 미들웨어는 다른 미들웨어에 의존성을 가질 수 있기 때문에 순서가 의미가 있습니다.
- 'contrib.sessions.middleware.SessionMiddleware' 이 실행 된 후에 'contrib.auth.middleware.AuthenticationMiddleware' 를 실행할 수 있습니다. 따라서 SessionMiddleware가 더 위에 선언 되어야 합니다.
- ROOT_URLCONF : 최상위 url 의 경로를 지정해줍니다.
- TEMPLATES : Django Template Language로써, 사용되는 html 파일을 지정하는 부분.
- WSGI_APPLICATION : WSGI 설정을 하는 부분.
- DATABASES : 데이터베이스 설정.
- AUTH_PASSWORD_VALIDATORS : 유효성 검사를 하는 부분.
- UserAttributeSimilarityValidator : 비밀번호와 사용자 속성 집합 간의 유사성을 확인합니다.
- MinimumLengthValidator : 비밀번호가 최소 길이를 충족하는지 확인합니다. 이 유효성 검사기는 사용자 지정 옵션으로 구성됩니다. 이제 최소 길이가 기본 8자 대신 9자여야 합니다.
- CommonPasswordValidator : 일반적인 비밀번호 목록에 해당 비밀번호가 있는지 확인합니다. 기본적으로 포함된 20,000개의 일반 암호 목록과 비교합니다.
- NumericPasswordValidator : 비밀번호가 완전히 숫자가 아닌지 확인합니다.
- LANGUAGE_CODE : 언어 설정.
- TIME_ZONE : 시간대 설정.
- STATIC_URL : 정적 파일들을 가진 경로를 지정해주는 곳. (HTML, CSS, Javascript)
이렇게 장고의 기본적인 Mechanism을 배워보았습니다.
다음 시간에는, 조금 더 상세히 디자인 패턴을 가지고 와서 Mechanism과 함께 Django가 어떤 구조로 디자인 되는지 살펴보도록 하겠습니다.
Additional
위에서 WSGI에 대해 궁금하신 분들이 있을 것 같습니다.
WSGI는 Web Server Gateway Interface의 약자로, 웹 서버와 파이썬 웹 어플리케이션 간의 인터페이스 역할을 합니다.
왜냐하면, 웹 서버는 Python으로 작성된 웹 어플리케이션을 알아먹지 못하기 때문입니다. 웹 서버로 Nginx를 다들 들어보셨을텐데요, Nginx는 Django 웹 어플리케이션이 어떤 녀석인지 해석이 불가능합니다. 이때 WSGI가 그 역할을 하게 됩니다.
WSGI 종류도 여러가지가 있는데요, 대표적으로 uWSGI, mod_wsgi, Gunicorn가 있습니다.
또한, WSGI와 비슷한 ASGI가 있습니다.
ASGI는 Asynchronous Server Gateway Interface의 약자로써, WSGI의 단점을 보완한 인터페이스 입니다. WSGI는 비동기처리에 단점이 있습니다. 자세한 부분은 https://kangbk0120.github.io/articles/2022-02/cgi-wcgi-asgi 를 참고부탁드립니다.
WSGI의 상위호환이기 때문에 WSGI 의 기능들에 더해 비동기처리까지 할 수 있는 인터페이스입니다.
ASGI 의 종류는 Uvicorn, Hypercorn, Daphne가 있습니다.
세 종류의 차이점은 https://dev.to/bowmanjd/the-three-python-asgi-servers-5447 의 링크를 참고 부탁드립니다.
'Project_Personal' 카테고리의 다른 글
[웹 서비스 A-Z][Django] #10 CORS (0) | 2023.03.13 |
---|---|
[웹 서비스 A-Z][Django] #9 Design Pattern (0) | 2023.03.10 |
[웹 서비스 A-Z][Django] #7 Creation (0) | 2023.03.03 |
[웹 서비스 A-Z][Django] #6 Config (0) | 2023.03.02 |
[웹 서비스 A-Z][Vuejs] #5 Life Cycle (0) | 2023.03.01 |