프로그래머스 인공지능 데브코스 3기 수업내용 정리 #19(Web Application with Django)

Clay Ryu's sound lab·2022년 1월 4일
0

Note for 2021

목록 보기
20/33

django 알아보기

python 기반 웹 프레임워크
pinterest instagram에서 사용이 됨.
우리가 배웠던 flask와 비교해서는 둘다 같은 프레임워크지만 이 둘이 지향하는 방향이 다르다. flask는 '마이크로'로서 최소한의 기능을 가지고 여기에 살을 붙여가는 방식(추가적인 imports)이다. django는 많은 것들을 이미 갖추고 있기에 우리가 그 폼을 채워가면 된다.

설치하기

cmd 환경에서 flask때와 마찬가지로 프로젝트 폴더에 가상 환경을 만들어준다.
cd django-proj
virtualenv venv
#activate 실행을 위해 디렉토리 이동
cd venv
cd Scripts
activate
#설치 후 확인
pip install django
pip freeze
#디렉토리를 다시 옮겨준후 webproj를 만든다.
django-admin startproject <proj-name>
#
cd webproj
python manage.py runserver
-> http://127.0.0.1:8000/

django의 구성요소

__init__.py : webproj 폴더가 python 모듈로서 인식되게 하기 위함
asgi.py, wsgi.py : 서버에서 실제로 django프로젝트를 가동할때 다룸
settings.py : 전반적인 프로젝트의 설정사항을 반영, 굉장히 많은 기능들이 이미 내장되어 있다는 것을 알 수 있다.
urls.py : url을 관리하는 곳

Project 안에는 다양한 App들이 있다. 네이버로 예를 들면 blog, sports, cafe로서 django는 각각을 독립적으로 만들어 줄 수 있다는 장점이 있다.

cd webproj
django-admin startapp homepage 

admin.py : admin page에 관한 부분
apps.py : app에 대한 설정
models.py : 홈페이지에서 쓰일 데이터 베이스의 스키마 등등을 클래스의 형태로 작성
tests.py : test case
views.py : homepage에서 view를 관리

우리는 필요한 부분을 채워가며 기능을 구현해나가면 된다.

django의 MVT Pattern


MVC : model view controller
MVT : model template view
장고 프레임워크에서는 View를 Template, Controller는 View라고 표현하며, MVC를 MVT 패턴이라고 한다. 모델은 데이터 베이스에 저장되는 데이터를 의미하는 것이고, 템플릿은 사용자에게 보여지는 UI부분을, 뷰는 실질적으로 프로그램 로직이 동작하여 데이터를 가져오고 적절하게 처리한 결과를 템플릿에 전달하는 역할을 수행한다.

어떤 유저가 request를 보낸다.
server django는 URL(urls.py)를 체크하고
이것을 View(views.py)로 보낸다.
model은 DB(ORM object related model)와
Teplate은 html파일로 전달 template언어를 이용해서 html을 for if등을 사용 가능
사용자에게 response

View로 requenst handling하기

view는 django에서 url 처리를 담당한다.

#views.py의 초기 코드
from django.shortcuts import render

# Create your views here.
from django.shortcuts import HttpResponse, render

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

어떤 url경로에서 위의 index를 불러올지 정하기 위해서 webproj폴더에서 urls.py를 수정한다.

#urls.py의 초기코드
from django.contrib import admin
from django.urls import path
#admin이라는 요청에 대해서 admin.site.urls을 rseponse
urlpatterns = [
    path('admin/', admin.site.urls),
]
from django.contrib import admin
from django.urls import path
from homepage.views import index

urlpatterns = [
    path('', index) # 127.0.0.1/일때 index를 실행하라
    path('admin/', admin.site.urls),
]

homepage폴더를 사용하기 위해서는 webproj의 settings.py에서 INSTALLED_APPS에 'homepage'를 입력해주어야 한다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'homepage',
]
#dc webproj
python manage.py runserver
과정은 사용자가 127.0.0.1에 요청을 보낸다.
urls.py에서 path를 확인한다. 그후 index를 실행하게 된다.
views.py에서 index를 실행한다.

