Django

 

Python 기반 웹 프레임 워크. 한 Project는 여러 App으로 구성되어 있다. App 각각은 특정 명령을 수행하는 View나 Template의 모음이라고 생각하면 된다.

 

Djnago vs Flask

 

둘 다 Python 기반 웹 프레임 워크지만, 지향성이 다르다.

 

flask는 늘 앞에 micro가 붙는다. 이는 최소한의 기능을 갖고 있다는 것으로, 여기에 추가적 모듈을 붙여가며 빌드업을 하는 구조이고,

 

Django는 이미 거의 모든 것이 내장되어 있는 구조로 되어 있다. 큰 것 안에 우리가 원하는 것을 부분부분 채워 나가면서 프로젝트를 이뤄나가는 구조이다.


Django의 구성 요소

 

  • manage.py
    • 장고를 실행하게 하는 파일
  • (proj_name) file
    •  __init__.py
      • proj_name file 디렉토리가 파이썬 모듈로써 인식되게 하는 역할
    • asgi.py / wsgi.py
      • 서버에서 실제 장고 프로젝트를 가동할 때 다루게 되는 곳
    • settings.py
      • 전반적 python django 프로젝트에 설정 사항을 반영하는 파일
      • 내부 구성 요소
        • SECRET_KEY
          • 장고 프로젝트에 대한 secret key
        • DEBUG 
          • True면 파이썬 프로젝트를 디버깅 모드로 실행
        • ALLOWED HOST 
          • 리스트 내 주소를 넣어 어떤 주소에 대해 장고 프로젝트에 접근할 수 있는지 결정하게 됨
        • INSTALLED_APPS / MIDDLEWARE
          • 여러 앱 / 미들웨어 중 어떤 것을 설치하게 되는지 확인할 수 있다
        • ROOT_URLCONF
          • 프로젝트에서 URL 관리를 어떤 모듈에서 진행할 것인지 담당
        • TEMPLATES
          • 실제 보는 화면에 관한 요소들이 담겨 있는 부분
        • WSGI-APPLICATION
          • 파이썬 상에서 웹 서버와 소통하는 데 필요한 어플리케이션 담당
        • DATABASE
          • 프로젝트 상에서 다루게 되는 여러 자료들을 저장하는 곳을 담당
        • AUTH_PASSWORD_VALIDATORS
          • 패스워드 관리
        • STATIC_URL
          • 정적 파일들(CSS, JavaScript, Images)을 어느 폴더에 담아둘지 결정
    • urls.py
      • URL 관리

App의 구성요소

 

  • admin.py
    • admin 페이지에 관한 부분
  • apps.py 
    • 앱에 관한 설정에 관한 부분
  • models.py
    • 앱에 쓰일 데이터베이스 스키마 등을 클래스 형태로 작성해줄 수 있다.
  • tests.py
    • 프로젝트의 테스트 케이스에 대해 설명
  • views.py
    • 앱에서 view를 어떻게 관리해줄 것인가에 대한 코드 작성 가능

Django의 MVT Pattern

 

그림 출처 : www.onlinetutorialspoint.com/django/django-mvt-basic-application-example.html

 

어떤 User가 있을 때 그 User가 Request를 보낸다. Django(server) 입장에선 이 Request를 URL(urls.py)이 인식하게 된다. 즉, 어떤 경로에 대한 요청이 들어갔는지 체크한다.

들어온 경로가 urls.py에 있다면 View(view.py)에 보내게 된다. view에는 들어온 요청을 처리하는 logic이 담겨있다.

이 요청을 처리하다 보면 데이터베이스를 처리하는 경우도 생길텐데 그 데이터베이스를 처리하는 부분은 Model이라는 부분이다. 장고는 DB를 ORM 구조(Object Related Model)로 관리한다.

응답하는 과정에서 특정 웹페이지를 보여줘야 하는 경우도 생길텐데 이는 Template에서 관리한다. 이는 html 파일등 + template 언어로 전달해줄 수 있다. template 언어를 이용하면 view에서 처리한 변수들을 html에 임베딩해서 함께 출력해줄 수 있다.


Django 프로젝트 시작하기

 

장고 프로젝트 생성

 

