728x90
4.4 Database 선택
- 네 가지 메인 데이터베이스(PostgreSQL, MySQL, Oracle, SQLite) 지원
- 주요 데이터베이스 지원
- PostgreSQL:
- 강력한 기능과 확장성을 제공하는 오픈 소스 데이터베이스.
- 복잡한 쿼리와 데이터 무결성 요구사항을 처리하는 데 적합.
- MySQL:
- 높은 성능과 안정성을 제공하며, 많은 웹 애플리케이션에서 사용되는 오픈 소스 데이터베이스.
- 대규모 데이터베이스 및 읽기 집약적인 애플리케이션에 적합.
- Oracle:
- 강력한 기능과 보안성을 제공하는 상용 데이터베이스.
- 대규모 엔터프라이즈 환경에 적합하며, 고가용성과 고성능을 제공.
- SQLite:
- 파일 기반의 가벼운 데이터베이스로, 소규모 애플리케이션이나 학습, 테스트 환경에 적합.
- 높은 동시성을 지원하지 않지만, 주로 읽기 전용인 응용 프로그램에는 좋은 선택.
- SQL 및 NoSQL 데이터베이스를 다양한 레벨로 지원하는 커뮤니티 라이브러리도 있습니다. 이는 애플리케이션의 특정 요구에 따라 다양한 데이터베이스를 선택할 수 있도록 도와줍니다.
- 생산과 개발에 동일한 데이터베이스를 선택하는 것을 추천(호환성 문제 때문)
- PostgreSQL:
-
- 생산과 개발 환경의 동일성: 호환성 문제를 피하기 위해 생산과 개발에 동일한 데이터베이스를 사용하는 것을 추천합니다. 이는 환경 간의 차이로 인해 발생할 수 있는 문제를 최소화합니다.
- 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/
- 장고 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 함
- 정적 이란?
- HTTP Request 에 맞는 웹페이지를 Response 해주는 기능을 가짐(Static, 정적임)
- 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
- 웹 브라우저에서 웹서버 시작 확인
- https://127.0.0.1:8000
- 8000은 Django가 사용하는 포트 번호
- 생성된 폴더-파일 구조
- 웹서버 설정 수정
# 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'
- 웹서버 설정 URL 확인
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 # 생성한 마이그레이션 저장
- Model을 Admin 페이지에 적용시키기
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
'PYTHON-BACK' 카테고리의 다른 글
#파이썬 26일차_MYSQL2 (0) | 2024.08.06 |
---|---|
#파이썬 24일차_Django_개발환경/동작원리/실습2/Todo list웹 서비스 만들기 (0) | 2024.08.01 |
#파이썬 22일차_Django (0) | 2024.07.30 |
#파이썬 22일차_GitHub Action (0) | 2024.07.30 |
#파이썬 21일차_GitHub Action + CI/CD (0) | 2024.07.29 |