daniel7481의 개발일지

[Django] Getting started 본문

Django

[Django] Getting started

daniel7481 2021. 12. 24. 19:54
반응형

파이썬, FE, BE에 대해 기본적인 지식을 쌓은 지금, 기술적인 문제로(필자는 현재 군인이고 외국에 나와있다. 그래서 컴퓨터 사항으로 인해 자바를 이용할 수 없다)일단 자바를 제쳐두고 파이썬의 장고를 사용하기로 하였다. 많은 분들에게 자문을 구한 후 프레임워크는 중요하지 않고 일단 전체적인 흐름을 잡는 것이 중요하다 하였으니, 비교적 친숙한 파이썬과 함께 서버 사이드를 공부하는 것도 괜찮다 싶었다. 나같은 사람에겐 가장 좋은 친구 유투브와 함께 시작해보기로 하였다. 유투브에 django python을 쳐보니 여러 가지가 나왔고, 그 중 Python Django 7 Hour Course(https://www.youtube.com/watch?v=PtQiiknWUcI)를 선택하였다. 이제 시작해보자

파이썬의 특징:

- 파이썬 웹 프레임워크

- 서버 사이드 프레임워크

- 웹을 빨리 만들 수 있다

- 배터리가 필요하다(진행하며 강제되는 사항이 있다)

- MVT 디자인 패턴을 가진다

웹 프레임워크

- 개발 속도 향상을 위해 모듈, 패키지, 라이브러리를 모은 것

장고로 무엇을 만들 수 있을까?

pinterest, Dropbox, instagram, youtube등 많은 SNS 기업들이 어떤 시점에는 장고를 사용하였다. 

장고 REST 프레임워크로 REST API혹은 API를 만들 수 있다.

파이썬 베이스의 웹 프레임워크는 Flask, Cherry Pie, Web2py ,Paramid등이 있지만, 장고와 플라스크와 쌍두마차라고 한다.

MVT Design Pattern

MVT는 Model, View, Template으로 나뉜다. 먼저 만약 Facebook.com을 들어간다고 하자. 그럼 사용자는 URL을 통해 들어오게 된다. URL에 맞춰 필요한 기능을 해줘야 하는데 그게 view다. view는 models로부터 데이터를 받아오고, template을 렌더링하여 다시 사용자에게 보여주게 된다.

먼저 시작하기 전 프로젝트에서 사용할 코드 Source를 가져와야 한다. 

https://github.com/divanov11/StudyBud/

 

GitHub - divanov11/StudyBud

Contribute to divanov11/StudyBud development by creating an account on GitHub.

github.com

강사님이 코드를 제공해주었고, 문제를 풀면서 어차피 위 깃허브에 강의 과정에서 작성하는 코드가 있기 때문에 조금씩 참고하면서 하기로 하였다. 또한 문제를 풀면서 원리를 이해하고 안되는 문제가 있으면 찾아보라고 django documentation을 보라고 강사님이 권고하셨다. 이 두가지는 킨 상태로 진행하자. 나는 pycharm을 사용할 것이다.

먼저 명령프롬프트로 가상개발환경을 구축해야 한다. 먼저 파이썬을 깔고 cmd로 명령 프롬프트를 들어가자. 그 후 자기가 프로젝트를 진행할 폴더로 cd로 이동하고, pip install virtualenv로 가상개발환경을 다운로드 하자. 그 후 다운이 완ㄹ되면  virtualenv env로 가상개발환경을 실행시키면 이제 파일명 앞에 (env)가 실행이 될 것이다. 그 다음 pip install django를 통해 django를 다운받고 다운 받은 후에는 django-admin으로 사용가능한 명렁어들을 살핀다. 이제 프로젝트를 시작해야 하니 django-admin startproject 프로젝트명을 실행한다. 이제 프로젝트 폴더로 디렉터리를 옮기고, python manage.py runserver로 서버를 시작해보자. 밑에 나오는 URL주소로 들어가면 이제 서버가 돌아가는 것을 볼 수 있을 것이다. 

프로젝트를 시작한 디렉터리(나는 studybud으로 하였다)를 들어가면 안에 파이썬 파일이 몇개 있다. 여기서 manage.py는 서버를 시동시켜주는 파이썬 파일로 실제로 건드리지는 않고, db.sqlite3은 sql nosql등을 적는 곳이라고 한다. wsgi.py는 web server gateway interface로 실제 서버고. urls.py는 말 그대로 우리가 사용하는 url들을 모아놓은 파일이다.우리가 주로 다룰 파이썬 파일은 settings.py와 urls.py라고 한다. settings.py는 우리 전체 프로젝트의 본부라고 생각하면 된다. settings.py가 코어 프로젝트다. 

settings.py

INSTALLED_APPS에 들어가면 이미 여러가지가 다운이 되어있는데, 이는 장고내에서 서버를 운영하기 위해 필요한 기본적인 앱들이다. 페이스북을 예로 들면 모든 사용자를 관리하는 앱이 있고, 그룹들을 관리하는 앱이 있을거고, 수많은 앱이 있을거다. 우리는 그러한 방대한 프로젝트가 아니기 때문에 한가지 앱으로 비즈니스 로직을 구현할 것이다. 

이제 앱을 만들기 위해 terminal 혹은 명령 프롬프트에서 python manage.py startapp base(앱 이름이다)를 실행하자. 이러면 base라는 폴더가 만들어진다. 현재 진행하는 장고 프로젝트에서는 base라는 앱의 존재를 모른다. 그러므로 django 프로젝트 안에 폴더를 넣어줘야 한다. base 안에 view는 어떤 사람이 어떤 URL을 들어갈 시 어떤 기능을 할 것인지, 데이터베이스에 어떤 쿼리를 요구할 것인지 정하는 곳이다. 이제 장고 프로젝트의 settings.py에 들어가서 INSTALLED_APPS에 base의 경로를 설정하면 된다. 여기서 base 예하에 apps의 BaseConfig라는 함수를 참조해야 하는데, base.apps.Baseconfig라는 문자열을 넣어주면 된다. 

이제 새로운 url을 넣어볼 차례다. urls.py에 들어가서 django.http에서 HttpResponse를 import한다. 그 후 home이라는 함수를 선언해야한다.

def home(request):
    return HttpResponse('Home page')

그 다음 밑에 urlpatterns에 path('', home)을 넣어주면 시작화면에 Home page라는 글자가 나오는 것을 알 수 있다. 이제 room이라는 새로운 url을 만들려면 같은 과정을 반복하면 된다. 이번에는 http://127.0.0.1:8000/room/라는 url에 들어가면 Room이라는 글자가 나오는 페이지를 설정하기 위해 위 home 대신 room이라는 함수를 선언하고 path에 ''대신 '개ㅐㅡ/'을 넣어주면 된다. 하지만 이런식으로 모든 url을 장고 프로젝트의 url파일에 넣는다고 하면 굉장히 복잡해질 수 있다.지금처럼 하나의 앱만 있으면 간단할 수 있지만, 여러 개의 앱이 있는 경우에는 각 앱마다 url을 따로 보관해줘야 한다. 먼저 필요한 url을 부르는 함수(위에 경우에는 home과 room이 있다)를 base 밑의 views 파일에 넣어주자. 그 다음 base 폴더에 urls.py라는 파이썬 파일을 새로 만들어주자. 그 다음 다음과 같이 작성해보자

from django.urls import path
from . import views


urlpatterns = [
    path('', views.home, name = 'Home'),
    path('room/', views.room, name = 'room')
]

장고 프로젝트 안의 url과 같은 기능을 하기 위해 path모듈을 import하고, 같은 base 디렉터리 밑에 있는 views파일을 참조해야하므로 import 해준다. 그 다음 장고 프로젝트의 urls.py와 같이 urlpatterns를 선언 후에 원래 했던대로 홈페이지와 room페이지에 대한 경로를 설정해준다. 다음 장고 프로젝트에서 이 url파일을 참조해야하므로 장고 프로젝트 밑의 urls.py는 이렇게 작성해준다.

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('base.urls'))
]