django-admin startproject <proj_name>

 

서버 가동

 

python manage.py runserver

 

django App 만들기

 

django-admin startapp <app_name>

 

※ 이 때 프로젝트 폴더로 이동한 후에 만들어 주어야 한다! (cd proj_name) (manage.py있는 폴더에서 만들어 주면 됨)

 

Django 관리자 계정 생성

 

python manage.py migrate => default로 만들어진 데이터베이스들에 대한 여러 정보가 반영되게 된다.

python manage.py createsuperuser

 

http://127.0.0.1:8000/admin/에서 관리자 계정으로 로그인을 하면 추가한 데이터베이스에 대해서도 관리가 가능해진다.


View로 Request Handling 하기

 

정말 간단한 View를 만들어보자

 

view.py

 

from django.shortcuts import render, HttpResponse # HttpResponse 모듈 추가

# Create your views here.
def index(request):
    return HttpResponse('Hello World!')

 

urls.py

 

from homepage.views import index # 실행할 함수 명시

urlpatterns = [
    path('admin/', admin.site.urls), # 127.0.0.1/admin/
    path('', index) # 127.0.0.1/ URL 요청이 들어오면 index 함수를 실행하라.
]

 

settings.py

 

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'homepage' # 생성한 앱 이름을 꼭 추가해주어야 한다. 그래야 앱으로 인식하여 실행을 해준다.
]

 

실행 결과

 

 


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

 

render -> html 문서를 따로 관리해주는 함수

 

render 인자 -> render ( request, '.html', {} )

 

생성한 어플 폴더 내에 template 폴더를 생성 후 그 안에

index.html 파일을 생성한 후 이를 django에 반영시켜보자 

 

visual studio code에서 ! + tab을 눌러주면 기본 html 규격 자동완성이 된다. 편리함!

 

index.html

 

<!DOCTYPE html>
<html>
    <head>
        <title>Python django example</title>
    </head>
    <body>
        <!--열린 태그--> 
        <h1>
            Title
        </h1>
        <!--닫힌 태그-->
        <p>나는 능이버섯이당</p>
    </body>
</html>

 

views.py

 

from django.shortcuts import render

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

 

settings.py

 

import os

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR,'hompage','template')],
        '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',
            ],
        },
    },
]

 

실행 결과

 


고정된 자료가 아닌 동적으로 변화하는 자료 보여주기

 

views.py

 

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

 

index.html

 

<!DOCTYPE html>
<html>
    <head>
        <title>Python django example</title>
    </head>
    <body>
        <!--열린 태그--> 
        <h1>
            Title
        </h1>
        <!--닫힌 태그-->
        <p>나는 능이버섯이당</p>
        <!-- Template language -->
        <p>{{ my_num }}</p>
    </body>
</html>

 

실행 결과

 

 

 

{{}}라는 템플릿 문법을 이용해 직접적으로 데이터를 넣어줄 수 있다.


템플릿 필터 적용

 

views.py

 

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

 

index.html

 

<!DOCTYPE html>
<html>
    <head>
        <title>Python django example</title>
    </head>
    <body>
        <!--열린 태그--> 
        <h1>
            Title
        </h1>
        <!--닫힌 태그-->
        <p>나는 능이버섯이당</p>
        <!--Template language-->
        <!--Template filter | -->
        <p>{{ my_name|length }}</p>
        <p>{{ my_name|upper }}</p>
    </body>
</html>

 

실행 결과

 


Template tag

 

views.py

 

def index(request):
    # return HttpResponse('<h1>Hello World!<h1>')
    nums= [1,2,3,4,5]
    return render(request, 'index.html', {"my_list":nums})

 

index.html

 

<!DOCTYPE html>
<html>
    <head>
        <title>Python django example</title>
    </head>
    <body>
        <!--열린 태그--> 
        <h1>
            Title
        </h1>
        <!--닫힌 태그-->
        <p>나는 능이버섯이당</p>
        {% for element in my_list %}
            {%if not element|divisibleby:"2"%}
                <p>{{element}}</p>
            {%endif%}
        {% endfor %}
    </body>
</html>

 

실행 결과

 

 

+ Recent posts