장고의 대략적인 사이클
클라이언트인 사용자는 웹 어플리케이션을 보기 위해 요청을 한다. 이 때 Nginx, Apache 등의 웹 서버가 존재한다.
장고에서는 개발을 위한 경량 개발 웹 서버가 프로젝트 만들 때 이미 세팅되어 있다.
개발할 때 경량 웹 서버 사용하고, 배포할 때는 Nginx, Apache 사용하면 된다.
클라이언트가 요청하면 웹 서버가 요청을 맞이하고, WSGI는 웹 서버와 장고 프레임워크를 연결하기 위해 사용된다.
그 후 REQUEST로 넘어가고 사용자는 특정 주소를 요청하고 URL 파일에서 요청한 주소를 잘게 나누어준다 (파싱 과정) 잘게 나누어진 주소는 역할에 맞게 VIEW로 이동한다.
VIEW에는 웹 어플리케이션에 각각 맞는 작업을 하기위한 우리가 작성한 코드가 있다. 요청받은 데이터 저장, 데이터베이스에서 꺼내오거나, 등등 역할에 맞는 기능 개발하면 된다.
이제 템플릿으로 이동, 사용자는 RESPONSE를 받게 된다.
클라이언트는 이제 화면을 볼 수 있게 된다.
가상환경 구동 및 실행
cd myvenv\Scripts
activate.bat
작업 디렉토리로 이동
cd django_work
프로젝트 만들기
...\> django-admin startproject mysite
vscode에서 해당 프로젝트를 열면 아래와 같은 디렉토리 파악 가능
- manage.py: Django 프로젝트와 다양한 방법으로 상호작용 하는 커맨드라인의 유틸리티 입니다. manage.py 에 대한 자세한 정보는 django-admin and manage.py 에서 확인할 수 있습니다.
- mysite/ 디렉토리 내부에는 프로젝트를 위한 실제 Python 패키지들이 저장됩니다. 이 디렉토리 내의 이름을 이용하여, (mysite.urls 와 같은 식으로) 프로젝트의 어디서나 Python 패키지들을 임포트할 수 있습니다.
- mysite/__init__.py: Python으로 하여금 이 디렉토리를 패키지처럼 다루라고 알려주는 용도의 단순한 빈 파일입니다. Python 초심자라면, Python 공식 홈페이지의 패키지를 읽어보세요.
- mysite/settings.py: 현재 Django 프로젝트의 환경 및 구성을 저장합니다. Django settings에서 환경 설정이 어떻게 동작하는지 확인할 수 있습니다.
- mysite/urls.py: 현재 Django project 의 URL 선언을 저장합니다. Django 로 작성된 사이트의 “목차” 라고 할 수 있습니다. URL dispatcher 에서 URL 에 대한 자세한 내용을 읽어보세요.
- mysite/asgi.py: 현재 프로젝트를 서비스하기 위한 ASGI-호환 웹 서버의 진입점입니다. 자세한 내용은 ASGI를 사용하여 배포하는 방법 를 참조하십시오.
- mysite/wsgi.py: 현재 프로젝트를 서비스하기 위한 WSGI 호환 웹 서버의 진입점입니다. WSGI를 사용하여 배포하는 방법를 읽어보세요.
개발 서버 구동
...\> py manage.py runserver
웹 브라우저 http://127.0.0.1:8000/
아래와 같이 구동 확인
* runserver는 요청 들어올 때마다 자동으로 python 코드 다시 불러와서 굳이 서버를 재가동할 필요는 없으나 파일을 추가하는 등 몇몇 동작은 개발 서버가 자동으로 인식하지 못할 수 있음
* runserver은 내부 IP 8000번 포트로 개발 서버 띄움
* 변경하고 싶다면 커맨드라인에서 인수 전달
...\> py manage.py runserver 8080
* 서버 IP 변경하고 싶다면 포트와 함께 전달
...\> py manage.py runserver 0.0.0.0:8000
* 개발 서버 포트는 뭐지? -> 후속 포스트
작성 중 아래와 같은 오류
Import "django.shortcuts" could not be resolved from source Pylance (reportMissingModuleSource)
ctrl+shift+p 혹은 view -> command palette (명령 팔레트)에서 python select interpreter
여기에서 내 가상환경 myvenv로 선택하면 없어짐
polls/view.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
mysite/urls.py
from django.contrib import admin
from django.urls import include, path
#include 함수는 다른 URLconf를 참조할 수 있게 도움
#URL의 그 시점까지 일치하는 부분을 잘라내고 남은 문자열을 include된 URLconf로 전달
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
path함수 () -> route, view 필수/ kwargs, name
route: URL 패턴을 가진 문자열로 urlpatterns의 첫번째 패턴~일치하는 패턴 찾을 때까지 요청된 URL을 비교
view: httprequest 객체를 첫번째 인수로 하고, 경로로부터 캡처된 값을 키워드 인수로 해서 특정 view 함수 호출
kwargs: 목표한 view에 사전형으로 전달
name: URL에 이름 지으면 템플릿 포함 어디에서나 참조할 수 있게 도와줌
데이터베이스
polls/models.py
from django.db import models
#질문, 발행일
class Question(models.Model):
#question_text: Field 인스턴스의 이름
question_text = models.CharField(max_length=200)
#Question.pub_date < 필드 클래스 생성자 첫번째 위치 인수에 human-readable 이름 지정
pub_date = models.DateTimeField('date published')
#선택 텍스트, 투표 집계
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
이제 이 앱을 위한 데이터베이스 스키마 생성 + Question과 Choice 객체에 접근하기 위한 python 데이터베이스 접근 API를 생성해야 하는데 가장 먼저 프로젝트 polls 앱 설치 여부를 알려야 함
mysite/setting.py의 INSTALLED_APPS 설정에 추가해야 함
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
이제 장고는 poll 앱이 포함된 것을 알았으니
...\> py manage.py makemigrations polls
makemigrations를 실행하여 모델을 변경하고, migration으로 저장하고 싶다는 것으로 장고에게 알려줌
migration은 장고가 데이터베이스 스키마의 변경사항을 디스크에 저장하는 방법으로 polls/migrations/0001_initial.py로 새 모델에 대한 migration을 읽을 수 있음
sqlmigrate 명령은 migration 이름을 인수로 받아 실행하는 SQL 문장 보여줌
...\> py manage.py sqlmigrate polls 0001
migrate를 실행시켜서 데이터베이스에 모델과 관련된 테이블 생성
...\> py manage.py migrate
이제 대화식 python 쉘에서 Django API 가지고 놀기
...\> py manage.py shell
왜 python 입력하지 않았나요?
manage.py에 설정된 DJANGO_SETTING_MODULE 환경변수 때문이다. 이 변수는 장고에게 mysite/settings.py의 python 경로를 제공
관리자 생성하기
...\> py manage.py createsuperuser
Username: admin
Email address: admin@example.com
Password: **********
Password (again): *********
http://127.0.0.1:8000/admin/ 으로 로그인
모두 django.contrib.auth 모듈에서 제공
그런데 poll app이 관리 인덱스 페이지에서 보이지 않음!
당연함 관리자에게 질문 대상에 관리 인터페이스가 있다고 알려줘야 함
polls/admin.py
from django.contrib import admin
from .models import Question
admin.site.register(Question)
바로 새로고침하면
Questions에서 수정 가능
이제 Web-poll 애플리케이션에 공용 인터페이스인 views를 만들어보자
poll 어플리케이션에서는 네개의 view 를 만들 것이다
- 질문 “색인” 페이지 – 최근의 질문들을 표시합니다.
- 질문 “세부” 페이지 – 질문 내용과, 투표할 수 있는 서식을 표시합니다.
- 질문 “결과” 페이지 – 특정 질문에 대한 결과를 표시합니다
- 투표 기능 – 특정 질문에 대해 특정 선택을 할 수 있는 투표 기능을 제공합니다.
polls/view.py
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
path() 호출을 추가하여 새로운 뷰를 polls/urls.py에 연결
from django.urls import path
from . import views
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
이제 뷰가 뭔가를 하도록 해보자
HttpResponse를 반환하거나, Http404 같은 예외를 발생하게 해야 함
'Django' 카테고리의 다른 글
쇼핑몰 만들기 프로젝트 - aws 설정 (0) | 2023.03.13 |
---|---|
장고를 시작하며 (0) | 2023.03.13 |
python2 vs python3 (0) | 2023.02.25 |
바로 검색해 (0) | 2023.02.24 |
첫번째 장고 앱 작성하기 (2) (0) | 2023.02.24 |