[TIL] 첫 번째 장고 앱 작성하기

Hailee·2020년 11월 30일
0

[ TIL ]

목록 보기
20/40
post-thumbnail

드디어 장고 세션이 시작되었다!

장고를 어떻게 읽어야 하는 지도 몰랐던 내가
dJango -> 디장고,.,? 장고,..? 왜 묵음..?

파이썬 하고! 장고 하고!
하지만 지금 상태로는 따라 치는 것만 하고 1도 기억이 안나기 때문에
차곡차곡 정리해봐야겠다.


Tutorial #01

1. 작업환경 설정하기 (startproject) & 서버 start

$ python -m django --version
$ django-admin startproject mysite

내 작업 환경에 dJango가 설치되어있는지, 어떤 버젼을 사용하는 지 확인해본 후
잘 설치되어 있다면 (<No Module named dJango>가 뜨지 않는다면!)
dJango project를 구성하는 코드를 입력하자!

내가 작업할 디렉토리로 이동한 후, mysite라는 작업할 디렉토리를 생성한다

👇🏻 구조가 독특해서 처음엔 너무 헷갈렸다.
내가 mysite라는 디렉토리를 생성하겠다고 하면 단 하나의 mysite가 생성되는 것이 아닌,
mysite라는 디렉토리가 생성되고, 내부에 실제 python 패키지들이 생성된다.

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py


패키지의 기본 구조에 대한 정보는 요로케! 👇🏻👇🏻👇🏻
(서버를 start, stop하는 manage.py, 프로젝트의 url들을 맵핑해주는 것 같은 urls.py 등....)

  • The outer mysite/ root directory
    : a container for your project. Its name doesn’t matter to Django;
    : you can rename it to anything you like.
  • 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
    : An entry-point for ASGI-compatible web servers to serve your project.
    : See How to deploy with ASGI for more details.
  • mysite/wsgi.py
    : 현재 프로젝트를 서비스하기 위한 WSGI 호환 웹 서버의 진입점입니다. How to deploy with WSGI를 읽어보세요.
$ python manage.py runserver

질리게 많이 쳤던 (그리고 앞으로 질리게 치게 될) 서버 start를 알리는 코드!
기존에는 늘 8080으로 작업했었는데, runserver 명령은 기본적으로 내부 ip의 8000번 서버를 사용한다고 한다!

$ python manage.py runserver 8080

만약 포트번호를 바꾸어주고 싶다면 요로케 👆🏻 하면 된다

2. 설문조사 앱 만들기 (startapp)

dJango에서 내가 작성하는 어플리케이션으로 python 패키지가 구성된다
dJango는 이러한 app들의 기본 디렉토리 구조를 자동으로 생성하는 도구를 제공한다고..

$ python manage.py startapp polls

앱 생성을 위해 manage.py가 존재하는 디렉토리에서 polls 디렉토리를 생성한다

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

요로케 생긴 구조의 어플리케이션 디렉토리가 생성된다.

3. 첫번째 뷰 작성하기

《polls/view.py》 파일에 요로케👇🏻 입력해주기!

from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

요로케 작성해둔 뷰를 호출하려면 이것과 연결된 URL이 있어야하는데, URLconf가 있어야 한다.
polls 디렉토리에서 이를 생성하려면 urls.py 파일을 생성해주어야 한다.

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

생성해주고 나면 요로케! 기존 polls 앱 디렉토리에 urls.py가 추가된 것을 확인할 수 있다.
(프로젝트 디렉토리, 앱 디렉토리, 그냥 작업 폴더 디렉토리의 개념이 헷갈려서 경로 문제로 많이 고생했다ㅠㅠ)

《polls/urls.py》

from django.urls import path

from . import views

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

👆🏻 view.py의 index 메서드를 호출하겠다는 것 같은데..

4. 최상위 URLconf 설정하기

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

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

《mysite/urls.py》 파일을 열고 👆🏻 코드를 추가해주어
최상위 URLconf인 mysite디렉토리 내 urls.py가 polls.urls 모듈을 바라보게 설정해주기!

urlpatterns 리스트에 include( ) 함수를 추가해준다.
해당 함수는 다른 URLconf를 참조할 수 있도록 도와준다.
include( )를 만나게 되면 URL의 그 시점까지 일치하는 부분을 잘라내고,
남은 문자열 부분은 후속처리를 위해 include된 URLconf로 전달한다고!

polls 앱에 그 자체의 URLconf(polls/urls.py)가 존재하는 한,
《/polls/》, 또는 《/fun_polls/》, 《/content/polls/》와 같은 경로, 또는 그 어떤 다른 root 경로에 연결하더라도,
앱은 여전히 잘 동작할 것입니다.

  • 언제 include()를 사용해야 하나요?
    : 다른 URL 패턴을 포함할 때마다 항상 include()를 사용해야 합니다.
    admin.site.urls가 유일한 예외입니다.

사실 url 부분이 이해가 잘 되지 않지만.. 이부분은 추가로 공부해보아야겠다.

5. 서버 start 하고 확인하기!

$ python manage.py runserver

이제 localhost:8000/polls/를 입력하면
전에 view.py 파일 내 index 뷰에 정의해둔 문자열이 보일 것!!

번외) 4. path( ) 함수의 인수

  • path( )함수는
    2개의 필수 인수인 route, view + 2개의 선택 가능한 인수인 kwargs, name까지
    모두 4개의 인수가 전달되어있다.

1) route

  • URL 패턴을 가진 문자열
  • 요청이 처리될 때, dJango는 urlpatterns의 첫번째 패턴부터 시작해서
    일치하는 패턴을 찾을 때 까지 요쳥된 URL을 리스트의 순서대로 비교
  • 패턴들은 GET, POST 의 배개변수, 도메인 이름을 검색하지 X
    오직 해당 패턴과 일치하는 것 만을 바라보고 비교
 https://www.example.com/myapp/				-> myapp/ 부분만 바라본다. 
 https://www.example.com/myapp/?page=3,			-> myapp/ 부분만 바라본다. 

