21.12.22 Django 튜토리얼 Part1 간단한 설문조사(Polls) 어플리케이션

2021. 12. 25. 21:47작업/Django

https://docs.djangoproject.com/ko/4.0/intro/tutorial01/

설문조사 어플리케이션 만들어보자

Part1 사람들이 설문 내용을 보고 직접 투표할 수 있는 개방된 사이트

Part2 관리자가 설문을 추가,변경,삭제할 수 있는 관리용 사이트

 

참고: 내가 사용할 것은 python3와 django 4.0버전

 

프로젝트란

장고 인스턴스에 대한 모든 설정을 담은 파이썬 패키지 - 디렉토리 또는 코드 - . 데이터베이스 설정, 장고 설정 및 애플리케이션 설정 등을 포함함.

 

속성

- 쿼리셋 : 데이터베이스로부터 얻어낸 행의 집합을 나타내는 개체

- 슬러그 : 짧은 라벨로서 문자,숫자,밑줄 또는 하이픈만을 포함. 일반적으로 url에 사용. 

https://www.djangoproject.com/weblog/2008/apr/12/spring/

저 spring부분이 슬러그임

- 템플릿 : 데이터를 표현하기 위한 형식으로서 쓰이는 텍스트의 덩어리. 

- 뷰 : 페이지 렌더링을 담당하는 함수

 

커맨드라인에서 cd 명령으로 코드를 저장할 디렉토리로 이동 한 후, 다음의 명령을 수행합니다.

단 디렉토리 만들 때 test나 django라는 예약어로 만들면 안된다.

$ django-admin startproject ex_1222

ex1.py는 이미 있던 파일.. python3 잘 있나 print(hello)하는 파일임.

그럼 내가 만든 저 프로젝트 디렉토리는 어떻게 생겼나

프젝폴더이름/
    manage.py
    프젝폴더이름/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

이렇게 생김

manage.py : 장고 프로젝트와 다양한 방법으로 상호작용하는 커맨드라인의 유틸리티라고 함.

 

프젝폴더이름/ : 디렉토리 내부에는 프로젝트를 위한 실제 python패키지들이 저장된다. 이 디렉토리 내 이름을 이용해 프로젝트의 어디서나 python 패키지들을 import 할 수 있다.

 

프젝폴더이름/__init__.py : 파이썬으로 하여금 이 디렉토리를 패키지처럼 다루라고 알려주는 용도의 단순한 빈 파일이다. 

프젝폴더이름/asgi.py

프젝폴더이름/settings.py : 현재 장고 프로젝트의 환경 및 구성을 저장함. 

프젝폴더이름/urls.py 현재 장고 프로젝트의 URL 선언을 저장. 장고로 만들 내 사이트의 목차라고 할 수 있다.

프젝폴더이름/wsgi.py: 현재 프로젝트를 서비스하기 위한 WSGI 호환 웹 서버의 진입점.(배포방법일까?)

WOW~

개발 서버 : django 프로젝트가 제대로 동작하는지 본다.

 

기본적으로 runserver 명령은 내부 IP의 8000번 포트로 개발 서버를 띄운다.

만약 이 서버의 포트를 8080으로 변경하여 서버를 시작하고 싶다면, 다음과 같은 것을 입력한다

$ python3 [manage.py가 있는 경로] runserver 8080

 

서버의 IP를 변경하려면 포트와 함께 전달하면 된다. ex 사용 가능한 모든 공용 IP를 청취하려면 이를 사용.

$ python3 [manage.py가 있는 경로] runserver 0:8000

** 0 ** **은 ** 0.0.0.0 **의 지름길입니다..라는데 무슨 말인지 모르겠음

 

또한 runserver라는 저 명령에서 개발 서버는 요청이 들어올 때마다 자동으로 python 코드를 다시 불러온다.

코드의 변경사항을 반영하기 위해서 굳이 다시 python3 메니지py runserver를 안 쳐도 된다. (서버 재기동)

그러나 파일을 추가하는 등 몇몇 동작은 개발서버가 자동으로 인식하지 못하니까 그럴 때는 서버 재기동 해주자.

 

그럼 이제 본격적으로 설문조사 app을 생성하기 위해 manage.py가 존재하는 디렉토리에서 이렇게 친다.

오호라 polls라는 디렉토리가 생겼다.

그럼 이제 첫 번째 뷰를 만들어보자

polls/views.py를 열어서 파이썬 코드를 입력한다.

진짜 친절하게 여기에 뷰를 적으라고 써져있다.

HttpResponse를 import하고, index()라는 함수를 만들었다.

