[Django Tutorial] 1

jinsik·2022년 11월 4일
0
post-custom-banner

django 웹 프로그래밍 강좌 (#0 quick-install)(파이썬 설치, django 설치, 가상환경 세팅)

🏆 파이썬을 설치한 상태에서 아래와 같이 가상 환경을 생성하고 django를 설치한다.
$ pyenv virtualenv myenv
$ pyenv local myenv  #버전 스위칭
(myenv)$ pip install django #가상 환경에서 django 설치
#...
(myenv)$ python
>> import django #파이썬에서 django가 오류없이 import 되면 성공

django 웹 프로그래밍 강좌 (#1 Django app)(프로젝트 생성, app 생성, 서버 구동, django cycle)

🏆 프로젝트, 앱을 생성하고 URL과 VIEW를 맵핑하여 response를 받아본다.

프로젝트 만들기

(myenv)$ django-admin startproject mysite
  • mysite라는 이름의 프로젝트를 생성한다.
  • 들어가기에 앞서, django cycle을 되짚어 볼 필요가 있다.

Django Cycle

https://nitinnain.com/wp-content/uploads/2017/08/Django-Request-Response-Call-Cycle.png

  • WSGI
    • web server와 django framework를 연결하기 위해서 사용한다.
  • client의 request를 받고 URL resolution을 통해 적절한 view로 처리한다.
  • view는 사용자의 request의 맞게 처리할 수 있도록 database와도 연결되어 있다.
  • 그 후 알맞은 template을 골라 사용자에게 response한다.

서버 구동하기

$ python manage.py runserver
  • manage.py가 있는 프로젝트 폴더에서 위와 같이 서버를 구동시킬 수 있다.
  • 개발 목적의 로컬 서버이기 때문에 개발이 아닌 실제 운영을 위한 목적이라면 nginx나 apache를 이용하여야 한다.

앱 (Application)

  • 앱은 특정한 기능을 수행하는 웹 어플리케이션을 말한다.
  • 프로젝트는 이런 앱들과 설정을 모아놓은 것이다.
  • 프로젝트는 다수의 앱을 포함할 수 있고, 앱은 다수의 프로젝트에 포함될 수 있다.

설문조사 앱 만들기

$ python manage.py startapp polls
  • polls라는 이름의 설문조사를 담당하는 앱을 생성한다.
  • 그리고 앱 안의 views.py에서 아래와 같이 코드를 작성한다.
#in views.py
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello World.")
  • 그 후 URL 맵핑을 위해 앱에 urls.py를 만들고 코드를 작성한다.
  • mysite 프로젝트 안에 있던 urls.py에도 아래와 같이 코드를 작성한다.
#in mysite/polls/urls.py
from django.urls import path

from . import views

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

#in mysite/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]
  • include() 함수는 다른 URLconf들을 참조할 수 있도록 도와준다.
  • 예를 들어서 ‘127.0.0.1/polls/’ 라는 요청이 들어오면 polls/urls.py로 연결된다.
    • polls/urls.py에서는 index라는 view로 맵핑하게 된다.
    • views.py에는 index라는 view가 있는데 이는 “Hello World.”를 담아 response한다.
  • 결과적으로 주소창에 ‘127.0.0.1/polls/’를 입력했을 때 페이지에 “Hello World.”만 나오면 성공이다.

django 웹 프로그래밍 강좌 (#2-0 git)(git 설치, git 사용법, github 사용법)

🏆 버전 관리 시스템인 git을 설치한다.

Git

  • 코드 작성에 대한 히스토리를 관리할 수 있다.
  • 코드 공유와 협업에 용이하다.

Git 사용법

$ git init
$ git add . 
$ git commit -m "first commit"
$ git log
$ git remote add origin [URL]
$ git push origin master
  • 프로젝트 디렉토리에서 git init 명령어로 초기화를 시켜준다.
  • git add . → 현재 디렉토리의 모든 파일을 로컬 저장소에 올린다.
  • git commit -m “message” → 메시지와 함께 commit 한다.
  • git log → commit한 기록을 볼 수 있다.
  • git remote add origin https://github.com/[username]/[repository].git
    • 로컬 저장소와 원격 저장소(github의 repository)를 연결한다.
  • git push origin master
    • master branch에 로컬 저장소의 내용을 반영한다.
    • 로컬 저장소 → 원격 저장소의 master branch
  • 더 자세한 내용은 여기에서 확인할 수 있다.

django 웹 프로그래밍 강좌 (#2-1 database)(django model, model 사용법, api 사용)

🏆 Django에서 데이터베이스를 다뤄보자.

데이터베이스 설치

  • Django framework는 DBMS로 내장된 가벼운 sqlite3를 사용한다.
  • 다른 DBMS를 사용하고 싶을 경우 settings.py를 수정하면 된다.
$ python manage.py migrate
  • migrate 명령은 settings.py의 INSTALLED_APP 설정을 탐색하여 필요한 데이터베이스 테이블을 생성한다.
  • 즉, 이 명령을 수행하면 migration이 적용된다.

모델 만들기

  • 설문조사 앱 polls를 위해 Question과 Choice 두 개의 모델을 만들 것이다.
    • Question: 질문(question)과 발행일(publication date)을 위한 두 개의 필드를 갖는다.
    • Choice: 선택지(Choice)와 표(vote) 계산을 위한 두 개의 필드를 갖는다.
  • 이를 위해서, polls/models.py를 아래와 같이 수정한다. python의 클래스 형태로 표현할 수 있다.
#in polls/models.py
from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    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
    • question_text : CharField
    • pub_date : DateTimeField
  • Choice
    • question : ForeignKey (Question)
      • 외래키로 Question을 참조하고 있기 때문에 1:n 이다.
      • CASCADE: Question의 튜플이 삭제되면 따라서 삭제됨
    • choice_text : CharField
    • votes : IntegerField

Django 철학

Django의 앱들은 “꼈다뺐다”할 수 있습니다. 앱을 다수의 프로젝트에서 사용할 수 있으며, 앱을 배포할 수도 있습니다. 특정 Django 사이트에 앱들이 묶여있지 않아도 되기 때문입니다.

모델의 활성화

#in settings.py
INSTALLED_APPS = [
    'polls.apps.PollsConfig', #이부분 추가!
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
  • Django에 polls라는 앱이 있다는 것을 알려주어 연결한다.
$ python manage.py makemigrations polls
$ python manage.py migrate
  • 위와 같이 makemigrations를 실행시킴으로서 모델의 변경 사항(이 경우에는 추가)을 migration으로 저장시킬 수 있다.
  • Migration은 Django가 모델(즉, 데이터베이스 스키마)의 변경사항을 디스크에 저장하는 방법이다.
  • 둘째 줄의 migrate 명령어로 아직 적용되지 않은 migration들을 모두 수집해 실행하여 변경사항과 데이터베이스의 동기화가 이루어진다.

API 가지고 놀기

$ python manage.py shell
  • 인터프리터 파이썬 쉘로 Django API를 가지고 놀아보자.
>>> from polls.models import Choice, Question
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now()) #Question 인스턴스를 만들어 튜플로 삽입
>>> q.save() #삽입된 사항을 반영
>>> q.id #output: 1 (django에서 자동으로 만들어주는 field)
>>> q.question_text #output: "What's new?"
>>> Question.objects.all() #output: <QuerySet [<Question: Question object (1)>]>
  • 여기서 잠깐, <QuerySet [<Question: Question object (1)>]> 는 객체를 표현하는데에 별로다.
  • 그러므로 polls/models.py에 들려 각 모델마다 __str__() 메소드를 추가한다.
#in polls/models.py
from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    def __str__(self):
        return self.question_text
		def was_published_recently(self): #커스텀 메소드도 추가!
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    def __str__(self):
        return self.choice_text
  • 파일을 저장하고 shell을 다시 실행시킨다.
>>> from polls.models import Choice, Question
>>> Question.objects.all() #output: <QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(id=1) #output: <QuerySet [<Question: What's up?>]>

🏆 Django admin에 대해서 알아본다.

Django admin

  • 사용자가 아닌 관리자를 위해 관리자 계정과 관리자 페이지를 만들 수 있다.

관리자 생성하기

$ python manage.py createsuperuser
  • 입력 시 사용할 username과 email, password를 물어본다.
  • 서버를 가동하고 http://127.0.0.1:8000/admin/ 으로 관리자 페이지에 접속해보자.

  • 접속하면 위와 같이 화면에 보여지는데, 만들었던 모델 Question과 Choice가 보이지 않는다.

관리자 사이트에서 poll 앱을 변경 가능하도록 바꾸기

#in poll/admin.py
from django.contrib import admin

from .models import Question

admin.site.register(Question)
  • poll/admin.py에서 위와 같이 편집한다.
  • 관리자 사이트에 Question 모델을 등록한 것이다.

  • 다시 새로고침을 해보면 Question이 생긴 것을 확인할 수 있다.
  • 클릭해보면 저번에 만들었던 인스턴스 What’s new??가 있다.
  • 이제 GUI로 관리자 페이지를 통해 여러 조작이 가능하게 되었다.
  • 또한, 관리자 페이지는 커스터마이징이 가능하다.

배운 내용 정리

  1. 새롭게 배운 것
    • Django cycle 과정을 되짚어볼 수 있었다.
    • 모듈형 프로그래밍을 중시하는 Django 철학을 배울 수 있었다.
    • git 사용법을 알게 되었다.
    • 관리자 페이지에 대해서 알게 되었다.
  2. 배운 것 중에 모르겠는 것들
    • Django database api
  3. 모르는 것을 알기 위해 찾아본 것들
profile
공부
post-custom-banner

0개의 댓글