1. 프로젝트 구조
flask_board/
├── app.py
├── templates/
│ ├── index.html
│ ├── post.html
│ ├── new.html
├── static/
│ └── style.css
└── board.db (자동 생성됨)
pip install flask flask_sqlalchemy
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
import datetime
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///board.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
# 모델 정의
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
date = db.Column(db.DateTime, default=datetime.datetime.utcnow)
# DB 생성
with app.app_context():
db.create_all()
# 게시글 목록
@app.route('/')
def index():
posts = Post.query.order_by(Post.date.desc()).all()
return render_template('index.html', posts=posts)
# 게시글 작성 폼
@app.route('/new')
def new():
return render_template('new.html')
# 게시글 저장
@app.route('/create', methods=['POST'])
def create():
title = request.form['title']
content = request.form['content']
new_post = Post(title=title, content=content)
db.session.add(new_post)
db.session.commit()
return redirect(url_for('index'))
# 게시글 상세 보기
@app.route('/post/<int:id>')
def post(id):
post = Post.query.get_or_404(id)
return render_template('post.html', post=post)
# 게시글 삭제
@app.route('/delete/<int:id>')
def delete(id):
post = Post.query.get_or_404(id)
db.session.delete(post)
db.session.commit()
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)
<!DOCTYPE html>
<html>
<head>
<title>게시판</title>
</head>
<body>
<h1>게시판</h1>
<a href="{{ url_for('new') }}">새 글 작성</a>
<ul>
{% for post in posts %}
<li>
<a href="{{ url_for('post', id=post.id) }}">{{ post.title }}</a>
- {{ post.date.strftime('%Y-%m-%d %H:%M') }}
</li>
{% endfor %}
</ul>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>새 글 작성</title>
</head>
<body>
<h1>새 글 작성</h1>
<form method="POST" action="{{ url_for('create') }}">
제목: <input type="text" name="title" required><br>
내용: <br><textarea name="content" rows="10" cols="50" required></textarea><br>
<button type="submit">등록</button>
</form>
<a href="{{ url_for('index') }}">목록으로</a>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>{{ post.title }}</title>
</head>
<body>
<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
<p>작성일: {{ post.date.strftime('%Y-%m-%d %H:%M') }}</p>
<a href="{{ url_for('delete', id=post.id) }}">삭제</a> |
<a href="{{ url_for('index') }}">목록으로</a>
</body>
</html>
python app.py
http://localhost:5000 접속 후 게시판 이용 가능
게시글 수정 기능
댓글 기능
사용자 로그인 연동
Markdown 지원
페이징 처리