본문 바로가기

PYTHON-BACK

#파이썬 23일차_Django_개발환경/동작원리/실습1

728x90

4.4 Database 선택

  • 네 가지 메인 데이터베이스(PostgreSQL, MySQL, Oracle, SQLite) 지원
  • 주요 데이터베이스 지원
    1. PostgreSQL:
      • 강력한 기능과 확장성을 제공하는 오픈 소스 데이터베이스.
      • 복잡한 쿼리와 데이터 무결성 요구사항을 처리하는 데 적합.
    2. MySQL:
      • 높은 성능과 안정성을 제공하며, 많은 웹 애플리케이션에서 사용되는 오픈 소스 데이터베이스.
      • 대규모 데이터베이스 및 읽기 집약적인 애플리케이션에 적합.
    3. Oracle:
      • 강력한 기능과 보안성을 제공하는 상용 데이터베이스.
      • 대규모 엔터프라이즈 환경에 적합하며, 고가용성과 고성능을 제공.
    4. SQLite:
      • 파일 기반의 가벼운 데이터베이스로, 소규모 애플리케이션이나 학습, 테스트 환경에 적합.
      • 높은 동시성을 지원하지 않지만, 주로 읽기 전용인 응용 프로그램에는 좋은 선택.
     
    • SQL 및 NoSQL 데이터베이스를 다양한 레벨로 지원하는 커뮤니티 라이브러리도 있습니다. 이는 애플리케이션의 특정 요구에 따라 다양한 데이터베이스를 선택할 수 있도록 도와줍니다.
    • 생산과 개발에 동일한 데이터베이스를 선택하는 것을 추천(호환성 문제 때문)
    • 생산과 개발 환경의 동일성: 호환성 문제를 피하기 위해 생산과 개발에 동일한 데이터베이스를 사용하는 것을 추천합니다. 이는 환경 간의 차이로 인해 발생할 수 있는 문제를 최소화합니다.
    • ORM(Object-Relational Mapper) 사용: ORM을 사용하면 데이터베이스 간의 차이 대부분을 추상화할 수 있습니다. 이는 개발자가 데이터베이스에 직접 접근하지 않고 객체 지향 프로그래밍 언어를 사용하여 데이터베이스를 조작할 수 있게 해줍니다.
    • 잠재적 문제 피하기: 일부 데이터베이스에는 아직 해결되지 않은 잠재적 문제많이 존재, 따라서 이러한 문제를 피하고 사용을 권장합니다.

4.5 Django 설치하기

  • 가상환경에 설치하는 것을 권장함 (메인에 하면 이슈 해결에 많은 어려움 격을 수 있음)
  • 가상환경에서는 메모리 문제가 가장 큼 (최근에는 그냥 메모리 추가하는  것으로 해결가능함)
!pip install django
!python -m django --version

 

4.6 기본 코드 작성해보기

https://docs.djangoproject.com/ko/5.0/intro/tutorial01/

 

첫 번째 장고 앱 작성하기, part 1 | Django 문서

The web framework for perfectionists with deadlines.

docs.djangoproject.com

  • 장고 5점대 버전으로 장고 한글로 튜토리얼 제공

4.6.1 django 버전 확인해보기

import django
print(django.get_version())

 

4.6.2 심플 웹서버 실행해 보기

%mkdir django_test
%cd django_test

 

!django-admin startproject mytestsite
%cd mytestsite

 

!python manage.py runserver

 

  • 웹 브라우저에서 http://127.0.0.1:8000/ 로 접속하면 심플 웹서버가 실행 중임을 확인할 수 있음

4.6.2.1 mytestsite에 들어있는 파일 확인

1. manage.py

manage.py는 Django 프로젝트와 다양한 방법으로 상호작용할 수 있는 커맨드라인 유틸리티입니다. 이를 통해 서버를 시작하거나, 데이터베이스 마이그레이션을 수행하거나, 새로운 앱을 생성하는 등 다양한 작업을 할 수 있습니다.

2. mysite 디렉토리

