본문 바로가기

카테고리 없음

[오늘부터 웹 개발 - 인공지능 맛보기] 로또 번호 자동 생성 웹 서비스 구현하기


Django project 생성 & settings.py 수정

 

1. 장고 프로젝트 폴더 및 Python 가상환경 생성

  • 장고 프로젝트 폴더 생성
cd ..
mkdir work_django
cd work_django
mkdir django_mldl
cd django_mldl
  • Python 가상환경 생성
pip install virtualenv==20.13.2 가상 환경을 만들어주는 라이브러리입니다.
virtualenv django_env django_env 라는 이름으로 가상 환경을 새로이 만듭니다.
django_env\Scripts\activate Scripts 폴더 내의 activate 파일을 실행해 가상 환경을 활성화합니다.
pip install django==3.2 가상 환경에는 최소의 라이브러리만 존재하므로 장고를 설치해줍니다

 

2. 장고 프로젝트 생성

  • site_1라는 프로젝트(웹사이트) 생성
django-admin startproject site_1

 

  • 프로젝트 안에 주요 파일 설명
    • __init__.py : site_1이 하나의 python module임을 뜻함
    • settings.py : django project에 대한 세팅
    • urls.py : django project의 URL 패턴 정의 (router)
    • wsgi.py : 웹 서버가 Django 애플리케이션을 실행하는 진입점 역할
    • asgi.py : 웹 서버가 Django 애플리케이션을 비동기적( 코드가 작업을 시작한 후, 그 작업이 완료될 때까지 기다리지 않고 다른 작업을 계속해서 실행할 수 있도록 하는 프로그래밍 방식)으로 실행할 수 있도록 하는 진입점 역할
  • settings.py 세부 설명
    • BASE_DIR : 프로젝트의 기본 디렉토리 경로 정의
    • SECRET_KEY : 프로젝트의 암호화 및 보안 관련 작업에 사용되는 비밀 키
    • DEBUG : True면 디버그 모드 활성(개발 중에는 True, 배포 시 False)
    • ALLOWED_HOSTS : 허용된 호스트/도메인을 정의
    • INSTALLED_APPS : 현재 프로젝트에 설치된 Django 애플리케이션들 나열, 각 애플리케이션은 이곳에 등록되어야 Django가 해당 앱을 인식하고 사용할 수 있음.
    • MIDDLEWARE : Django 요청/응답 처리 과정에서 사용되는 여러 함수들의 모음
    • ROOT_URLCONF : 프로젝트의 URL 패턴 관리
    • TEMPLATES : 템플릿 엔진의 설정 정의(템플릿 디렉토리, 컨텍스트 프로세서 등 설정 )
    • WSGI_APPLICATION : Django가 WSGI 서버와 통신하는 방법 정의
    • DATABASES : 프로젝트에서 사용할 데이터베이스 설정 정의(기본적으로 SQLite)
    • AUTH_PASSWORD_VALIDATORS : 사용자 비밀번호의 강도와 유효성을 검증하기 위한 설정
    • LANGUAGE_CODE & TIME_ZONE : 프로젝트의 기본 언어와 시간대를 설정
    • STATIC_URL : 정적 파일(static files)에 대한 URL을 정의
    • DEFAULT_AUTO_FIELD : 모델에서 기본적으로 사용할 기본 키 필드 유형 정의

3. settings.py 수정

  • 언어를 한국어, 시간대를 한국 시간을 사용하도록 코드 수정 

  • 프로젝트의 배포 과정에서 정적 파일을 모아둘 디렉토리를 지정(배포 환경에서 웹 서버(예: Nginx, Apache)가 이 디렉토리에서 정적 파일을 서빙하게 됨)

 


Django app 생성 & url pattern 정의 실습

 

1. 장고 app(하나의 웹사이트 내에 있는 기능) 생성

  • lotto app 생성(lotto 폴더가 생성됨)
