Web/Django

[AI Class Day 18] Django - basic and Templates TIL

makeitworth 2021. 5. 18. 01:12

Django란?

 

python 기반의 웹 프레임워크

같은 python 기반인 Flask와의 차이점

  • Flask : 마이크로 웹 프레임워크(최소한의 핵심 기능을 갖춤) 간단한 프로젝트에 적합
  • Django: 거의 모든 것들이 내장되어 있음, 보다 큰 프로젝트에 적합

 

Django 시작하기

# 파이썬 가상환경 모듈 설치
$ pip install virtualenv

# 현재 디렉토리에 새 virtualenv 가상환경 만들기
$ virtualenv <가상환경 이름>

# 가상환경 진입하기
$ source venv/bin/activate

# 장고 설치
$ pip install django

# 장고 설치 확인
pip freeze

# 장고 시작. 프로젝트 파일이 생성된다.
django-admin startproject <project name>

프로젝트 폴더 내에 manage.py 파일과 <project name> 폴더가 생성되어 있다.

 

이중 manage.py를 이용해서 django 서버 가동

$ python manage.py runserver

http://127.0.0.1:8000/ 로 접속하면,

 

 

 

 

webproj 폴더 안에는 Django의 기본 py 파일들과 db 등이 미리 생성되어 들어가 있음

 

1. __init__.py : 디렉토리가 파이썬 모듈로써 인식하게 해주는 역할

2. asgi.py, wsgi.py : 서버에서 장고 프로젝트를 가동할 때 다루게 될 부분

3. settings.py : 전반적인 장고 프로젝트의 설정 사항을 반영하는 파일. 프로젝트할 때 제일 많이 보게 될 파일

  • BASE_DIR, SECRET_KEY, DEBUG, ALLOWED_HOSTS, INSTALLED_APPS, MIDDLEWARE
  • ROOT_URLCONF: 프로젝트 url을 관리할 모듈 지정
  • TEMPLATES
  • WSGI_APPLICATION: 파이썬에서 웹서버와 소통하는데 필요한 어플리케이션 담당
  • DATABASES, AUTH_PASSWORD_VALIDATORS
  • LANGUAGE_CODE, TIME_ZONE, USE_I18N, USE_L10N, USE_TZ
  • STATIC_URL

4. url.py : url 관리 ,프로젝트 할 때 제일 많이 보게 될 파일

 

Django Project 와 APP

하나의 프로젝트는 여러 앱으로 구성

app : 특정 명령을 수행하는 뷰, 태블릿의 모음 (MTV 참고)

한 사이트 내에 여러 기능을 하는 페이지가 있듯이 각 기능에 모듈화 해서 개별적으로 진행할 수 있다.

 

Django App 시작하기

 

homepage 앱 시작하기

 

1. CLI에서 앱 시작하기 명령

django-admin startapp homepage

 

2. settings.py 파일의 INSTALLED_APPS 리스트에 app 추가

 

INSATALLED_APPS = [

''''''

	'homepage'  #추가

''''''
]

 

이렇게 만든 homepage 폴더 안에 기본 py 파일들이 생성되어 있음

 

admin.py : 기본적으로 제공되는 admin page가 있는데, 이 설정을 관리

apps.py : 앱에 대한 설정 관리

model.py :  앱에서 쓰일 스키마를 클래스 형태로 작성

views.py : 앱에서 쓰일 뷰를 관리

 

3. views.py 파일에 index view 만들기

 

views.py 파일에 가장 기초적인 "Hello World!" 출력하는 view 만들기

from django.http import HttpResponse

# 어떤 요청이 들어오면, "Hello World!"를 response하는 view
def index(request):
	return HttpResponse("Hello World!")

 

4. urls.py 에 추가 -> 뷰가 실행될 url 지정

 

webproj/urls.py

 

 

from django.urls import path
from django.contrib import admin
from homepage.views import index

urlpatterns = [
    path('', index), # 127.0.0.1/
    path('admin/', admin.site.urls),
]

 

 

python3 manage.py runserver 로 실행하면, 

http://127.0.0.1:8000/ 웹페이지에 Hello World! 출력

 

동작 순서

  1. 클라이언트가 127.0.0.1이라는 주소에 요청을 보낸다
  2. urls.py에서 주어진 패턴이 url에 있는지 확인한다. 있으면, index를 실행한다.
  3. views.py에서 index함수를 실행한다. 즉, HttpResponse인 “Hello World!”를 출력한다.

 

Admin Page 로그인하기

슈퍼유저 계정 생선 전에 auth_user 테이블을 만들어 줘야 함

 

 

이 4개 app에 대한 마이그레이션을 진행해서 db에 반영해줘야 함

 

CLI에서 다음 명령어로 마이그레이션 실행

python manage.py migrate

 

