안녕하세요! 오늘은 여러분과 함께 로또 번호 생성기를 만들어보는 프로젝트를 소개하겠습니다. 이 프로젝트에서는 Python과 Flask를 사용하여 로또 번호를 예측하고 생성하는 방법을 단계별로 설명할 거예요. 자, 그럼 시작해볼까요? 🎉
## 1부: 프로젝트 준비하기
우선 이 프로젝트를 시작하기 전에 필요한 라이브러리를 설치해야 합니다. 다음과 같은 라이브러리가 필요해요:
- **requests**: 웹에서 데이터를 가져오기 위해 사용합니다.
- **pymysql**: MySQL 데이터베이스와 연결하기 위해 필요합니다.
- **Flask**: 웹 애플리케이션을 만들기 위한 프레임워크입니다.
이 라이브러리들을 설치하기 위해 아래의 명령어를 사용하세요:
pip install requests pymysql flask
## 2부: 기본 코드 구조
이제 프로젝트의 기본 코드를 살펴볼까요? 아래는 Python으로 작성된 Flask 웹 애플리케이션의 기본 구조입니다.
import requests
import random
from datetime import datetime
import pymysql # MySQL 연결을 위한 라이브러리
from flask import Flask, render_template
app = Flask(__name__)
# MySQL 연결을 한 번만 설정하기 위한 전역 변수
connection = None
### 코드 설명
- **라이브러리 임포트**: 필요한 라이브러리들을 불러옵니다.
- **Flask 애플리케이션 생성**: `Flask` 클래스를 사용하여 웹 애플리케이션을 생성합니다.
- **전역 변수**: MySQL 연결을 재사용하기 위해 전역 변수를 설정합니다.
## 3부: 데이터베이스 연결
이제 MySQL 데이터베이스에 연결하는 함수를 만들어볼까요?
def connect_to_db():
global connection
if connection is None:
connection = pymysql.connect(
host='localhost',
user='root',
password='your password',
database='lotto_db',
)
### 코드 설명
- **`connect_to_db` 함수**: 데이터베이스에 연결하기 위해 호출됩니다. 연결이 이미 설정되어 있다면 새로 연결하지 않습니다.
- **전역 변수 사용**: 데이터베이스 연결을 전역 변수로 관리하여 여러 번 호출해도 연결을 재사용할 수 있습니다.
## 4부: 로또 규칙 불러오기
이제 데이터베이스에서 로또 규칙을 가져오는 함수를 만들어봅시다.
def get_lotto_rules_from_db():
connect_to_db()
try:
with connection.cursor() as cursor:
sql = "SELECT id, condition_type, order_sequence, bonus_included, lotto_round, pre_lotto_round FROM lotto_rules WHERE id = 1"
cursor.execute(sql)
result = cursor.fetchone()
if result:
lotto_rule_id, condition_type, order_sequence, bonus_included, lotto_round, pre_lotto_round = result
exclude_indices = [int(i) - 1 for i in order_sequence.split(',')]
exclude_bonus = bonus_included == 1
lotto_round = int(lotto_round) if lotto_round and lotto_round.isdigit() else None
pre_lotto_round = int(pre_lotto_round) if pre_lotto_round and pre_lotto_round.isdigit() else None
return lotto_rule_id, condition_type, exclude_indices, exclude_bonus, lotto_round, pre_lotto_round
else:
return None, None, None, None, None, None
finally:
pass
### 코드 설명
- **`get_lotto_rules_from_db` 함수**: 데이터베이스에서 로또 규칙을 불러옵니다.
- **결과 처리**: 결과가 있으면 각 규칙을 변수에 저장하고 반환합니다. 없다면 `None`을 반환합니다.
## 5부: 로또 번호 생성
이제 로또 번호를 생성하는 함수를 추가해봅시다!
def generate_lotto_numbers(excluded_numbers):
all_numbers = set(range(1, 46))
excluded_set = set(excluded_numbers)
available_numbers = list(all_numbers - excluded_set)
lotto_numbers = random.sample(available_numbers, 6)
return sorted(lotto_numbers)
### 코드 설명
- **`generate_lotto_numbers` 함수**: 1부터 45까지의 번호 중에서 제외할 번호를 제거하고, 무작위로 6개의 번호를 선택합니다.
- **정렬된 결과 반환**: 생성된 번호를 정렬하여 반환합니다.
## 6부: 웹 페이지 구성
마지막으로 웹 페이지를 구성하는 코드를 추가해봅시다.
@app.route('/')
def index():
lotto_rule_id, condition_type, exclude_indices, exclude_bonus, lotto_round, pre_lotto_round = get_lotto_rules_from_db()
if condition_type and exclude_indices is not None:
latest_draw_no = get_latest_draw_no()
excluded_numbers, target_numbers, target_bonus = get_excluded_numbers(latest_draw_no, lotto_round, pre_lotto_round, exclude_indices, exclude_bonus)
lotto_sets = []
if excluded_numbers:
for i in range(10):
lotto_numbers = generate_lotto_numbers(excluded_numbers)
insert_lotto_lucky_numbers(latest_draw_no + 1, lotto_numbers, None, 'N')
lotto_sets.append(lotto_numbers)
return render_template('index.html', latest_draw_no=latest_draw_no, lucky_draw_no=latest_draw_no + 1, excluded_numbers=excluded_numbers, lotto_sets=lotto_sets)
else:
return "로또 원칙을 MySQL에서 불러오지 못했습니다."
### 코드 설명
- **루트 경로 설정**: `@app.route('/')` 데코레이터를 사용하여 기본 URL에 대한 처리 함수를 정의합니다.
- **로또 번호 생성 및 렌더링**: 로또 규칙을 불러오고, 번호를 생성하여 HTML 템플릿에 전달합니다.
## 7부: HTML 템플릿
마지막으로 생성된 로또 번호를 표시할 HTML 템플릿을 만들어볼까요? 아래는 기본적인 HTML 템플릿입니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>로또 번호 생성기</title>
</head>
<body>
<h1>로또 번호 생성기</h1>
<p>오늘 날짜 기준 최신 로또 회차 번호는: <strong>{{ latest_draw_no }}</strong>회차 입니다.</p>
{% if excluded_numbers %}
<p>제외할 번호: <strong>{{ excluded_numbers }}</strong></p>
<h2>{{ lucky_draw_no }}회차 예상 로또 번호</h2>
<ul>
{% for set in lotto_sets %}
<li>세트: {{ set }}</li>
{% endfor %}
</ul>
{% else %}
<p>제외할 번호를 가져올 수 없습니다.</p>
{% endif %}
</body>
</html>
### 템플릿 설명
- **정보 출력**: 사용자가 볼 수 있는 페이지로, 최신 로또 회차 번호와 생성된 번호 세트를 출력합니다.
- **Jinja2 템플릿 엔진**: Flask와 함께 제공되는 Jinja2를 사용하여 동적으로 데이터를 삽입합니다.
## 8부: 마무리
이렇게 해서 로또 번호 생성기를 만들기 위한 전체 과정을 살펴보았습니다! 여러분도 이 코드를 활용하여 자신만의 로또 번호 예측기를 만들어보세요. 이 프로젝트는 Python과 Flask를 배우기에 좋은 기회가 될 거예요. 질문이나 궁금한 점이 있다면 언제든지 댓글로 남겨주세요. 그럼 다음에 또 만나요! 🎊
'파이썬으로 로또 1등 도전기' 카테고리의 다른 글
16일차) 생성한 로또번호 당첨통계 확인 기능추가 (0) | 2024.10.26 |
---|---|
15일차) 로또 번호 관리 화면에 메뉴별로 기능 추가하기 (0) | 2024.10.26 |
13일차) 로또룰을 적용해서 당첨 번호 만들어서 저장까지!!! (0) | 2024.10.23 |
12일차) 로또 예측 데이터베이스 구조 만들기 (0) | 2024.10.23 |
11일차) lotto_rules에서 제외수 가져와서 당첨번호 추출하기 (1) | 2024.10.22 |