장고에서 가장 간단한 형태의 뷰로, 뷰를 호출하려면 이와 연결된 URL이 있어야한다. 그러려면 URLconf라는 것이 필요하다.

polls디렉토리에서 URLconf를 생성하려면 urls.py라는 파일을 생성해야 한다.

이거 경로 잘못되었다. 맨 밑에 추가사항 있다.

약간 flask의 @app.route같은 느낌일까

django.urls에서 path라는 함수를 import하고, 현재 위치에서 만들었던 views.py라는 파이썬파일을 import해온다.

그리고 views.py안에 있는 함수인 index()함수를 사용하고, 걔 이름을 'index'라고 짓는다.

 

path()함수는 path( route , view , kwargs , name) 까지 4개의 인수를 전달받는다. route와 view는 필수인수이고, 나머지는 선택적인가보다.

 

#1 path의 인수 route

route는 URL 패턴을 가진 문자열이다. 요청이 처리될 때 장고는 urlpatterns의 첫 번째 패턴부터 시작하여 일치하는 패턴을 찾을 때까지 요청된 URL을 각 패턴과 리스트의 순서대로 비교한다.

패턴들은 GET이나 POST의 매개변수들, 혹은 도메인 이름을 검색하지 않는다.

URLconf는 오직 https://www.example.com/myapp/ 이 요청된다 치면 myapp/ 부분만 바라본다.

만약 https://www.example.com/myapp/?page=3 이런 요청이 와도 URLconf는 myapp/ 부분만 신경쓴다.

 

# 2 path의 인수 view

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

 

# 3 path의 인수 kwargs

임의의 키워드 인수들은 목표한 view에 사전형?(딕셔너리형?)으로 전달된다.

 

# 4 path의 인수 name

URL에 이름을 지으면 템플릿을 포함한 장고 어디에서나 명확히 참조할 수 있다. 단 하나의 파일만 수정해도 프로젝트내 모든 URL의 패턴을 바꿀 수 있도록 도와준다.

 

그 다음으로 최상위 URLconf에서 polls.urls모듈을 바라보게 설정한다.

즉 내 파일에서는 ex_1222/urls.py에 django.urls.include를 import하고, urlpatterns리스트에 include() 함수를 추가한다.

이렇게 만든다

django.urls 안에 있는 함수인 include()함수다른 URLconf들을 참조할 수 있도록 도와준다.

장고가 함수 include를 만나게 되면 URL의 그 시점까지 일치하는 부분을 잘라내고 남은 문자열부분을 include된 URLconf로 전달한다.

include 덕분에 polls앱에 그 자체의 URLconf(polls/urls.py)가 존재하는 한 /polls /my_polls /content/polls /post/polls 등 그 어떤 root 경로에 연결하더라도 앱은 잘 작동한다. ( 리엑트의 exact path뭐 그런 거랑 연관이 있는 것 같다..)

 

그럼 include는 언제 사용하는 걸까?

다른 URL 패턴을 포함할 때마다 항상 include를 사용해야 한다.

 

여기까지 했다면, index 뷰가 URLconf에 연결되었다.

인줄 알았는데

$ python3 ex_1222/manage.py runserver 를 하니까 No module 'polls' 가 떴다..

+ 해결

알고보니 저 manage.py랑 같은 디렉토리에 놓으라는 말이.. 

이렇게 manage.py보다 한단계 아래에 즉, ex_1222 안에 넣으라는 말인 것 같다.

 

+ 자 그럼 경로를 재설정했으니 localhost:8000번으로 가보자

그냥 들어가면 아직은 path를 찾을 수 없다고 뜨지만

뒤에 URLconf? 패턴? 걔를 polls로 입력하니 얘가 페이지를 찾아서 아까 만든 뷰를 보여준다!

그리고 8000번에도 친절하게 admin/ 이라는 곳도 들어갈 수 있다고 설명해준거같아서 들어가보자

와우.. 나는 127.0.0.1:8000/admin만 쳤는데

저런 URL주소로 바뀌면서 웬 로그인 페이지가 나온다.

(왠지 admin이라는 기본 템플릿?같은 게 있나보다. 로그인기능은 워낙 많이들 쓰니까 기본형태로 만들어놔준..느낌이다)

 

이로써 나는 난생 처음 장고로 뷰를 만들고, 그 뷰와 내가 원하는 url을 연결해서 뷰를 호출해서 사용자에게 보여주었다!

 

part1 에서 쓴 함수들

# ex_1222/urls.py에서 쓴
from django.contrib import admin
from django.urls import path, include

# polls/urls.py에서 쓴
from django.urls import path
from . import views

# polls/views.py에서 쓴
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
여기저기 요청한 터미널 결과