728x90

참고:

[Web Applicateion]서버 사이드와 클라이언트 사이드,백앤드와 프론트앤드


pip install django로 반드시 장고를 설치하여야한다.


쟝고에 대해서 알아가야할건 많지만 사실 스텝바이 스텝으로하면 어려운건 별로 없다.

이번에는 정말 간단하게 page를 하나 만들어 볼것이다.

우리는 특정 url을 요청하면 그 요청에 의해서 페이지를 보여주는 것을 해볼 것이다.


일단 프로젝트 내부를 한번 보면 알겠지만 새로운 파일이 생겼다.

바로 templates라는 폴더이다. 이 폴더의 이름, 위치는 사실 중요하지 않다.

아무곳이나 위치시켜도 상관없다는 이야기이다.

다만 보통 관습적으로 어플리케이션 폴더밑에 둔다.

현재 djtest는 project이고 dj는 어플리케이션이므로 dj밑에 두도록한다.

또한 바로 밑에 템플릿을 위치시켜도 되지만 관습적으로 application 밑에 두는 경향이 있다.

이는 나중에 한 프로젝트에 여러 어플리케이션이 위치할 경우, 템플릿을 혼동하지 않기 위해서 사용한다.


정리


관습적으로 template들의 위치는 templates라는 폴더안에 모아 둔다.

templates폴더의 위치는 보통 관습적으로 application아래에둔다.

여러 어플리케이션을 사용할 경우를 대비하여application명으로 폴더를 따로 둬서 넣는다.


그리고 템플릿 파일을 만들면된다. 여기서 우리는 hello.html이라는 폴더를 만들어 보자.


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
{{ body }}
</body>
</html>

hello.html와 같은 파일을 template라 부른다.

우리는 이 템플릿을 렌더링하여서 화면에 띄어줄 것이다.

여기서 처음보는 문법이 나오는데 바로 django의 template문법이다.

jinja2와 매우 유사하다.

이 템플릿을 모르는 사람에게 말하자면 결국 title과 body라는 변수를 이 템플릿에 넘겨줘야한다는 이야기이다.


django는 MTV패턴이라 불리는 독자적인 패턴을 사용한다.

흔히말하는 MVC패턴과 사실 거의 같다. 차이가 있긴한데 진지하게 다루지 않아도 무방하기에 여기서 생략한다.

MVC패턴에서 V는 화면의 템플릿을 담당하고 C는 로직을 담당했다.

MTV패턴의 경우 T는 화면의 템플릿을 담당하고 V는 로직을 담당한다.

여기에 매칭시키면 사실은 동일한 개념이라고 할 수 있다. 솔직히 말하면 해석하기 나름인 것이다.

이제 이 템플릿을 화면에 띄워보자.


# views.py
from django.shortcuts import render


# Create your views here.
def hello(request):
print(request)
return render(request, 'dj/hello.html', {'title': 'hello', 'body': 'world'})


views.py의 파일을 수정하여보자. 사실 맨처음 사용하면 여기는 비어있다.

여기서 우리는 hello라는 메소드를 만들었다. 이 메소드는 우리가 라우팅할메소드이다.

여기서 request라는 파라메터를 받는것은 강제된다.

request는 WSGIRequest를 상속받는다.

당연히 request헤더와 바디에 대한 정보를 담고 있으므로 아래와 같은 속성으로 값을 받아낼 수있다.


path - url을 전달함

method - request method를 파악함. 이로 인하여 get, post등의 구별가능

content_type - mime type을 확인


또한 GET혹은 POST를 직접적으로 사용할수도 있다.


def hello(request):
print(request.GET)
print(request.POST)

위와같은 코드도 가능하다.

해당 코드를 사용하며 GET과 POST상태에서 받은 파라메터들을 딕셔너리형태로 받으므로

딕셔너리를 쓸떄처럼 사용하면된다. 이 정도면 왠만한 웹에서 사용하는건 다 사용할줄 안다고 보면된다.


이제 눈길이 가는건 render라는 함수이다. render라는 함수는 말그대로 렌더링을 시켜주면된다.

첫번째 파라메터로는 request를 넘겨주고 두번째 파라메터로는 아까만든 template를 선택한다.

또한 마지막 파라메터로는 내가 넘겨줄 파라메터들을 선택하는것을 확인할 수 있다.

사실 여기까지만 보면 별 특별할거 없어 보이지만 중요하넉ㄴ 두번쨰 파라메터이다.

도대체 어디서부터 경로를 적으면 될지에 대한 문제이다.

왜냐하면 템플릿 폴더를 우리가 임의로 만들었기 때문이다.

그렇다면 어디까지 경로를 적어야할까?

여기에 대한 해결책은 settings.py를 확인한다.


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',
],
},
},
]

해당 파일에 TEMPLATES를 확인한다.

그러면 DIRS가 비어있는 것을 확인할 수 있다.

이게 비어있기 때문에 우리는 사실 템플릿 폴더를 사용할 수 없게된다.

이제 우리가 만든 템플릿 폴더를 지정해주자.


TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['dj/templates'],
'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',
],
},
},
]

이렇게 templates까지만 지정해주면 큰 문제가 없다.

이까지 했으면 끝났을까? 당연히 아니다.

아직 url매핑을 해주지 않았다. 즉 라우팅을 하지 않았기 떄문이다.

여기서 라우팅은 urls.py를 통해서 시행할 수 있다.


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

해당 폴더에 path함수를 사용해서 라우팅을 해주자.

views는 당연히 import해야하므로 상단에 from <어플리케이션명> import views를 꼭해준다.

이제는 정말 준비가 끝났다. 하나를 하기위해서 뭔가 많은 작업을 한거 같지만 사실 많은 작업을 하지는 않았다.

실행시켜보자.


간혹가다 path말고 url이라는 함수를 사용하는 경우가 있다.

이는 과거버전의 내용인데 path와 url의 차이는 path는 flask방식이고 url은 정규표현식을 사용한다.

현재 url은 deprecated되어 미래에 사라질 내용이므로 사용하지 않는걸 권장한다.

대신에 re_path라는 regex(정규표현식)을 지원하는 또다른 방법이 있다.

따라서 url을 사용하고 싶다면 대신 re_path를 사용하라



성공적으로 실행되는걸 확인할 수 있다.






'Programming > Python-Django' 카테고리의 다른 글

[Django-06]model을 templates로 출력하기  (0) 2018.02.03
[Django-05]db와 model 사용하기  (0) 2018.02.03
[Django-04]http response  (0) 2018.01.30
[Django-02]superuser 만들기  (0) 2018.01.23
[Django-01]Django 시작하기  (0) 2018.01.23

+ Recent posts