Django

첫 번째 장고 앱 작성하기

위니윈 2023. 2. 22. 00:38

 

장고의 대략적인 사이클

 

클라이언트인 사용자는 웹 어플리케이션을 보기 위해 요청을 한다. 이 때 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