인프런 커뮤니티 질문&답변

garamflow님의 프로필 이미지
garamflow

작성한 질문수

남박사의 파이썬으로 실전 웹사이트 만들기

에러 다시 한 번 질문드립니다.

해결된 질문

작성

·

151

1

이전 질문글에서 jinja2 에러가 주석처리되있지만 {% %} 라는 부분이 있어서 에러가 뜬거일수 있다는 답변에 그 부분 지웠더니 바로 다른 에러가 떴습니다.

run.py와 write.html, view.html 모든 부분 다 올립니다.

주석처리되있던 한글로 쓴 설명도 다 지웠습니다.

run.py

# -*- coding: utf-8 -*-
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
import time

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("/view")
def board_view():
    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(400)


@app.route("/write", methods=["POST", "GET"])
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
        post = {
            "name": name,
            "title": title,
            "contents": contents,
            "pubdate": current_utc_time,
            "view": 0,
        }
        x = board.insert_one(post)
        print(x.inserted_id)
        return str(x.inserted_id)
    else:
        return render_template("write.html")


if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True, port=9000)

write.html

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>write</title>
    </head>
    <body>
        <table>
            <form name="form" method="POST" action="/write">
                <tr>
                    <td>작성자</td>
                    <td><input type="text" name="name" /></td>
                </tr>
                <tr>
                    <td>제목</td>
                    <td><input type="text" name="title" /></td>
                </tr>
                <tr>
                    <td>내용</td>
                    <td><textarea name="contents"></textarea></td>
                </tr>
                <tr>
                    <td colspan="2"><input type="submit" /></td>
                </tr>
            </form>
        </table>
    </body>
</html>

view.html

<html>
    {{result.title}}
    <br />
    {{result.name}}
    <br />
    {{result.pubdate|formatdatetime}}
    <br />
    {{result.view}}
    <br />
    {{result.contents}}
</html>

답변 2

1

남박사님의 프로필 이미지
남박사
지식공유자

위의 코드에서 오류가 발생하는 부분은 추측컨데 

value = datetime.fromtimestamp((int(value) / 1000) + offset)

이 코드를 잘못 쓰신것 같습니다. 항상 개발자는 대소문자, 오타, 연산자 우선순위를 주의해야 하고 이런 아주 기본적인 실수로 인해 엄청난 시간을 잡아먹기도 합니다. 위의 코드에서 괄호의 위치가 강좌의 내용과 다릅니다. 이 부분을 확인해보시기 바랍니다.

PS> 질문을 주실때 어떤 오류가 나는지, 해당 오류가 가르키는 코드를 알려주셔야 제가 코드와 오류를 보고 답을 드릴 수 있습니다.

0

garamflow님의 프로필 이미지
garamflow
질문자

에러코드 올리는걸 깜빡했네요. 죄송합니다.

말씀해주신부분 수정하니 제대로 작동합니다 감사합니다!

garamflow님의 프로필 이미지
garamflow

작성한 질문수

질문하기