python manage.py startapp lotto
  • settings.py INSTALLED_APPS에 생성한 앱 추가

 

2. 장고 프로젝트 Server 실행 & 웹브라우저에서 확인

  • server 실행(포트번호 변경을 원할 시 : python manage.py runserver 8888)
python manage.py runserver
  • 브라우저에서 127.0.0.1:8000 접속

3. urls.py & views.py 이해하기

  • urls.py 파일 수정
    1.  

  • views.py 파일 수정

  1. path('', views.index)
    • 루트 URL ('')로 들어오는 요청 처리
    • 이 패턴이 매칭되면, views.index 함수가 실행
  2. path('hello/', views.hello, name='hello_main')
    • 'hello/' URL로 들어오는 요청 처리
    • 이 패턴이 매칭되면, views.hello 함수가 실행
    • name='hello_main'은 이 URL 패턴에 대한 이름을 지정함. 이 이름은 템플릿에서 URL을 역참조할 때 유용하게 사용됨. 예를 들어, 템플릿에서 {% url 'hello_main' %}를 사용하여 이 URL을 참조할 수 있음

 


Django ORM의 이해 & DB Table 생성 실습

 

1. Django ORM(Object-Relational Mapping)

  • Django 프레임워크에서 데이터베이스를 쉽게 관리하고 조작할 수 있도록 도와주는 기능
  • ORM을 통해 파이썬 클래스로 데이터베이스의 테이블을 정의하고, 파이썬 객체로 데이터베이스의 데이터를 조작할 수 있음( SQL 쿼리를 직접 작성하지 않고도 데이터베이스 작업 수행 가능)

 

2. models.py 수정

  • models.py란
    •  Django 애플리케이션에서 데이터베이스 모델을 정의하는 파일
    • 모델은 데이터베이스 테이블의 구조를 정의
    • 각 모델 클래스는 데이터베이스의 테이블과 매핑됨
  • lotto app에서 사용하는 model
    • 데이터베이스 테이블(models.py의 class)
      • GuessNumbers
    • 데이터베이스 필드(models.py의 variable)
      • id
      • name : 로또 번호 리스트의 이름
      • text : 로또 번호 리스트에 대한 설명
      • lottos : generate 함수를 통해 생성되는 로또 번호 리스트
      • num_lotto : generate 함수를 통해 생성할 로또 번호 set의 수
      • update_date : 로또 번호 리스트 생성 일시
  • models.py 코드
    • 객체는 데이터베이스의 레코드 
    • 변수들은 앞에 설명한 데이터베이스의 필드 
    • generate 함수를 통해 1~45의 수를 섞은 후 1~6번째 숫자를 선택한 후 정렬해서 한 set씩 추가해서 총 6세트를 만들어냄

 

3. models.py 구성/수정 후  DB에 반영

  • migration
    • models.py 에서의 변화를 DB Schema에 반영해주는 과정
  • 명령어
    • python manage.py makemigrations : models.py 에서의 변화를 모아 migration file로 구성 (commit)
    • python manage.py migrate : 구성된 migration file을 바탕으로 실제 DB Schema 변경 (push)

 


관리자 페이지 활용

 

1. admin site에 Model 객체 (DB에서의 record/row에 해당) 등록하기

  • admin site를 위한 사용자이름 & 비밀번호 생성하기
    • python manage.py createsuperuser(Username / Email / Password 입력하기)
  • admin site 접속하기
    • 브라우저에서 127.0.0.1:8000/admin 접속하고 로그인하기
  • admin site에 만들어두었던 Model 클래스 등록하기
    • admin.py 파일 수정

  • admin site에 Model 객체 추가하기
    • admin page에서 Guess numberss 클릭
    • Guess numbers 추가
    • Name : 번호 세트 1번 / Text : 1등 되라 얍! / Update date 날짜 & 시간 : 오늘 및 현재 클릭
    • 저장 결과 확인

 


