1. 전체 코드 구성

2. app.py
from flask import Flask, render_template, request, redirect, url_for, flash
from flask_mysqldb import MySQL
-> Flask, render_template, request, redirect, url_for, flash은 모두 flask 모듈에 포함된 것들이다. 하나 하나 살펴보자
- Flask: Flask 모듈에서 가져오는 가장 중요한 클래스이다. 애플리케이션의 진입점 역할을 하여, 라우팅과 요청 처리를 설정할 수 있게 해준다.
- render_template: Flask의 템플릿 엔진 기능을 사용하여 HTML 템플릿 파일을 렌더링하는 함수이다.
- request: Flask에서 요청 정보를 담고 있는 객체이다. Client가 Server로 보내는 모든 요청 데이터를 처리할 수 있으며 POST, GET등 HTTP 요청 메서드에 접근할 수있다.
- redirect: Flask에서 특정 URL로 사용자를 리다이렉트할 때 사용한다. 폼 제출 후 사용자를 다른 페이지로 이동시키는데 사용된다.
- url_for: Flask에서 뷰 함수 이름을 사용하여 해당 함수가 연결된 URL을 생성하는 함수이다.
- flash: Flask에서 사용자에세 일시적인 메시지를 전달할 때 사용되는 함수이다. 폼 제출 후 성공/실패와 같은 피드백을 제공하는 데 사용한다.
app = Flask(__name__)
app.secret_key = 'your_secret_key'
-> Flask 애플리케이션을 초기화하고, 플래시 메시지와 세션 관리에 필요한 보안 키를 설정하는 부분이다.
- Flask(__name__): Flask 애플리케이션을 초기화하는 코드로, Flask 클래스의 인스턴스(=변수)를 생성한다.
- __name__: 이 파라미터는 현재 모듈의 이름을 의미하며, Flask 애플리케이션이 어디에서 실행되는지를 Flask에 알려준다. 이를 통해 Flask는 정적 파일이나 템플릿 파일을 찾을 수 있는 경로를 설정한다.
- app: 해당 변수는 Flask 애플리케이션 자체를 나타내며, 이후 라우트 설정, 요청 처리, 응답 전송 등의 작업을 이 객체를 통해 수행한다.
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'ahj740429^^'
app.config['MYSQL_DB'] = 'forum'
mysql = MySQL(app)
이 부분은 Flask 애플리케이션에서 MySQL 데이터베이스를 연결하고 설정하는 코드이다. 이 부분을 통해 Flask 애플리케이션이 MySQL 데이터베이스와 상호작용 할 수 있게 된다.
- app.config['MYSQL_HOST'] = 'localhost': 현재 애플리케이션이 실행되는 컴퓨터에서 MySQL 서버가 실행중임을 의미한다. 데이터베이스가 동일한 컴퓨터에 있다는 것을 알린다.
- app.config['MYSQL_USER'] = 'root': MySQL에 접속할 때 사용할 사용자 계정을 설정한다.
- app.config['MYSQL_PASSWORD'] = 'ahj740429^^: 비밀번호를 설정하는 부분이다. 비밀번호는 사용자 계정과 쌍을 이루어 데이터베이스에 접근 권한을 부여한다.
- app.config['MYSQL_DB'] = 'forum': 사용할 MySQL 데이터베이스 이름을 설정하는 부분이다. 나는 forum이라는 이름의 DB를 만들어놨다.
- mysql = MySQL(app): Flask와 MySQL을 연결하는 객체를 생성하는 부분이다. MySQL(app)은 Flask-MySQLdb 라이브러리를 사용하여 Flask 애플리케이션과 MySQL 데이터베이스를 연결한다.
# Home route to display posts with optional search
@app.route('/', methods=['GET', 'POST'])
def index():
search_type = request.form.get('search_type', 'all')
search_query = request.form.get('search_query', '')
cur = mysql.connection.cursor()
# 검색 조건에 따라 SQL 쿼리 변경
if search_type == 'title':
cur.execute("SELECT * FROM topics WHERE title LIKE %s", ('%' + search_query + '%',))
elif search_type == 'body':
cur.execute("SELECT * FROM topics WHERE body LIKE %s", ('%' + search_query + '%',))
elif search_type == 'all':
cur.execute("SELECT * FROM topics WHERE title LIKE %s OR body LIKE %s",
('%' + search_query + '%', '%' + search_query + '%'))
else:
cur.execute("SELECT * FROM topics")
posts = cur.fetchall()
cur.close()
return render_template('index.html', posts=posts, search_query=search_query, search_type=search_type)
- methods=['GET' , 'POST']: GET 요청은 기본 페이지 로드 시 사용되며, POST 요청은 사용자가 검색 폼을 제출할 때 사용된다.
- search_type = request.form.get('search_type', 'all'): request.form.get는 POST 요청으로 전달된 폼 데이터를 가져온다. search_type은 검색의 종류를 결정하는 값으로, 사용자가 검색 옵션에서 선택한 값이다.
- search_query = request.form.get('search_query', ''): search_query는 사용자가 검색창에 입력한 검색어이다.
- cur = mysql.connection.cursor(): 데이터베이스에 접근하기 위해 커서를 생성하는 부분이다. 커서는 데이터베이스에 쿼리를 실행하고 데이터를 가져오는 역할을 한다.
- cur.execute: cur은 위의 코드를 통해 새성된 커서 객체이고, execute 메서드는 커서를 통해 SQL 명령을 실행하는 역할을 한다.
- SELECT * FROM topics WHERE title LIKE %s: LIKE는 SQL에서 패턴 매칭을 할 때 사용되는 연산자이다. 와일드카드와 비슷한 기능을 할 수 있다. %s는 플레이스홀더로, 사용자가 실제고 검색하는 값이 들어가게 된다. 쿼리와 데이터를 분리하여 SQL 인젝션을
- return render_template('index.html', posts=posts, search_query=search_query, search_type=search_type): Flask 애플리케이션이 사용자에게 HTML 파일을 응답하는 부분.
'Basic_Theory' 카테고리의 다른 글
| Python 가상환경 Venv 이해 (2) | 2024.09.12 |
|---|---|
| Port & IP & Port Forwarding (1) | 2024.09.12 |
| HTML & Internet (4) | 2024.09.05 |
| [공부] MySQL 기초 (9) | 2024.09.02 |
| 웹 사이트 개발_기초 문법 정리 (0) | 2024.09.01 |