mysite/ 디렉토리는 프로젝트를 위한 실제 Python 패키지들이 저장된 디렉토리입니다. 이 디렉토리 내의 모듈들은 프로젝트 전반에서 사용되며, mysite.urls와 같은 형식으로 임포트할 수 있습니다.

  • mysite/init.py:
    • 이 파일은 Python이 해당 디렉토리를 패키지로 인식하도록 하는 빈 파일입니다.
  • mysite/settings.py:
    • Django 프로젝트의 환경 설정 및 구성을 저장하는 파일입니다. 데이터베이스 설정, 설치된 앱, 미들웨어, 템플릿 설정 등 다양한 환경 설정이 이 파일에 포함됩니다.
  • mysite/urls.py:
    • Django 프로젝트의 URL 선언을 저장하는 파일로, 사이트의 "목차" 역할을 합니다. 여기서 URL 패턴과 뷰를 매핑하여 사용자 요청을 처리합니다.
  • mysite/asgi.py:
    • ASGI(Asynchronous Server Gateway Interface) 호환 웹 서버를 위한 진입점 파일입니다. Django의 비동기 기능을 지원하며, ASGI 서버를 통해 프로젝트를 서비스합니다.
  • mysite/wsgi.py:
    • WSGI(Web Server Gateway Interface) 호환 웹 서버를 위한 진입점 파일입니다. 전통적인 동기 방식의 웹 서버와 호환되며, 일반적으로 배포 시 사용됩니다.

4.6.2.2 Web Server 기술 분류

  • Web Server
    • HTTP Request 에 맞는 웹페이지를 Response 해주는 기능을 가짐(Static, 정적임)
      • 정적 이란?
        • Web Server 에 있는 웹페이지를 그대로 Response 함
        • 웹페이지가 변경 되지 않는 동일한 웹페이지를 Response 함

 

 

  • Web Application Server
    • Web Server + Web Container( = Web Server + CGI) = WAS(Web Application Server)
    • Web Server 가 동적으로 동작하면 Web Application Server
    • 동적이란?
      • Request 에 따라 데이터를 가공하여 생성된 웹페이지를 Response
      • Request 에 따라 Response 되는 웹페이지가 달라짐

 

 

  • WSGI (Web Server Gateway Interface)
    • Web Server 의 Request 를 Python Application 으로 보내주고 Response 를 받아서 Web Server 로 보내주는 Web Server Gateway Interface 임
    • Web Server 의 Request 를 Callable Object 를 통해 Application 에 전달Callable Object 는 Function 이나 Object 의 형태로 HTTP Request 에 대한 정보(Method, URL, Data, …), Callback 함수 정보를 전달
    • 2003년 파이썬 표준으로 WSGI 가 나온 이후 현재까지 사용됨 (시간이 오래됨으로 현재 상황에 안맞는것이 있어 조정이 많이 일어남)
    • WSGI Middleware 는 WSGI 의 구현체로 Request 를 Flask, django 와 같은 Web Framework 에 연결하는 WSGI server의 역할을 함(gunicorn, uWSGI, Werkzeug 등이 있음)
    • WSGI 는 Synchronous 하게 작동하기에 동시에 많은 Request 를 처리하는데 한계가 있음(Celery, Queue 를 이용하여 성능 향상 가능), (동시접속이 많이 필요한 경우는 사용 못함)

 

 

  • ASGI (Asyncronous Server Gateway Interface) (비동기화)
    • WSGI 와 비슷한 구조를 가지나 기본적으로 모든 요청을 Asynchronous 로 처리하는게 다름
    • WSGI 에서 지원 되지 않는 Websocket, HTTP 2.0 을 지원함
    • ASGI 는 WSGI 와 호환됨(=ASGI는 WSGI의 상위 버전임)
    • WSGI 가 Synchronous 하게 작동함으로써 발생하는 한계를 해결하기 위해Uvicorn 과 같은 Asynchronous Server Gateway Interface 가 나옴 → WSGI의 단점은 요청을 받고 응답을 반환하는 단일 동기 호출 방식이라는 것 → 웹소켓을 사용할 수 없음. wsgi.websocket을 사용할 수 있지만, 표준화안됨
    • 단일 astnchronous(비동기) 호출이 가능 하므로 여러 이벤트를 주고받을수 있음 → 대용량 트래픽 처리를 유연하게 할 수 있음

 

  • Django는 비동기 웹 서버와 애플리케이션을 위한 새로운 Python 표준인 ASGI_에 대한 배포를 지원
  • Django의 :djadmin:’start project’ 관리 명령은 프로젝트에 필요한 대로 수정할 수 있는 기본 ASGI 구성을 설정하고 ASGI 호환 애플리케이션 서버를 사용하도록 지시
 
  • ASGI는 애플리케이션 서버가 코드와 통신하기 위해 사용하는 "애플리케이션" 호출 링크를 제공
  • 일반적으로 서버가 접근할 수 있는 파이썬 모듈에서 "애플리케이션"이라는 이름의 객체로 제공됨
  • :djadmin:’start project’ 명령은 :file:’/asgi 파일을 생성함.그러한 ``응용프로그램”을 포함한 py는 호출할 수 있음
  • 개발 서버(‘runserver’)에서 사용하는 것이 아니라 ASGI 서버가 개발 또는 프로덕션에서 사용할 수 있음
  • ASGI 서버는 대개 문자열로 호출할 수 있는 응용 프로그램의 경로를 택하는데 대부분의 Django 프로젝트에서 이것은 ``my project.asgi: application”처럼 보일 것

