잔디심기
[2주차] 로또 번호 자동 생성 웹 서비스 구현하기 - Part1 본문
주차별 개요를 보니 강의가 적게는 4개, 많게는 8개까지 있어서 하나씩 게시글을 작성하면 추후 흐름을 파악하기 어려울 것 같아 2주차부터는 주차별로 묶어서 작성하기로 했다. 내용이 많아지면 나누어서 올려보려 한다.
settings.py 파일 내 변경사항
# 언어 & 시간 설정
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
from pathlib import Path
import os
# 브라우저에서 url로 특정한 static 파일에 접근하려고 할 때.
STATIC_URL = '/static/'
'''
collectstatic명령을 통해 css, js, image files등의 static파일을
한 곳에 모으는 작업을 중간중간 해줌. (앱 폴더마다 흩어져있는 static파일을 모음)
모으는 경로를 정해준 것임. join 폴더에 모을 것.
'''
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
파이썬에서 대문자 변수 : 다른 파일들에서 끌어와서 쓰려는 의도. 고유명사라고 생각.
SECRET_KEY: 추후 변경 필요함.
DEBUG = True 에러 발생시 상세하게 이유 보여줌. 웹에 올릴 때는 false로 변경해서 업로드 할 것
장고에서는 기본적인 앱들을 미리 만들어둠. installed_apps에 여러개 들어있는 것 보면 알 수 있는 사실.
ROOT_URLCONF = 'site_1.urls' : site_1 안에 있는 urls.py파일을 의미함
TEMPLATES : 유저에게 돌려줄 html파일을 의미
DATABASES : sqlite3사용 가능
$ python manage.py runserver
로컬 주소로 장고 접속
127.0.0.1:8000/admin으로 관리자 페이지 접속 가능
lotto app 만들고 app추가
INSTALLED_APPS = [
'lotto', # lotto 추가
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
url.py 수정
from django.contrib import admin
from django.urls import path
from lotto import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index), # <http://127.0.0.1:8000/>
]
view.py 수정
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('<h1>Hello, world!</h1>')
실행결과 (url: 127.0.0.1:8000)
url.py에 새로운 url 패턴 등록
path('hello/', views.hello, name='hello_main'),
패턴 등록 후 views.py 파일에 hello method 등록
def hello(request):
return HttpResponse("<h1 style='color:red;'>Hello, world!</h1>")
실행결과 (url: 127.0.0.1:8000/hello)
정리
새로운 앱 만들 시
$ python manage.py startapp 파일명
settings.py 의 INSTALLED_APPS에 파일명 추가
- site_1 파일 내 urls.py 에서 url 패턴 지정
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index), # <http://127.0.0.1:8000/>
path('hello/', views.hello, name='hello_main'),
]
- lotto(파일명)파일 내 view.py 에서 함수 지정
url마다 매칭되는 함수 지정해주는 것.from django.shortcuts import render from django.http import HttpResponse # Create your views here. # index url에 매칭되는 함수 def index(request): return HttpResponse('<h1>Hello, world!</h1>') ''' 함수 사이 두 줄 공백 ''' # hello url에 매칭되는 함수 def hello(request): return HttpResponse("<h1 style='color:red;'>Hello, world!</h1>")
브라우저에서 url 입력하여 확인
관리자 계정 등록하기
$ python manage.py createsuperuser
db 테이블 관리자 페이지에서 확인하려면 admin.py에서 등록해줘야 함.
from django.contrib import admin
# from lotto.models import GuessNumbers
from .models import GuessNumbers
# Register your models here.
admin.site.register(GuessNumbers)
GuessNumbers 사용 위해 import 필요
import문은 두가지 방식 가능
- from lotto.models import GuessNumbers
- from .models import GuessNumbers >> .models가 admin.py와 같은 폴더 내에 있을 때 사용 가능한 방식.
GuessNumbers 등록 후 admin페이지
GuessNumbers 테이블에 새로운 행 추가
db에 추가됨
model.py의 아래 코드로 인해 지정한 이름으로 db에 추가되는 것
def __str__(self): # Admin page에서 display되는 텍스트에 대한 변경
return "pk {} : {} - {}".format(self.pk, self.name, self.text) # pk는 자동생성됨
testcase 작성
from django.test import TestCase
from .models import GuessNumbers
# Create your tests here.
class GuessNumbersTestCase(TestCase):
def test_generate(self):
g = GuessNumbers(name='Test numbers', text='selected numbers')
g.generate()
print(g.update_date)
print(g.lottos)
self.assertTrue(len(g.lottos) > 20)
6개씩 5개 생성된다면 적어도 글자가 20자 이상일 것이므로
self.assertTrue(len(g.lottos) > 20)
로 테스트 진행. 케이스는 자율적으로 작성 가능
$ python manage.py test
db임시로 생성하여 테스트 진행 후 삭제
6개씩 5개의 로또 번호 생성됨을 확인
tests.py파일에 여러개의 testcase등록 후 명령어 실행하여 모든 testcase를 통과하는지 확인해볼 수 있음
Shell 사용해보기
$ python manage.py shell
$ GuessNumbers.objects.all()
$ GuessNumbers.objects.get(name=’번호 세트 1번’)
$ GuessNumbers.objects.get(id=1)
html 파일 만들기
파일 구조 유의하여 만들어야 함. >> 추후 웹에 서비스 업로드 할 때 장고에서 templates파일을 하나로 모으기 때문. templates 밑에 앱 이름과 동일한 lotto 파일을 만들어준 뒤 default파일 만들어야 함.
lotto/templates/lotto/default.html
default.html
<!DOCTYPE html>
<html lang="ko">
<head>
<title>My Little Lotto</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
<link href="//fonts.googleapis.com/css?family=Space+Mono" rel="stylesheet">
</head>
<body>
<div class="page-header">
<h1>Selected Lotto Numbers</h1>
</div>
<div class="container lotto">
<h2>Good luck!</h2>
<p> last update:2030/12/31</p>
<p> 1, 10, 19, 15, 20, 35 </p>
</div>
</body>
</html>
127.0.0.1:8000/lotto/
css 파일 만들어 스타일 입히기
lotto/static/css/lotto.css
px, em, %개념
px: 크기를 절대적으로 정의
em, %: 크기를 상대적으로 정의
페이지를 보는 디바이스가 모바일/pc/태블릿… 중 어떤 것일지 모름 >> 상대 크기 권장
(상황에 따라 px, em, % 유동적으로 사용하기)
장고 탬플릿 태그 이용해 css파일 불러오기
default.html
{% load static %} <!--장고 탬플릿 태그-->
<html lang="ko">
<head>
<title>My Little Lotto</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
<link href="//fonts.googleapis.com/css?family=Space+Mono" rel="stylesheet">
<link rel="stylesheet" href="{% static 'css/lotto.css' %}">
</head>
<link rel="stylesheet" href="{% static 'css/lotto.css' %}">
하드코딩 경로가 아니라 실제 연동시 만들어지는 경로임
static 파일 작성 완료했다면 모아주는 명령어 수행 필요
$ python manage.py collectstatic
lotto/static/css/lotto.css 경로에 있는 css 오리지널 파일을 복제해 사용할 수 있게 만들어줌
최종적으로는 static파일만 내보내면 안정적인 서비스 제공 가능
하드코딩 경로로 설정시: 불필요한 내용 포함됨, 속도 저하 가능성. (성능문제 발생)
static 파일 경로는 settings.py 내부에 사전 지정해두었음
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
서버 구동 후 127.0.0.1:8000/lotto/ 접속
css스타일 적용된 모습 확인
css파일 수정시 오리지널 파일 수정해야 함. static파일 내의 css파일은 접근 X
'[구름 KDC 46기] 오늘부터 웹 개발 - 인공지능 맛보기' 카테고리의 다른 글
[4주차] 실시간 설문조사 웹 서비스 구현하기 - Part1 // git 오류해결법 (0) | 2024.09.29 |
---|---|
[3주차] 로또 번호 자동 생성 웹 서비스 구현하기 - Part2 (0) | 2024.09.26 |
[1주차] 4강. django 개발환경 세팅 & virtualenv 가상환경 생성 (0) | 2024.08.26 |
[1주차] 3강. django MTV Structure & 중요 django 명령어 (0) | 2024.08.25 |
[1주차] 2강. Keyword로 살펴보는 Web Programming (2) (0) | 2024.08.20 |