게시글
질문&답변
에러 다시 한 번 질문드립니다.
에러코드 올리는걸 깜빡했네요. 죄송합니다. 말씀해주신부분 수정하니 제대로 작동합니다 감사합니다!
- 1
- 2
- 169
질문&답변
jinja2.exceptions.TemplateSyntaxError 에러가 뜹니다.
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_URI는 정해진 문자열이라서 바꾸면 안된다. 프로토콜명을 앞에 써주고 주소:포트/데이터베이스 이름 을 써주면된다. 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) # datetime.fromtimestamp(now_timestamp) # 현재 이 클라이언트의 타임스탬프를 기준으로 datetime 객체를 만들어준다. # datetime.utcfromtimestamp(now_timestamp) # utc 시간 객체를 반환해서 준다. # 현재 datetime객체와 똑같은 현재시간을 utc타임객체로 바꾼다음에 # 같은 시간값으로 두가지(utc, 일반시간)을 구해서 그 차를 구한다. # 시간차이 = datetime형 현재시간 - datetime형 UTC시간 value = datetime.fromtimestamp((int(value) / 1000) + offset) # sec형태로 db에 저장된 글 작성시간을 다시 millisecond로 변경 # db에 저장된 UTC 시간 + 시간차 = 현재로컬시간 기준으로 작성일자가 표기됨 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) # 이 부분은 백단에서 html로 데이터를 넘기는 부분이다. result(변수명) = 변수값은 위에 있는 부분. # view?idx=몽고db 아이디값 // ?의 의미는 ? 앞까지는 주소고 뒤에부터는 데이터라는걸 구분짓는것이다. # 데이터는 변수명과 값으로 이뤄져있다. idx=1234&a=10&b=20 이런식이다. 이런게 GET방식으로 데이터를 전송하는 방식이다 # idx를 얻기위해서는 request.args.get으로 idx를 받아온다. 만약 받아와야되는 값이 a이면 a라고 쓰면된다. # idx로 변수명을 사용하는 이유는 id라는 단어는 여러곳에서 이미 예약된 단어로 사용되는 경우가 많아서 idx로 사용한다. # abort는 오류코드를 페이지가 동작하게 만든거다. # view.html 파일은 templates 폴더에 만들어야한다. @app.route("/write", methods=["POST", "GET"]) # POST와 GET을 모두 사용하려면 둘 다 사용하려면 선언을 해줘야한다. 생략을 하면 GET만 사용된다. def board_write(): if request.method == "POST": name = request.form.get("name") # 리퀘스트 메소드가 post인 경우에 리퀘스트.폼에서 겟을 한다. # form을 post를 전송했기에 해당하는 객체를 받아서 처리할 수 있다. # post로 전송된 데이터는 url상에 노출되지 않고, get은 url에 노출된다. title = request.form.get("title") contents = request.form.get("contents") print(name, title, contents) current_utc_time = round(datetime.utcnow().timestamp() * 1000) # UTC와 GMT는 소수점 차이만 있을뿐 큰 차이가 없어 혼용해서 사용하기도 한다. utc는 협정세계표준시라고 할 수 있다. # 날짜데이터는 가장 가공하기 쉬운 형태로 데이터베이스에 저장해놔야한다. # 국가마다 혹은 상황에 따라 날짜를 표기하는 방식이 달라질 수 있다. # utcnow는 밀리세컨즈로 나오기에 1000을 곱하고 소숫점이 나올 수 있으므로 round 함수로 반올림해준다. board = mongo.db.board # mongo.db 까지는 써야된다. 위에서 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 str(x.inserted_id) else: return render_template("write.html") # html 파일은 경로가 없는데 templates 폴더에 있는 write.html을 찾아서 렌더링해서 우리가 볼 수 있게된다. if __name__ == "__main__": app.run(host="0.0.0.0", debug=True, port=9000) write.html write 작성자 제목 내용 view.html {{result.title}} {{result.name}} {{result.pubdate|formatdatetime}} {{result.view}} {{result.contents}} 이게 코드 전부입니다. 위에서 {% %} 부분을 지우면 TypeError TypeError: unsupported operand type(s) for +: 'float' and 'datetime.timedelta' Traceback (most recent call last) File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/flask/app.py", line 2463, in __call__ return self.wsgi_app(environ, start_response) File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/flask/app.py", line 2449, in wsgi_app response = self.handle_exception(e) File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/flask/app.py", line 1866, in handle_exception reraise(exc_type, exc_value, tb) File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise raise value File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/flask/app.py", line 2446, in wsgi_app response = self.full_dispatch_request() File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/flask/app.py", line 1951, in full_dispatch_request rv = self.handle_user_exception(e) File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/flask/app.py", line 1820, in handle_user_exception reraise(exc_type, exc_value, tb) File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise raise value File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/flask/app.py", line 1949, in full_dispatch_request rv = self.dispatch_request() File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/flask/app.py", line 1935, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/Users/magrfs/Desktop/inflearn_nam2/myweb/run.py", line 56, in board_view return render_template("view.html", result=result) File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/flask/templating.py", line 137, in render_template return _render( File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/flask/templating.py", line 120, in _render rv = template.render(context) File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/jinja2/environment.py", line 1090, in render self.environment.handle_exception() File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/jinja2/environment.py", line 832, in handle_exception reraise(*rewrite_traceback_stack(source=source)) File "/Users/magrfs/Desktop/inflearn_nam2/myweb/.venv/lib/python3.8/site-packages/jinja2/_compat.py", line 28, in reraise raise value.with_traceback(tb) File "/Users/magrfs/Desktop/inflearn_nam2/myweb/templates/view.html", line 6, in top-level template code {{result.pubdate|formatdatetime}} File "/Users/magrfs/Desktop/inflearn_nam2/myweb/run.py", line 33, in format_datetime value = datetime.fromtimestamp((int(value) / 1000) + offset) TypeError: unsupported operand type(s) for +: 'float' and 'datetime.timedelta' The debugger caught an exception in your WSGI application. You can now look at the traceback which led to the error. To switch between the interactive traceback and the plaintext one, you can click on the "Traceback" headline. From the text traceback you can also create a paste of it. For code execution mouse-over the frame you want to debug and click on the console icon on the right side. You can execute arbitrary Python code in the stack frames and there are some extra helpers available for introspection: dump() shows all variables in the frame dump(obj) dumps all that's known about the object 이런식으로 에러가 바뀌네요.
- 1
- 2
- 2.8K