Django 기본 컨셉 익히기

 

1. Django 시작하기

  • 가상환경 설정
python -m venv django_photolist
cd django_photolist
Windows의 경우: ./Scripts/activate
  • Django 설치 및 확인
pip install django

python -m django --version

python --version

 

  • Project 시작
django-admin startproject photoweb .

 

  • 앱 추가
    • Django에서 앱은 프로젝트 내에서 특정 기능을 수행하는 독립적인 모듈을 가리킴
    • 앱은 프로젝트의 기능을 더 작은 구성 요소로 나누어 코드베이스를 구성하는 데 도움을 줌
      • 예: 블로그 프로젝트
        • 인증 및 권한 부여 전용 앱
        • 블로그 게시물 전용 앱 등
    • 앱의 특징
      • 모듈화: 앱은 특정 기능을 수행하는 독립적인 코드와 리소스의 모음
      • 재사용성: 앱은 다른 프로젝트에서도 쉽게 재사용할 수 있음
      • 구성 요소: 앱은 템플릿, URL, 모델, 뷰 등을 포함하는 모듈
python manage.py startapp photolist

 

  • 웹서버 실행
python manage.py runserver

 

  • 웹 브라우저에서 웹서버 시작 확인
  • 생성된 폴더-파일 구조

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'photolist',    # 추가할 것
]

 

#TIME_ZONE = 'UTC'            # 시간대를 한국으로 바꿀 것
TIME_ZONE = 'Asia/Seoul'

2. Django 프로젝트 구조 살펴보기

 
  • MTV (Model-Template-View) 패턴
    • Django에서는 MTV 패턴으로 전반적인 개발을 진행함
    • 어떤 패턴으로 개발을 진행 → 작업 시, 규칙처럼 정해진 방식이 있고, 그 방식을 따라가며 요구하는 내용을 순서대로 채워나가는 것으로 개발을 진행한다는 의미

    • Model: 앱의 데이터와 관련된 부분을 다룸
    • Template: 사용자에게 보이는 부분을 다룸
    • View: Model과 Template의 사이에서 Model의 메시지를 Template으로 전달, Template에서 발생하는 이벤트를 처리하는 부분

 

# 계정 만들기
python manage.py createsuperuser

 

  • 오류 발생
# Migration 오류 수정
python manage.py migrate

python manage.py createsuperuser

  • 계정 만들기 재시도
    • ID : jiung
    • email : kgw08003@naver.com
    • password : 1234

python manage.py runserver

이후 http://127.0.0.1:8000/admin/ 에서 로그인 진행

 

3. Django Model 알아보기

 
  • Model
    • 앱의 데이터와 관련된 부분을 다루는 영역
    • 데이터베이스에 저장될 데이터의 모양을 정의하고 관련된 일부 기능들을 설정해주는 영역
    • 현실 세상을 코드로 옮기는 과정이라고 생각할 수 있음
  • Model 만들기

photolist/mdoels.py에서 작업 진행

 

from django.db import models
 
class Photo(models.Model):
    title = models.CharField(max_length=50)
    author = models.CharField(max_length=50)
    image = models.CharField(max_length=200)
    description = models.TextField()
    price = models.IntegerField()

 

  • Model 적용시키기
python manage.py makemigrations
python manage.py migrate # 생성한 마이그레이션 저장

 

from django.contrib import admin
from .models import Photo
from photolist.models import Photo # 두 번째와 같은말임, 위에꺼는 현위치와 동일한 위치에 models에서 불러온다는 뜻
# Register your models here.
admin.site.register(Photo)

 

4. Django Template 알아보기

 
  • Template
    • 사용자에게 보이는 부분 → 웹페이지의 골격이라고 할 수 있는 HTML로 작성된 부분
    • 일반 HTML 작성 방법과 거의 동일하나 Template Tag를 사용한다는 점이 다름
    • Template Tag: HTML이 파이썬 코드로부터 데이터를 바로 넘겨받아서 처리할 수 있는 도구