2) view

  • django 에서 일치하는 패턴을 찾으면, HttpRequest 객체를 첫번째 인수로 하고,
    경로로 부터 〈캡처된〉 값을 키워드 인수로하여 특정한 view 함수를 호출

3) kwargs

  • 임의의 kwargs들은 목표한 view에 딕셔너리로 전달됨

4) name

  • URL에 이름을 지으면, 템플릿을 포함한 Django 어디에서나 명확하게 참조할 수 있음
  • 단 하나의 파일만 수정해도 project 내의 모든 URL 패턴을 바꿀 수 있음

Tutorial #02

데이터 베이스 설치 + 첫 모델 생성하고, 기존에 작성하던 polls app을 사용해서
dJango에서 자동 생성되는 관리자 사이트 만들어보기!

1. model 생성하기

polls/models.py 파일을 수정해보자

모델

  • 부가적인 메타데이터를 가진 데이터베이스의 구조(layout)
  • 내가 저장하는 데이터의 필수적인 필드, 동작을 포함하고 있다
  • model에 정의해둔 원칙에 따라 데이터 모델을 한 곳에서 정의, 유도한다.
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)

데이터베이스 - Field

  • Field 클래스의 인스턴스로서 표현
  • CharField 는 문자(character) 필드를 표현하고, DateTimeField 는 날짜와 시간(datetime) 필드 표현
    (각 필드가 어떤 자료형을 가질 수 있는지를 Django 에게 알려줌)
  • 각각의 Field 인스턴스의 이름(question_text 또는 pub_date)은 기계가 읽기 좋은 형식(machine-friendly format)의 데이터베이스 필드 명
    (Python 코드에서 사용할 수 있으며, 데이터베이스에서는 컬럼명으로 사용)
  • Field 클래스의 생성자에 선택적인 첫번째 위치 인수를 전달하여 사람이 읽기 좋은(human-readable) 이름을 지정할 수도 있음
    이 방법은 Django 의 내부를 설명하는 용도로 종종 사용되는데, 이는 마치 문서가 늘어나는 것 같은 효과가 있음
    만약 이 선택적인 첫번째 위치 인수를 사용하지 않으면, Django 는 기계가 읽기 좋은 형식의 이름을 사용합니다.
  • 몇몇 Field 클래스들은 필수 인수가 필요함
    ex) 예를 들어, CharField 의 경우 max_length 를 입력해 주어야 ..
  • 또한 Field 는 다양한 선택적 인수들을 가질 수 있음
  • ForeignKey 를 사용한 관계설정
    : Django 는 다-대-일(many-to-one), 다-대-다(many-to-many), 일-대-일(one-to-one) 과 같은 모든 일반 데이터베이스의 관계 지원

2. 모델의 활성화

polls 앱을 프로젝트에 포함시키기 위해서는 앱 구성 클래스
polls/apps.py 파일 내 PollsConfig 클래스에 대한 참조설정에 추가해주어야 한다

  • 《/mysite/settings.py/》내 INSTALLED_APPS 설정에 점으로 구분된 경로인 👇🏻 를 추가해준다!
'polls.apps.PollsConfig',

위 경로를 추가해줌으로써, 이제 dJango는 polls 앱이 포함된 것을 알고있다

$ python manage.py makemigrations polls

👆🏻 해당 코드를 입력하면 makemigrations를 실행시키면서 내가 모델을 변경했다는 사실(생성) + 변경사항
migration으로 저장할 것이라고 dJango에게 알리는 것!

migrate 명령어

  • migration을 실행시켜주고, 자동으로 데이터베이스 스키마 관리함

sqlmigrate

  • migration 이름을 인수로 받아, 실행하는 SQL문을 보여줌
$ python manage.py sqlmigrate polls 0001

👆🏻 해당 코드를 입력하면 실행되는 쿼리문을 볼 수 있다.

$ python manage.py migrate

migrate 를 통해 데이터베이스에 모델과 관련된 테이블 생성!

3. dJango 관리자 생성

$ python manage.py createsuperuser

dJango는 자체적으로 관리자 사이트를 생성할 수 있다.
모델에 대한 관리용 인터페이스를 자동으로 생성해주는 것!
(사이트 방문자를 위한 것이 아닌, 사이트 관리자용 페이지!)

dJango는 Lawrence Journal-world 신문사의 프로그래머가 처음 개발했다고 한다
그래서 그런지 컨텐츠 게시자공개의 구분이 명확하다

  • 컨텐츠 게시자가 시스템에 추가한 항목은 공개 사이트에 노출된다
  • 컨텐츠를 편집할 수 있는 통합 인터페이스를 간편하게 생성해주는 것!

원하는 사용자 이름, 이메일, 비밀번호를 입력하고 서버 start!

$ python manage.py runserver

웹 브라우저를 열어서 local 주소의 /admin/으로 이동하면 로그인 화면을 볼 수 있다

우리가 작성한 poll app을 관리자 사이트에서 확인하려면
polls/admin.py 파일을 다음과 같이 수정해주면 된다.

from django.contrib import admin

from .models import Question

admin.site.register(Question)

Question object이 admin interface를 가지고 있다고 admin에게 알려주어야 하므로
해당 파일을 수정해주면
dJango가 이를 인식해서 관리자 인덱스 페이지에 polls - Question을 등록할 것!

👇🏻👇🏻 마무리 화면!

profile
웹 개발 🐷😎👊🏻🔥

0개의 댓글