from flask import Flask
from flask import request
from flask import render_template
from flask_pymongo import PyMongo
from datetime import datetime
from bson.objectid import ObjectId
from flask import abort
from flask import redirect
from flask import url_for
from flask import flash
import time
import math
app = Flask(__name__)
app.config["MONGO_URI"] = "mongodb://localhost:27017/myweb"
mongo = PyMongo(app)
@app.template_filter("formatdatetime")
def format_datetime(value):
if value is None:
return ""
now_timestamp = time.time()
offset = datetime.fromtimestamp(now_timestamp)-datetime.utcfromtimestamp(now_timestamp)
value = datetime.fromtimestamp((int(value)/1000)) + offset
return value.strftime('%Y-%m-%d %H:%M:%S')
@app.route("/list")
def lists():
#페이지값(값이 없는 경우 기본값은 1)
page = request.args.get("page", 1, type=int)
#한페이지당 몇개의 게시물을 출력할지
limit = request.args.get("limit", 5, type=int)
search = request.args.get("search", -1, type=int)
keyword = request.args.get("keyword", type=str)
#최종적으로 완성된 쿼리를 만들 변수
query = {}
#검색어 상태를 추가할 리스트변수
search_list = []
if search == 0:
search_list.append({"title": {"®ex": keyword}})
elif search == 1:
search_list.append({"contents": {"®ex": keyword}})
elif search == 2:
search_list.append({"title": {"®ex": keyword}})
search_list.append({"contents": {"®ex": keyword}})
elif search == 3:
search_list.append({"name": {"®ex": keyword}})
if len(search_list) > 0:
query = {"$or": search_list}
print(query)
board = mongo.db.board
#skip (2번쩨 페이지-1)*10 -> 앞페이지 10개 skip, 이후부터 10개까지 출력
datas =board.find(query).skip((page - 1) * limit).limit(limit)
#게시물의 총 갯수
tot_count = board.find(query).count()
# 마지막 페이지의 수
last_page_num = math.ceil(tot_count/limit)
#페이지 블록 5개씩 표기
block_size = 5
#현재 블록 위치
block_num = int((page - 1)/ block_size)
#블럭의 시작 위치
block_start = int((block_size * block_num) +1)
#블럭의 끝 위치
block_last = math.ceil(block_start + (block_size - 1))
return render_template(
"list.html",
datas=datas,
limit=limit,
page=page,
block_start=block_start,
block_last=block_last,
last_page_num=last_page_num)
@app.route("/view/<idx>")
def board_view(idx):
#idx = request.args.get("idx")
if idx is not None:
board = mongo.db.board
data = board.find_one({"_id": ObjectId(idx)})
if data is not None:
result = {
"id" : data.get("_id"),
"name" : data.get("name"),
"title": data.get("title"),
"contents":data.get("contents"),
"pubdate":data.get("pubdate"),
"view":data.get("view")
}
return render_template("view.html", result=result)
return abort(404)
@app.route("/write", methods=["GET", "POST"])
def board_write():
if request.method == "POST":
name = request.form.get("name")
title = request.form.get("title")
contents = request.form.get("contents")
print(name, title, contents)
current_utc_time = round(datetime.utcnow().timestamp()*1000)
board = mongo.db.board #있으면 리턴 없으면 board 생성
post = {
"name" : name,
"title": title,
"contents": contents,
"pubdate":current_utc_time,
"view":0
}
x = board.insert_one(post)
print(x.inserted_id)
return redirect(url_for("board_view", idx=x.inserted_id))
else:
return render_template("write.html")
@app.route("/join", methods=["GET", "POST"])
def member_join():
if request.method == "POST":
name = request.form.get("name", type=str)
email = request.form.get("email", type=str)
pass1 = request.form.get("pass", type=str)
pass2 = request.form.get("pass2", type=str)
if name is None or email is None or pass1 is None or pass2 is None:
flash("빈값있음")
return render_template("join.html")
if pass1 != pass2:
flash("비밀번호 불일치")
return render_template("join.html")
members = mongo.db.members
cnt = members.find({"email": email}).count()
if cnt >0:
flash("중복된 이메일 주소입니다.")
return render_template("join.html")
current_utc_time = round(datetime.utcnow().timestamp(*1000))
post = {
"name": name,
"email": email,
"pass": pass1,
"joindate": current_utc_time,
"logintime": " ",
"logincount": 0
}
members.insert_one(post)
return ""
else:
return render_template("join.html")
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=9000)
답변 1