먼저 다른 파일에 있는 url을 참조하기 위해 필요한 모듈인 include를 import해준다. 다음 path('', include('base.urls'))은 기본 url에서 base.urls에 있는 urlpattern들을 연결해서 사용하라는 것이다. 

templates

위 같은 경우에는 html코드를 직접 작성하여 사용할 수 없다. html코드를 template로 저장하여 불러오는 방법을 알아보자. 먼저 장고 프로젝트를 진행하는 루트 디렉토리에 templates라는 폴더를 생성하자. 그후 그 안에 home과 room이라는 html파일 두개를 만들어주었다. 그 다음 settings.py에 보다보면 TEMPLATES라는 리스트가 보일 것이다. 여기서 'DIRS'옆에 다음과 같이 작성한다

'DIRS': [
            BASE_DIR / 'templates'
        ],

BASE_DIR은 루트 디렉토리로 가라는 것이다. templates의 부모 디렉토리는 루트 디렉토리이기 때문에 BASE_DIR / 'templates'는 templates가 위치한 주소를 나타내는 것이다. 그 다음 views.py에서 바꿔야 할 사항이 있는데 먼저 HttpResponse함수는 더 이상 필요 없고 render함수를 사용해야 한다.

from django.shortcuts import render
from django.http import HttpResponse


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


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

# Create your views here.

매개변수로 요청하는 http프로토콜과 html 파일을 넣어주면 정상적으로 실행이 된다.

template 상속

