점프 투 플라스크/2-06. 데이터 저장 질문입니다.
answer에 해당하는 블루프린트 파일을 아래와 같이 작성했습니다.
#answer_views.py
from datetime import datetime
from flask import Blueprint, url_for, request
from werkzeug.utils import redirect
from pybo import db
from pybo.models import Question, Answer
bp = Blueprint('answer', __name__, url_prefix='/answer')
@bp.route('/create/<int:question_id>', methods=('POST',))
def create(question_id):
question = Question.query.get_or_404(question_id)
content = request.form['content']
answer = Answer(content=content, create_date=datetime.now())
question.answer_set.append(answer)
db.session.commit()
return redirect(url_for('question.detail', question_id=question_id))
첫번째 질문입니다. 위와같이 작성한 후 127.0.0.1:5000/answer/create/2 에 접속하면 Method Not Allowed 가 떠야하는데, 404 에러가 뜹니다. 이건 큰 에러는 아니었지만, Method Not Allowed 가 뜨지않아 우선 첫번째 질문으로 남겨놨습니다.
두번째 질문입니다. answer_views.py의 블루프린트 객체를 init.py 파일에 아래와 같이 등록했습니다. 이후 AssertionError: The sqlalchemy extension was not registered to the current application. Please make sure to call init_app() first.
라는 에러가 떴습니다. init.py 파일은 아래와 같이 작성했습니다.
from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
import config
db = SQLAlchemy()
migrate = Migrate()
def create_app():
app = Flask(__name__)
app.config.from_object(config)
from .views import main_views, question_views, answer_views
app.register_blueprint(main_views.bp)
app.register_blueprint(question_views.bp)
app.register_blueprint(answer_views.bp)
# #question_views.py에 등록한 BluePrint 적용.
# from .views import main_views, question_views
# app.register_blueprint(main_views.bp)
# app.register_blueprint(question_views.bp)
#
# db.init_app(app)
# migrate.init_app(app, db)
# from . import models # migrate 객체가 models.py를 참조할 수 있게됨.
#
# from .views import main_views
# app.register_blueprint(main_views.bp)
return app
두가지 질문 중 두번째 질문이 제일 궁금합니다. 우선 어제처럼 질문 먼저 올려놓고 해결하면 다시 댓글달겠습니다.
dev_min_noob 님 1006
2020년 9월 1일 6:07 오후
3개의 답변이 있습니다. 1 / 1 Page
박응용님의 플라스크 책을 끝내고 온 학생입니다. 아직 많이 부족하지만 제가 아는 선에서 말씀드리겠습니다.
1) Question.query.get_or_404(question_id)
이부분을 보시면 아실것같습니다. 즉 db의 Question테이블에서 해당 question_id key값을 가진 row가 존재하지 않아서 404 error즉
서버에서 클라이언트의 요청에 수신은 했지만 요청 내용을 찾지 못했다는 에러를 보내주게 됩니다.
2)AssertionError: The sqlalchemy extension was not registered to the current application.
에러그대로 아는선에서 해석하면, sqlalchemy 확장이 현재 app에 등록되지 않았다. 즉 db쪽 문제인것 같습니다. 마찬가지로
오류에도 init_app()을 작성하라고 했구요. db.init_app(app)이 구문을 실행시키지 않아서 그런 것 같은데 혹시 주석을 안달고 실행하셨을 때 나오신 오류라면 config파일이 혹시 제대로 작성이 되셨는지 부탁드립니다. 되지 않으신다면 저도 좀 찾아봐야 할 듯하네요. 화이팅하세요~!
2020년 9월 2일 5:42 오전
intimate531 님 답변에 추가로 답변하자면...
1) 폼 태그에 method="post" 문장 없이 폼을 전송할 경우에 "Method Not Allowed" 가 발생하는데 이미 폼에 설정을 하신건 아닌지요..
2) 보여주신 소스에 보면 db.init_app() 코드가 주석처리되어 있네요. 주석 처리부분을 주석해제해 보세요.
박응용 님
2020년 9월 2일 9:52 오전
1) 폼 태그에 post 문장없이 폼을 전송할경우 Method Not Allowed가 뜨더군요..선생님 말씀처럼 form태그에 post를 설정해서 Method Not Allowed가 안뜨는거였습니다..ㅠㅠ
2) 주석을 해제해도 안되길래 고민했는데 initimate531님 말씀처럼 config 파일을 확인해보니 오타가 있더군요. 수정해보니 잘됩니다ㅠㅠ두분의 피드백에 진심으로 감사드립니다.
2020년 9월 2일 10:17 오전