어드민 페이지에 로그인할 수 있는 슈퍼 유저 생성하기

python manage.py createsuperuser

 

user_name/ password 입력

 

python3 manage.py runserver로 서버 실행시키고, 

주소/admin 페이지로 접속하여 로그인하면 admin 페이지 확인 가능 -> db 관리 users table 확인 가능

 

Template으로 보여줄 화면 구성하기

homepage/views.py

아까 처음 앱 만들기에서는 

from django.http import HttpResponse

def index(request):
	return HttpResponse("Hello World!")

HttpResponse 를 리턴하여 간단한 Hello World! 만 출력했지만, 보다 긴 html 페이지를 보여주기 위해서

render() 함수를 return한다.

 

render() 함수의 parameter

  1. request : index 함수에 들어온 http request
  2. html 파일 이름 : response로 보여줄 파일 이름
  3. template에 전달해줄 변수 (dict 형) : request와. html 코드를 처리하는 과정에서 사용할 데이터들을 딕셔너리 형태로 전달

1. homepage 폴더 내에 templates 폴더 만들기

2. templates 폴더 내에 html 파일 만들고, 코드 작성

3. views.py 파일에서 render 함수 리턴할 때 parameter에 template_html 넣기

 

homapage/templates/index.html 파일 작성

 

<!DOCTYPE html>

<head>
    <title>Python django example</title>
</head>

<body>
    <h1>Title</h1>
    <p>blah blah blah</p>
</body>

</html>

homepage/views.py 에 함수 추가

def index(request):
    return render(request, 'index.html', {})

 

settings.py 내의 TEMPLATES의 DIRS에 이 템플릿 파일이 어디에 있는지 명시해줘야 함 

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))

BASE_DIR를 만들어 놓고,

'DIRS': [
    os.path.join(BASE_DIR, "homepage", "template"),
    ],

이렇게 만든 template의 경로를 그때 그 때 만들어서 넣어준다.

 

html로 작성한 화면을 webpage에서 볼 수 있다.

 

 

정리하면, 3가지 작업을 해줘야 함

1. request에서 보여줄 화면을 template 폴더 아래 .html 파일을 만들어 구성

2. views.py파일에서 1에서 만든 html 파일을 render 함수의 parameter로 전달

3. setting.py에서 TEMPLATES의 DIRS 내에 내가 만든 template 전달

 

render 함수의 context parameter {}  활용하기 - 동적인 웹사이트의 시작

1. 변수에 넣은 값 보여주기 :  {{my_number}}

homepage/views.py

def index(request):
    number = 10
    return render(request, 'index.html', {"my_num": number})

 

homepage/templates/index.html

.html 파일 내에서 장고 탬플릿 언어를 사용한다. html에서 부가적으로 사용할 수 있는 언어.

 

body tag 안에 원하는 위치에 

  <p>{{ my_num }}</p> 

추가

 

웹페이지에는 number 변수에 할당된 값 10 이 보이게 됨

 

2. 변수에 탬플릿 필터 적용해서 보여주기 : {{my_name | upper}} 

 

homepage/views.py

 

def index(request):
    name = "Michael"
    return render(request, 'index.html', {"my_name": name})

homepage/templates/index.html

 

body tag 안에 원하는 위치에

    <p>{{ my_name | length }}</p>
    <p>{{ my_name | upper }}</p>  

추가

 

웹페이지에는 name에 할당된 "Michael"의 길이인 7과 대문자로 변환한 MICHAEL 이 보이게 됨

 

3. {% ...%}  탬플릿 태그 활용하여 for 문 , if 문 적용해서 보여주기

 

homepage/views.py

def index(request):
    nums = [1, 2, 3, 4, 5]
    return render(request, 'index.html', {"my_list": nums})

 

homepage/templates/index.html

 

body tag 안에 원하는 위치에

 

 	{% for element in my_list %}
        {% if not element|divisibleby:"2" %}
            <p>{{ element }}</p>
        {% endif %}
    {% endfor %}

웹페이지 상에는 리스트 원소 중에서 2로 나눠지지 않는 1,3,5 만 출력

 

Django - MTV 구조

Model, Template, View로 구성

 

 

유저가 Django에 HTTP request를 보내면,

django, 즉 서버는 URL에서 urls.py로 url 인식 -> 들어온 경로가 urls.py 에 있다면 이를 views.py 에 보내고, 들어온 요청 처리

db 처리가 필요한 경우 model에서 db처리 (django는 db를 ORM 구조로 관리)

특정 웹페이지를 보여줘야 하는 경우 template에서 .html 파일을 통해 처리

html에서 template 언어를 통해 views.py에서 정의한 변수를 받아서 처리할 수 있음

'Web > Django' 카테고리의 다른 글

[AI Class Day 19]Django 2 - Model TIL  (0) 2021.05.18