만약 하나의 template에서 다른 template을 참조하고 싶을 때, {% include 'navbar.html'%}으로 참조할 수 있다. 그러나 모든 페이지를 이런식으로 한다면 일이 굉장히 많아질 것이다. 또한 유지/보수에 굉장히 비용이 든다. 그러므로 main.html이라는 메인 html코드를 만든 후, 거기에 모든 template을 저장한 후에 다른 페이지에서 main template을 참조할 수 있다. 방법은 다음과 같다.

<body>
    {% include 'navbar.html' %}
    {% block content %}


    {% endblock %}
</body>

html안에서 동적으로 작동하기 위해서는 변수, 함수 등을 사용해야 할것이다. 여기서 파이썬은 {}와 %로 사용할 수 있다. 먼저 {{x}}로 변수 x를 나타낼 수 있다. 또한 {% for a in b %}로 for문, if문, while문 include문 등을 사용할 수 있다. 이제 views.py에 딕셔너리 변수를 선언하여 home.html에 변수를 사용할 수도 있다. 먼저 room이라는 변수를 views에서 선언하자. 그 다음 딕셔너리 형태로 각 방의 id, 각 방의 이름을 선언해준다.

rooms = [
    {'id' : 1, 'name' : 'Lets learn python!'},
    {'id' : 2, 'name' : 'Design with me'},
    {'id' : 3, 'name' : 'Frontend developers'},
]
def home(request):
    return render(request, 'home.html', {'rooms': rooms})

그 다음 home이라는 함수에 뒤에 딕셔너리 형태로 매개변수로 넣어주면 home.html에서 rooms를 가져와서 쓸 수 있다. 이제 앱을 만들다 보면 어느 페이지에서도 접속 가능한 페이지가 있을 것이다. 이를 메인 템플릿이라고 하면, home.html 혹은 room.html처럼 특정 url에서만 필요한 페이지는 별도로 저장해줘야 한다. 먼저 main templates는 원래 있던 장소인 루트 디렉토리의 templates에 넣어주고, base 폴더(base는 우리가 만드는 앱의 이름이다) 예하에 templates라는 폴더를 만든 후 그 밑에 우리가 만드는 앱의 이름과 같은 이름으로 폴더를 만들어줘야 한다(여기서는 base다). base 폴더 안에 home.html, room.html을 넣어주고, views에서 이제는 home함수와 room함수에 home.html을 넣어주는 것이 아닌 정확한 주소인 base/home.html을 넣어줘어야한다.

이제 url을 동적으로 반응하게 하고 싶다. 예로 들어 위에서 선언한 rooms에서 각 방마다 다른 url을 만들어서 접근하고 싶을 때, 현재 가지고 있는 room 함수로는 만들 수가 없다. 이 때 다음과 같이 하면 된다.

먼저 urls.py에서 path에 'room/<str:pk>'로 바꿔준다. 이러면 pk(primary key, 주로 string형으로 받는다)에 따라 다른 url로 이동될 것이다. 이제 pk를 받을 수 있게 views.py의 room함수에 매개변수로 pk를 받아야 한다. 이렇게 되면 room/1/이런식으로 접근이 가능하다. 그러나 pk값이 다르더라도 전부다 room template만 display할것이다. 이제 각 url마다 방 이름을 h1으로 바꾸고 싶다. 이러면 앞에서 했던 것처럼 render함수의 매개변수로 딕셔너리 자료형을 넣어줘어야 한다. 

def room(request, pk):
    room = None
    for i in rooms:
        if i['id'] == int(pk):
            room = i
    context = {'room':room}
    return render(request, 'base/room.html', context)

이런식으로 바꿔준 후 room.html에서 h1을 Room template이 아니라 {{room.name}}으로 바꿔주면 각 방을 들어갈 때마다 그 방 이름이 h1으로 전시될 것이다. 

만약 url이 바뀔때마다 모든 사이트에 들어가서 그 경로를 접근하는 url을 전부 바꿔주기라는 비효율적이기에 name = 'room'이런식으로 각 url의 이름을 정해준 것이다. name값이 바뀌지 않는다면 url이 바껴도 변함없이 접근할 수 있다. 이제 접근하는 표현을 다르게 하면 되는데, 앞에서 각 방의 이름을 url로 접근할 때 다음과 같이 다르게 선언하자

<h5>{{room.id}} -- <a href="/room/{{room.id}}">{{room.name}}</a></h5> #이런식으로 선언하면 url이 바꼈을 때 모든 경우에 손수 바꿔줘야 한다
<h5>{{room.id}} -- <a href="{% url 'room' room.id %}">{{room.name}}</a></h5>

중요한 것은 href뒤 문자열에서 쌍따옴표를 썼으면 안에 room은 따옴표를 써야하고, 반대의 경우에도 마찬가지다.

반응형

'Django' 카테고리의 다른 글

[Django] Database & Admin Panel  (0) 2021.12.24