개발일기
flask#1 본문
장고는 기본 폴더 구조 생성 코드를 지원해줬는데 flask는 없더라.
그래서 GPT 시켜서 기본 폴더 구조 생성하는 코드를 받았다.
import os
folders = ["templates", "static"]
files = {
"app.py": '''from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
''',
"templates/index.html": '''<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flask 기본 사이트</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<h1>환영합니다! Flask 기본 웹사이트입니다.</h1>
<p>Flask를 사용하여 웹사이트를 만들어 보세요!</p>
</body>
</html>''',
"static/style.css": '''body {
font-family: Arial, sans-serif;
text-align: center;
margin: 50px;
background-color: #f4f4f4;
}
h1 {
color: #333;
}'''
}
# 폴더 생성
for folder in folders:
os.makedirs(folder, exist_ok=True)
# 파일 생성
for file, content in files.items():
with open(file, "w", encoding="utf-8") as f:
f.write(content)
print("Flask 기본 프로젝트가 생성되었습니다!")
그러고 가장 기본적인 것만 구성해줬다
from flask import Flask, render_template, request, redirect, url_for, session
from functools import wraps
import time
app = Flask(__name__)
app.secret_key = 'supersecretkey'
# login_required라는 데코레이터를 정의
def login_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if 'user_id' not in session:
return redirect(url_for('login'))
return f(*args, **kwargs)
return decorated_function
# 메인 화면
@app.route('/', methods=['GET', 'POST'])
def home():
if request.method == 'POST':
session['request_data'] = {
'name': request.form.get('name'),
'chk_info': request.form.get('chk_info'),
'language': request.form.get('language'),
'sub_time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
}
print(session['request_data'])
session['message'] = '전송이 완료되었습니다!\n'+str(session['request_data'])
return redirect(url_for('home'))
message=session.pop('message', None)
return render_template('index.html', session=session, message=message)
# session['request_data'] 정보 지우기
@app.route('/clear/request_data')
def clear_request_data():
session.pop('request_data', None) # 저장된 정보 초기화
return redirect(url_for('home'))
# 지금까지 보낸 요청 확인하기
@app.route('/history', methods=['GET', 'POST'])
@login_required
def history():
return "여기는 로그인한 사람만 접속 가능!"
# 회원가입
@app.route('/register', methods=['GET', 'POST'])
def register():
return "회원가입!"
# 로그인
@app.route('/login', methods=['GET', 'POST'])
def login():
return "로그인!"
# 로그아웃
@app.route('/logout', methods=['GET', 'POST'])
def logout():
return redirect(url_for(home))
if __name__ == '__main__':
app.run(debug=True)
그리고 html. 내가 보기에 html은 그냥 필요할 때마다 검색해서 쓰는 게 맞아
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flask 기본 사이트</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<h1>환영합니다! Flask 기본 웹사이트입니다.</h1>
<p>Flask를 사용하여 웹사이트를 만들어 보세요!</p>
<form method="POST">
<label>radio button</label>
<input type="radio" name="chk_info" value="프론트엔드">프론트엔드
<input type="radio" name="chk_info" value="백엔드">백엔드
<input type="radio" name="chk_info" value="웹디자인">웹디자인
<input type="radio" name="chk_info" value="풀스택">풀스택
<br>
<label>input</label>
<input type="text" name="name" placeholder="Enter name" required/>
<br>
<label>select</label>
<select name="language" id="lang">
<option value="python">python</option>
<option value="c++">c++</option>
<option value="c#">c#</option>
<option value="go">go</option>
<option value="css, js, html">css, js, html</option>
<option value="dart">dart</option>
</select>
<br><br>
<label>제출 button</label>
<button type="submit">버튼</button>
</form>
{% if message %}
<div style="border:1px solid green; padding:10px; background-color: #f0f8ff;">
<p>{{ message }}</p>
</div>
<a href="{{ url_for('clear_request_data') }}">확인</a>
{% endif %}
<a href="{{ url_for('history') }}">지금까지 보낸 요청 확인하기</a>
</body>
</html>