Django(1)

yoodeit·2022년 6월 9일
2

1. Django 프로젝트 시작하기

기본적으로 처음 프로젝트를 시작할 때는

python3 -m venv myvenv
source myvenv/bin/activate
pip3 install django
pip3 freeze
django-admin startproject practice_url
cd practice_url
python3 manage.py startapp myapp

1) myvenv라는 가상환경을 만들고
2) 그 가상환경을 실행하고
3) 그 가상환경 안에 django를 설치하고
4) 설치된 패키지들의 버전을 확인하고
5) practice_url 이라는 프로젝트를 만들고
6) 그 프로젝트 안으로 들어가
7) myapp이라는 어플리케이션을 생성했다.

어플리케이션을 만들었으므로 settings.py에 들어가
INSTALLED_APPS 리스트에 myapp을 추가해야 한다.
여기서 어플리케이션을 추가하고 쉼표 까먹어서 에러 나는 일이 없도록 해야 한다. 은근 자주 발생하는 오류라.

이후 Myapp에 templates라는 폴더를 추가하고 안에 html 파일을 넣는다. 여기에서는 first.html 파일을 넣었다.

실제로 이 first.html이 나타나도록 해야 하므로 Myapp 어플리케이션의 views.py에 들어가서 first함수를 추가해 준다.
참고로 여기서 Render는 first.html을 화면에 찍어내라는 뜻.

def first(request) :
	return render(request, 'first.html')

2. 라우팅

다음으로는 라우팅을 해 주어야 한다.
전체 urls.py에 다음과 같이 적어준다.

from myapp import views

또한, myapp에 있는 views에 들어 있는 first함수가 작동하도록 경로를 추가해 준다.

urlpatterns = [
	path('admin/', admin.site.urls),
    path('', views.first)
]

second.html 문서에는 a태그로 first.html로의 이동을 지원

<a href="/">to first page</a>

fisrt.html 문서에도 a태그로 second.html로의 이동을 지원

<a href="/second">to second page</a>

그런데 이런식으로 라우팅을 진행하면 너무 비효율적이다.
계층적으로 이루어진 Url을 한꺼번에 다루는 방법이 있다.
그럴 때는 django.urls 에 있는 include를 써볼 수 있다.
따라서 우선적으로 path 옆에 include를 추가해 준다.

from django.urls import path, include

일단 좀 큰 사이트를 제작할 때를 예시로 들고 있으므로 몇 가지 app을 추가적으로 생성하였다.

python3 manage.py startapp product
python3 manage.py startapp board

당연히 자동적으로 settings.py에 애플리케이션 등록 해줘야.

이 다음부터가 이제까지와는 조금 다른데,
board라는 새 어플리케이션 안에 인위적으로 urls.py를 만들어 준다.

그리고 practice_url. 그러니까 전체 urls.py 파일로 돌아와서
include를 활용하여 라우팅을 진행한다.

urlpatterns = [
	path('admin/', admin.site.urls),
    path('', views.first),
    path('second/', views.second),
    path('products/', include('product.urls')),
    path('boards/', include('board.urls')),
]

이것이 무슨 의미냐 하면
앞으로 다음과 같이 products/류는 모두 products app 안에 자체적으로 만든 urls.py에서 관리하겠다는 의미이다.

127.0.0.1:8000/products/1
127.0.0.1:8000/products/2
127.0.0.1:8000/products/3

boards/ 도 마찬가지이다.

127.0.0.1:8000/boards/1
127.0.0.1:8000/boards/2
127.0.0.1:8000/boards/3

이제 board app에 자체적으로 생성한 urls.py로 들어간 다음
필요한 것들만 추려서 import를 하고 path를 추가연결한다.

from django.urls import path
from board import views

urlpatterns = [
    path('', views.board),
]

최종적으로 이러한 상황이 만들어졌다면.

python3 manage.py runserver

라고 입력했을 때, 입력하는 주소에 따라 다음과 같이 구현되어야 정상이다.
일단 주소를 입력하자마자는 아무것도 없을테니 아래와 같은 페이지가.

to second page를 누르면

products를 입력하면

boards를 입력하면

127.0.0.1:8000/products/first/

를 입력하면

이런 식으로 구현이 된다.

include로 관리하는 것 말고, 자동으로 url을 생성하는 방법도 있다고 하니 일단은 include로 application 내에서 url을 관리하는 방법을 배웠다고 생각하면 될 듯 하다.

3. git 관련 설정

.gitignore 설정

git에 올릴 필요가 없거나, 올리면 안되는 정보들은 걸러줘야 한다.
그걸 위해 사용하는 게 .gitignore 파일이다. 최상위 디렉토리에 .gitignore 파일을 만들어주면 된다.

프로젝트에 맞는 gitignore파일을 만들어주는 사이트가 있으니까 그걸 쓰면 됨. https://www.toptal.com/developers/gitignore

예를 들면 가상환경 관련한 myvenv 디렉토리는 굳이 업로드할 필요가 없으므로

이렇게 myvenv/ 를 적어주면 된다.

Secret Key 숨기기


app들 말고 main project의 settings.py 파일을 보면, secret key가 있다. 보안상의 이유로 이걸 숨겨줘야 됨.

숨겨주기 위해서는 django-environ이라는 라이브러리를 사용한다.
https://django-environ.readthedocs.io/en/latest/
document에서 시키는 대로 하면 된다.

우선 django-environ을 설치해주자.

python -m pip install django-environ
#아니면
pip install django-environ

이제 .gitignore와 마찬가지로 최상위디렉토리에 .env 파일을 만들어준다. env파일 안에는 도큐멘트에 적혀있는 코드를 그대로 복사해서 넣어준다.

거기서 secret_key 부분만 reDjango/settings.py에서 가져온다.


그리고 settings.py에 있는 시크릿코드는 SECRET_KEY = env('SECRET_KEY') 로 바꿔준다.

이후에는 settings.py파일에다가 다음의 코드를 복붙해주면 됨.

기껏 숨기려고 env 썼는데 git에 .env 올리면 황당하다. 얘도 gitignore에 추가해주면 시크릿코드 숨기기는 끝이다.

git 활성화

이 프로젝트 깃허브에도 올려야되니까 우선 레포지토리부터 팠다.
이름은 똑같이 reDjango.

이제 터미널로 최상위 디렉토리에 가서 아래의 명령어들을 차례로 입력하면 된다.

git init
git add .
git commit -m "first commit"
git remote add origin 깃허브레포지토리주소
git push --set-upstream origin main
git push

인터프리터 선택


이런 식으로 경로를 못찾는 문제가 있어서 자동완성이 안되는 부분이 아주 답답했다. 알고보니 인터프리터가 달라서 생긴 문제로, 가상환경 내의 인터프리터를 골라야 했다.

homebrew로 설치한 파이썬 글로벌을 사용하고 있었음. myvenv 안에 있는 인터프리터로 바꿔주자.

아래는 chatgpt가 알려준 인터프리터 확인용 커맨드.

# 현재 터미널이 쓰는 인터프리터 경로 확인
python -c "import sys; print(sys.executable)"

# 그 인터프리터에 Django가 실제 설치돼 있는지
python -m pip show django

# 해당 인터프리터가 모듈을 어디서 찾는지(sys.path)
python -c "import sys, pprint; pprint.pprint(sys.path)"
profile
Yoodeit

0개의 댓글