수학과의 좌충우돌 프로그래밍

[Django] 기본세팅하기 본문

웹프로그래밍/Django

[Django] 기본세팅하기

ssung.k 2019. 5. 1. 15:22

기본 세팅하기

기존에 django 를 이용하여 Hello World 를 출력해보는 기초를 알아보았습니다.

https://ssungkang.tistory.com/entry/Django-02-Django-%EC%8B%9C%EC%9E%91-Hello-World-%EC%B6%9C%EB%A0%A5

이번에는 좀 더 나아가서 기본세팅을 정형화 해보도록 하겠습니다.

  1. 프로젝트의 이름

    프로젝트 이름은 project 로 , 그 하위 폴더는 config 로, 중심이 되는 app은 core 로 하도록 하겠습니다. 다만 프로젝트와 그 하위 폴더의 이름은 자동으로 같게 되기 때문에 프로젝트의 이름을 config 로 생성 후 최상단 디렉토리를 project로 바꿔줍니다.

  2. settings 파일

    장고 프로젝트를 생성하면 기본적으로 setting.py 가 생성된다. 여기서 여러 설정을 해줄 수 있는데 우리는 개발할 경우, 배포할 경우에 따라 설정이 달라야 합니다. 그래서 setting.py 대신 settings 라 디렉토리를 만들어 그 안에 다음과 같이 python 파일들을 만들어주었습니다.

    • common.py

      • 기본 setting.py와 같은 내용입니다.
    • dev.py

      • 개발환경으로서 common.py를 상속받은 후에 개발 환경에서 원하는 세팅들을 추가해줍니다. 다음은 하나의 예로서 개발 시에는 개발자가 debug toolbar 를 사용하는 방법입니다.

        pip install django-debug-toolbar

        from .common import *
           
           INSTALLED_APPS += ["debug_toolbar"]
           MIDDLEWARE += ["debug_toolbar.middleware.DebugToolbarMiddleware"]
           INTERNAL_IPS = ["127.0.0.1"] # 해당 아이피에서만 툴바가 보입니다.
           ```
        

        또한 config의 urls.py 도 다음 내용을 추가해줍니다.

        from django.contrib import admin
        from django.urls import path, include
        from django.conf import settings
        from django.conf.urls.static import static
        
        urlpatterns = [
            path('admin/', admin.site.urls),
            path('', include('core.urls')),
        ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
        
        # DEBUG == ture 일 때만 보인다.
        if settings.DEBUG:
            import debug_toolbar
            urlpatterns += [
                path('debug', include(debug_toolbar.urls)),
            ]
        
      • pip로 설치 후 dev.py 에 아래 코드를 추가해줍니다.
      • wsgi.py 와 manage.py 를 다음과 같이 변경해주어야 합니다.

        # 기존 코드 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') 
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.dev')
        

        그 후에 다시 migrate 를 헤줘야하는데 이 때 db 가 전부 날라가므로 조심하셔야 합니다.

      • prod.py

        배포시 설정할 setting 입니다. DEBUG 를 꺼주고 배포 상황에 따라 추가적인 설정을 해줍니다.

        from .common import *
        
        
        DEBUG = False
        ALLOWED_HOSTS = []
        

         

  1. secret key

    환경변수를 이용하는 방법도 있지만 좀 더 쉬운 json 파일을 이용하였습니다. manage.py 와 같은 경로에 secrets.json 파일을 만들고 그 안에 key 값을 적어주었습니다.

    {
        "SECRET_KEY": "c_o2tp33=1o434-ec*y$2avd#m9-p5)7nij=x#^ 이하 생략"
    }
    

    이 외에도 소셜 로그인을 위한 OAuth 키 값들을 넣어줄 수 있으며 key 값은 타인이 봐서는 안되기 때문에 뒤에서 다룰 .gitignore에 추가해줘야 합니다.

    그 후 settings, 위에서 새로 바꾼 common.py 에서 다음과 같이 불러올 수 있습니다.

    import json
    
    from django.core.exceptions import ImproperlyConfigured
    
    secret_file = join(BASE_DIR, './secrets.json')  # secrets.json 파일 위치를 명시
    
    with open(secret_file) as f:
        secrets = json.loads(f.read())
    
    
    def get_secret(setting, secrets=secrets):
        """비밀 변수를 가져오거나 명시적 예외를 반환한다."""
        try:
            return secrets[setting]
        except KeyError:
            error_msg = "Set the {} environment variable".format(setting)
            raise ImproperlyConfigured(error_msg)
    
    
    SECRET_KEY = get_secret("SECRET_KEY")
    

     

  2. static 폴더

    static 폴더는 config 아래와 core 아래에 각각 만들어주어야 합니다. 자세한 이유는 아래 링크에 나와있습니다.

    # settings.py 아래 추가할 내용
    
    import os
    from os.path import abspath, dirname, join
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = dirname(dirname(dirname(abspath(__file__))))
    
    STATIC_URL = '/static/'
    
    STATICFILES_DIRS = [
        join(BASE_DIR, 'config', 'static')
    ]
    STATIC_ROOT = join(BASE_DIR, '..', 'static')
    
    
    MEDIA_URL = '/media/'
    MEDIA_ROOT = join(BASE_DIR, '..', 'media')
    

    https://ssungkang.tistory.com/entry/Django-08-%EC%97%AC%EB%9F%AC-%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EB%A3%A8%EA%B8%B0

    https://ssungkang.tistory.com/entry/Django-09-%EC%97%AC%EB%9F%AC-%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EB%A3%A8%EA%B8%B0-media-%ED%8C%8C%EC%9D%BC?category=320582

  3. views 세분화

    기존의 views.py 에는 장고에서 controller 를 담당하며 기능을 수행하는 함수들이 위치합니다. 따라서 기능에 따라 함수를 세분화하여 표현하고자, views 라는 디렉토리를 만들고 이 안에 기능별로 파일을 만들어줍니다. 조심해야할 점은 views.py 의 경로가 바꿔었으므로 url.py 등에서 import 할 때 조심해야 합니다.

    views 디렉토리안에 views.py를 import 하기 위해서는 다음과 같이 해줘야합니다.

    # core/views.py
    
    from .views import views
    

     

  4. requirements.txt

    https://ssungkang.tistory.com/entry/Django-requirementstxt-%EB%A5%BC-%ED%86%B5%ED%95%9C-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%A2%85%EC%86%8D%EC%84%B1-%EA%B4%80%EB%A6%AC

  5. .gitignore

    .gitignore는 git이 변경사항을 캐치하지 못하게 막아줍니다. https://gitignore.io/ 에 접속하면 어떤 걸 ignore 해야하는지 알 수 있습니다. 추가적으로 위에서 만든 requirements.txt 와 secrets.json 도 작성해줍니다.

Comments