25 Fri

TIL

[프로그래머스 AI 스쿨 1기] 4주차 DAY 3

django I - What is

Flask와는 또다른 웹 프레임워크 장고. Python 기반 웹 프레임워크이며 Pinterest나 Instagram은 장고로 만들어짐.

flask vs django

방향성이 다르다.

flask : micro라는 말이 많이 붙는다. 최소한의 베이스에서 조금씩 채워나간다. 작은 프로젝트에 적합.

django : 모든 것이 내장되어 있다. 큰 프로젝트에 적합.

가상환경 설치하기

virtualenv venv

.\venv\Scripts\activate.bat

pip install django

django-admin startproject webproj

cd webproj

python manage.py runserver

http://127.0.0.1:8000/ 로 이동 후 아래 화면이 뜨면 성공적으로 완료

django 구성요소

manage.py : 장고를 실행하는 파일이며 실제로는 python - manage.py - runserver의 순서를 통해 실행된다.

__init__.py : python 모듈로써 인식되게 하는 파일

asgi.py, wsgi.py : 장고에서 서버를 운용할 때 다루는 파일

settings.py : 전반적인 장고 프로젝트에 설정 파일을 반영

  • secret key

  • debug = True : python 프로젝트를 디버깅 모드로 실행 가능

  • allowed_hosts : 어떠한 주소에 대해서 장고프로젝트가 접근 가능

  • installed_apps :장고 프로젝트는 여러 앱으로 이루어져있다. 설치된 앱 목록

  • middle_ware

  • root_urlconf : url관리를 어떤 모듈에서 진행할 것인지

  • templates : 실제 보는 화면에 관한 요소들이 담겨있음

  • wegi_application : python상에서 웹서버와 소통할 때 필요한 어플리케이션을 담당

  • databases : 프로젝트 상에서 저장되는 데이터를 담당할 곳. default는 sqlite3

  • auth_password_validation : 관리자가 패스워드를 관리하는 곳

  • language_code

  • time_zone

  • use_i18n

  • use_l10n

  • use_tz

  • static_url : css, js, images 등의 정적 파일들을 어느 폴더에 담아둘지 결정

=> setting만 봐도 플라스크보다 많은 기능을 가지고 있음을 알 수 있다. 기능을 적절하게 활용하면 정말 빠르게 웹사이트를 구축할 수 있다.

urls.py : url을 관리

  • urlpatterns : path('a', b) => 'a' 라는 요청이 들어오면 이에 대한 응답은 b에서 담당한다.

django Project and App

프로젝트는 여러가지 앱으로 구성된다. 앱은 특정 뷰나 템플릿의 모음.

ex) 스포츠 앱, 블로그 앱 등

django App 만들기

이전과는 다르게 상위 폴더에서 호출하는 것이 아닌 해당 폴더에서 호출해야 한다.

django-admin startapp homepage

__init__.py : python 모듈로써 인식되게 하는 파일

admin.py : admin 페이지에 관한 부

apps__init__.py : 앱에 대한 설정을 관

models.py : 홈페이지 모듈에서 쓰일 데이터베이스의 스키마를 클래스 형태로 정

tests.py : 테스트 케이스 설명

views.py : 뷰 관

django의 MVT Pattern

디자인 패턴 : 코드의 모듈화를 이용해서 각 코드가 독립적으로 동작해서 유기적으로 원하는 목표를 달성할 수 있게 하는 구조

장고는 MVT 패턴을 채택했다. Model View Template. MVC(Controller)를 바탕으로 장고만의 디자인 패턴 채택. 유저가 리퀘스트를 보내면 장고(서버)는 URL(urls,py)을 체크하여 어떤 경로로 요청이 왔는지 파악하고 View(views.py)에서 요청을 처리한다. 이 때 DB를 관리 및 소통을 Model에서 담당한다. 장고는 DB를 ORM 방식으로 관리한다. Object Relational Mapping. 쿼리를 통해 DB에 CRUD 접근 가능. 웹 페이지나 웹 문서를 보여주는 요청은 Template에서 관리하며 .html 파일 등으로 전달해줄 수 있다. 이 때 template 언어를 사용한다. 기본적으로 html은 로직이나 변수를 사용하는 행위는 할 수 없지만 template언어를 사용하면 html에 로직을 추가하는 행위를 할 수 있다.

django II - View

View로 Request Handling 하기

View는 model과 소통하기도 하고 template과 소통하기도 한다. View는 장고에서 중추적인 역할을 담당하는데, url이 전송되면 url의 요청을 실제로 처리하는 곳.

views.py

from django.shortcuts import render, HttpResponse

# Create your views here.
def index(request): # 장고에서 request가 인자로 주어지고 request에 대한 처리를 해줄 수 있다.
    return HttpResponse("Hello World!")

urls.py

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

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

setting.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'homepage',    #추가하지 않으면 homepage app을 찾을 수 없다.
]

1. 사용자가 http://127.0.0.1:8000 에 요청을 보낸다.

2. urls.py에서 urlpatterns을 참조하여 해당 url에 대한 처리 로직이 있는지 확인한다.

3. 이 후 views.py에서 index 함를 실행한다.

path('admin/', admin.site.urls), # 127.0.0.1/admin/

해당 주소로 접근하면 다음과 같은 페이지가 열린다.

python manage.py createsuperuser

초기에는 오류가 난다. 데이터베이스에 대한 migration이 진행되어야 하기 때문.

python manage.py migrate

default로 만들어진 데이터베이스 정보가 반영된다. 장고 프로젝트에 디비 정보가 잘 연동된 것이며 이 때 관리자 계정을 만들 수 있다.

이후 만든 관리자 계정으로 로그인 하면 다음과 같은 페이지가 열린다.

이를 flask에서 진행하면 직접 관리자 페이지를 만들어야 되지만, django는 default template를 제공한다. 이미 authentication 기능을 제공하였음.

django III - Template

view를 통해 html, css, javascript를 보여줄 수 있는데 이 때 template를 사용한다.

def index(request):
    return HttpResponse("<h3>Hello World!</h3>")

위 처럼 html 태그를 같이 입력해서 출력할 수 있다. 이 때 상당히 많은 량의 응답을 하기에는 어려운 부분이 있으므로 render를 사용한다.

views.py

def index(request):
    #return HttpResponse("<h3>Hello World!</h3>")
    render(request, 'index.html', {})

해당 request를 받아 index.html로 렌더링 하며 {}의 추가 기능을 한다는 뜻

rendering은 어떤 내용을 보여준다는 의미보다는 어떠한 데이터를 바탕으로 해당 html을 완성한다는 의미이다.

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Python django example</title>
</head>
<body>
    <h1>Title</h1>
    <p>blahblahblah</p>
</body>
</html>

setting.py

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

<body>
    <h1>Title</h1>
    <p>blahblahblah</p>
    <p>{{ my_num }}</p>
</body>

{{ }} 는 템플릿 언어 사용을 할 수 있게한다.

|, 파이프라인은 필터링을 의미한다.

{{ my_name | length }} : 길이를 출력

{{ my_name | upper }} : 모두 대문자로 출력

필터링 종류는 굉장히 많으며 다큐먼트를 참조.

for문 태그와 if문 태그

views.py

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

index.html

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

Last updated

Was this helpful?