Test case 작성법 실습

 

1. Test case 작성하기

  • models.py 의 generate() 함수를 테스트하는 코드 작성

  • 코드 설명
    • GuessNumbers 모델의 인스턴스를 생성
    • GuessNumbers 모델의 generate 메서드를 호출하여 모델 인스턴스의 필드에 숫자를 생성하여 설정
    • generate 메서드가 호출된 후의 update_date와 lottos 값을 출력 (디버깅 목적으로, 테스트 결과를 확인)
    • generate 메서드가 적어도 20개의 숫자를 생성하는지 확인 (만약 lottos의 길이가 20 이하라면 이 테스트는 실패)

2. Test case 실행

  • python manage.py test

 


Django Shell 기능 활용

 

  • Django의 관리 쉘을 실행
  • 쉘을 사용하면 Django 프로젝트의 모델을 직접 조작하거나 데이터를 조회할 수 있음 (개발 및 디버깅에 유용)
python manage.py shell

 

  • lotto 앱에서 GuessNumbers 모델을 가져옴
  • GuessNumbers 테이블의 모든 객체를 조회 (데이터베이스에 저장된 모든 GuessNumbers 인스턴스를 가져옴)
  • name 필드가 '번호 세트 1번'인 GuessNumbers 객체를 조회, 조건에 맞는 객체 하나만 반환
  • 새로운 GuessNumbers 객체 생성
  • GuessNumbers 모델의 generate 메서드 호출
  • guess_object 인스턴스의 lottos 필드의 값 출력
from lotto.models import GuessNumbers
GuessNumbers.objects.all()
GuessNumbers.objects.get(name='번호 세트 1번')
guess_object = GuessNumbers()
guess_object.generate()
guess_object.lottos
exit()


views.py와 Templates 연결

 

1. urls.py 파일 수정

  • '/lotto' 추가
  • views.py 파일의 index 함수 호출

2. views.py 파일 수정

  • 브라우저로부터 넘어온 request를 그대로 template('default.html')에게 전달
  • {} 에는 추가로 함께 전달하려는 object들을 dict로 넣어줄 수 있음

 

3. Template 파일 만들어주기 ('lotto/default.html')

  • 나중에 서버에 웹 서비스를 올리게 되면, 전체 template 파일들이 한번에 모이게 됨
  • 그 때 lotto 라는 폴더로 따로 묶이게 됨

 

4. css 파일 연결하여 디자인 적용하기 (Static 파일 연결)

  • lotto\static\css 폴더 안에 lotto.css 파일 생성

5. default.html 파일 head 태그 내부 수정

6. Static file 모으기

  • python manage.py collectstatic

 


views.py, Template, Model 연동하기

1. views.py 수정

2. default.html 파일 수정


admin 대신 사용자로부터 데이터를 입력받는 Form 만들기

1. forms.py 파일 생성 & 수정

2. urls.py 파일 수정

3. views.py 파일 수정

 

4. form.html 파일 생성


Form을 통해 사용자로부터 입력받은 데이터를 실제로 POST 처리하기 (DB 반영)

  • form 태그는 기본적으로 Submit 시 현재 페이지와 동일한 URL로 (Post) 요청을 보내게 됨
  • form 태그의 action attribute의 value에 특정 URL을 지정해 Post 요청이 날라갈 URL을 지정해 줄 수 있음

 

1. views.py 파일 수정

 


로또 번호에 대한 detail 페이지 추가하기 (url 입력을 통해 view 함수에 흘러들어갈 인자를 직접 넘겨받기)

1. urls.py 파일 수정

 

 

 

2. views.py 파일 수정

3. Template 파일 만들어주기 ('lotto/detail.html')

4. 메인 페이지(default.html)에 상세페이지 링크 및 로또 번호 Form 페이지 링크 추가하기

 

완성된 앱 url : https://joungeun.pythonanywhere.com/lotto/