django의 urls/admin


django앱에 대한 관리자 계정이다.
cmd환경에서 계정을 만들 수 있다.

#SQlite를 연동
python manage.py migrate
python manage.py createsuperuser


django는 template으로 admin 사이트를 제공한다.

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

view <- HTML CSS Javascript
template 언어를 사용

#views.py에 html 헤더를 사용
def index(request):
    return HttpResponse("<h1>Hello World!</h1>")

#django에는 html문서를 따로 관리해줄 수 있는 render 함수를 제공한다.
render(request, '.html', {})

코드 리팩토링, migration

template을 새로 만든다.
새로운 html 파일을 만들어야한다.
html을 각 앱의 디렉토리에서 관리한다.
homepage에 template이라는 폴더를 만든다.
template에 index.html을 만든다.

html은 크게 head body로 나뉘어 진다.

<!DOCTYPE html> # html 5로 작성됨을 밝힘
</html>
  <head> # html에 대한 meta적인 정보, 뒤에서 이루어지는 정보
      <title>Python django example</title>
  </head>

  <body> # html을 구성하는 실제 요소를 적어준다.
      <h1>Title</h1>
      <p>blah blah blah</p>
  </body>
</html>

views.py를 수정한다.

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

settings.py에서 html파일이 어디에 있는지를 명시해주어야 한다.

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',
            ],
        },
    },
]
'DIRS': [BASE_DIR + 'homepage/teplate/index.html'],

BASE_DIR을 더해주는 것은 폴더가 컴퓨터에서 어디에 위치한지를 알려주어야 한다.

BASE_DIR = Path(__file__).resolve().parent.parent

디렉토리를 합쳐주는 전문적인 함수 os를 사용할 수 있다.

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

views.py에서 render를 알아보자.

어떤 데이터({ })를 바탕으로 html안의 내용을 완성한다. 통합적인 template을 구성

def index(request):
    number = 10
    render(request, 'index'.html, {"ny_num" : number})
<!DOCTYPE html>
</html>
    <head>
        <title>Python django example</title>
    </head>

    <body>
        <h1>Title</h1>
        <p>blah blah blah</p>
        <p>{{ my_num }}</p> # template언어의 사용
        #views에서 만든 my_num을 index.html에서 사용한다.
    </body>
</html>

html파일 자체로는 정해진 것만을 보여줄 수 있지만 template언어를 이용하면 어떤 내용을 가변적으로 수정할 수 있다.

조건, 반복과 template filter

template filter

<p>{{ my_name }}</p> -> Michael
<p>{{ my_name | length }}</p> -> 7
<p>{{ my_name | upper }}</p> -> MICHAEL
#document를 활용해서 더 알아볼것

template tag
django template언어를 사용하는 것

{% tage ... %}
{% endtage ... %}

#views.py
def index(request):
    nums = [1,2,3,4,5]
    render(request, 'index'.html, {"ny_list":nums})
#index.html
{% for element in my_list %}
            <p>{{ element }}</p>>
        {% endfor %}
{% for element in my_list %}
            {% if element|divisibleby:"2" %}
            <p>{{ element }}</p>>
            {% endif %}
{% endfor %}
-> 2, 4
{% for element in my_list %}
            {% if not element|divisibleby:"2" %}
            <p>{{ element }}</p>>
            {% endif %}
{% endfor %}
-> 1, 3, 5

django 프로젝트로 게시판 만들어보기

#cmd 환경
django-admin startproject web_study #프로젝트 만들기
cd web_study #경로이동
python manage.py migrate #데이터베이스
python manage.py runserver #서버 확인해보기
#앱을 만들기
python manage.py startapp main
#settings.py 앱을 등록해주기
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'main',
]

https://wikidocs.net/91427 참고
https://wikidocs.net/70649 참고

profile
chords & code // harmony with structure

0개의 댓글