5. Django View, URL 알아보기

  • View
    • Model과 Template을 이어주는 다리와 같은 역할
    • Model을 통해 데이터에 접근하여 Template으로부터 요청받은 데이터를 뽑아와 Template에게 답변으로 보내줌
    • Model이 Django 프로젝트의 핵심이라면 View는 코드 중에서 가장 많은 비중을 차지하는 요소

  • URL
    • 라우팅의 역할과 동시에 서버로 해당 주소에 할당된 리소스를 요청하는 역할을 담당
    • 여기서의 리소스는 HTML 페이지뿐만 아니라 내부를 채우는 데이터 등을 포함하는 개념임

6. 서비스 기능 하나씩 구현하기

6.1 사진 목록 화면 만들기
  • Template
  • photolist 안에 templates 폴더 만들어서 photo_list.html 만들어서 아래 코드 삽입해줌
# photolist/templates/photo_list.html

<html>
  <head>
    <title>Photo App</title>
  </head>
  <body>
    <h1><a href="">사진 목록 페이지</a></h1>
    <section>

      <div>
        <h2>
          <a href="">title</a>
        </h2>
        <img src="" alt="" width="300" />
        <p>photo.author, photo.price원</p>
      </div>

      <div>
        <h2>
          <a href="">title</a>
        </h2>
        <img src="" alt="" width="300" />
        <p>photo.author, photo.price원</p>
      </div>

      <div>
        <h2>
          <a href="">title</a>
        </h2>
        <img src="" alt="" width="300" />
        <p>photo.author, photo.price원</p>
      </div>

    </section>
  </body>
</html>

 

  • View
# photolist/views.py
from django.shortcuts import render
from photolist.models import Photo
 

def photo_list(request):
    photos = Photo.objects.all()
    return render(request, 'templates/photo_list.html', {})

 

  • URL

photolist에 urls.py 생성

# photolist/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.photo_list, name='photo_list')
]

 

photoweb에 잇는 urls.py 파일 수정, 아래 내용으로

# photoweb/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('photolist.urls')),
]

 

View

# photolist/views.py
from django.shortcuts import render, get_object_or_404, redirect
from .models import Photo
from .forms import PhotoForm


def photo_list(request):
    photos = Photo.objects.all()
    return render(request, 'photo_list.html', {'photos': photos})
  • Template 수정
  • 동일 내용 3번 나오니까 수정하자!
# photolist/templates/photo_list.html

<html>
  <head>
    <title>Photo App</title>
  </head>
  <body>
    <h1><a href="">사진 목록 페이지</a></h1>
    <section>
      {% for photo in photos %}
      <div>
        <h2>
          <a href="">{{ photo.title }}</a>
        </h2>
        <img src="{{ photo.image }}" alt="{{ photo.title }}" width="300" />
        <p>{{ photo.author }}, {{ photo.price }}원</p>
      </div>
      {% endfor %}
    </section>
  </body>
</html>

 

6.2 사진 게시물 보기 화면 만들기

  • Template
  • templates 내에 photo_detail.html 파일 생성
# photolist/templates/photo_detail.html

<html>
  <head>
    <title>Photo App</title>
  </head>
  <body>
    <h1>{{ photo.title }}</h1>
    <section>
      <div>
        <img src="{{ photo.image }}" alt="{{ photo.title }}" width="300" />
        <p>{{ photo.description }}</p>
        <p>{{ photo.author }}, {{ photo.price }}원</p>
      </div>
    </section>
  </body>
</html>

 

  • View
# photolist/views.py
from django.shortcuts import render, get_object_or_404

def photo_list(request):
    photos = Photo.objects.all()
    return render(request, 'photo_list.html', {'photos': photos})


def photo_detail(request, pk):
    photo = get_object_or_404(Photo, pk=pk)
    return render(request, 'photo_detail.html', {'photo': photo})

 

  • URL
# photolist/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.photo_list, name='photo_list'),
    path('photo/<int:pk>/', views.photo_detail, name='photo_detail'),
]

 

  • Template

photo_list.html 수정

<html>
  <head>
    <title>Photo App</title>
  </head>
  <body>
    <h1><a href="">사진 목록 페이지</a></h1>
    <section>
      {% for photo in photos %}
      <div>
        <h2><a href="{% url 'photo_detail' pk=photo.id %}">{{ photo.title }}</a></h2>
        <img src="{{ photo.image }}" alt="{{ photo.title }}" width="300" />
        <p>{{ photo.author }}, {{ photo.price }}원</p>
      </div>
      {% endfor %}
    </section>
  </body>
</html>

 

 

춘식이 클릭해서 들어가면 photo app으로 아래와 같이 연결됨

 

  • 이미지 불러오는것은 아직 경로 설정을 안함 (차후 진행할 예정)

 

728x90