기능 추가로 프로그램이 바뀔 때 버전이 바뀐다고 한다 → [버전1 → 기능 추가 → 버전1.1]
예를 들어 RPG게임을 만들어서 1.0버전이라고 뒀다 그 게임에 여러 기능을 추가 및 삭제 한 버전이 1.1버전 이런식이 되는 것이다.
만약 1.1버전이 문제가 생겨서 1.0버전으로 돌아가야할 경우 따로 보관해야하고 복잡하지만 이걸 버전 관리 시스템이 따로 관리 해줘서 1.1버전에서 1.0버전 또는 1.0버전에서 1.1버전으로 편하게 드나들 수 있다.
📝버전 관리 시스템
버전 관리를 지원해주는 시스템이다 →Git, SVN
📝중앙집중형 시스템
저장소가 서버에 있어서 서버와 연결이 끊어지면 기존 받아둔 소스 수정 이외의 일(이전 로그를 본다던지...)을 못한다 → SVN
📝분산형 버전관리 시스템
모든 개발자가 각자의 저장소를 가지고, 각자 저장소에서 여러가지 작업을 한 뒤 한번에 서버에 반영 가능 오프라인 환경에서도 로컬저장소에 Commit하면 되고 로그를 볼 수 있다 → Git
📝SVN
Subversion (SVN)은 버전 관리 시스템 중 하나로, 소스 코드 및 다른 종류의 파일의 변경 이력을 관리하고 추적하는 데 사용 소프트웨어 개발 프로젝트에서 협업과 소스 코드 관리를 향상시키기 위해 널리 사용 다수의 사용자가 동시에 작업하고, 변경사항을 추적하며, 필요한 경우 이전 버전으로 롤백할 수 있는 기능을 제공
from datetime import datetime
from flask import Blueprint, url_for, request, render_template, g
from werkzeug.utils import redirect
from .. import db
from ..models import Question, Answer
from ..forms import AnswerForm
bp = Blueprint('answer', __name__, url_prefix='/answer')
@bp.route('/create/<int:question_id>', methods=('POST', ))
def create(question_id):
form = AnswerForm()
question = Question.query.get_or_404(question_id) # 그 질문에 해당하는 번호를 가져온다.
if form.validate_on_submit():
content = request.form['content'] # name 속성이 content인 값
answer = Answer(content=content, create_date=datetime.now(), user=g.user) # textArea 내용, 작성시각, 작성자
question.answer_set.append(answer) # question.answer_set 은 Answer과 동일 즉, 거기에다가 값을 추가하는 것임
db.session.commit() # db에 저장
return redirect(url_for('question.detail', question_id=question_id)) # 상세 질문과 답변이 있는 페이지로 전달
return render_template('question/question_detail.html', question=question, form=form)
answer_views.py입니다.
댓글 작성자가 필요하기 때문에 로그인 되어 있으면 g.user에 id가 저장되어 있으므로 그걸 user에다 저장합니다.
from datetime import datetime
from flask import Blueprint, render_template, request, url_for, g
from ..models import Question
from werkzeug.utils import redirect
from .. import db
from ..forms import QuestionForm, AnswerForm
bp = Blueprint('question', __name__, url_prefix='/question')
@bp.route('/list')
def _list():
page = request.args.get('page', type=int, default=1) # 페이지
question_list = Question.query.order_by(Question.create_date.desc())
question_list = question_list.paginate(page, per_page=10)
return render_template('question/question_list.html', question_list=question_list)
@bp.route('/detail/<int:question_id>')
def detail(question_id):
form = AnswerForm()
question = Question.query.get_or_404(question_id)
return render_template('question/question_detail.html', question=question, form=form)
@bp.route('/create/', methods=('GET', 'POST'))
def create():
form = QuestionForm()
if request.method == 'POST' and form.validate_on_submit():
question = Question(subject=form.subject.data, content=form.content.data, create_date=datetime.now(), user=g.user)
db.session.add(question)
db.session.commit()
return redirect(url_for('main.index'))
return render_template('question/question_form.html', form=form)
question_views.py 입니다.
글 작성자가 필요하기 때문에 로그인 되어 있으면 g.user에 id가 저장되어 있으므로 user에다 저장합니다.
로그아웃 상태에서 질문 또는 답변을 등록이 불가능하게 오류를 발생시켜보도록 하겠습니다.
@login_required 어노테이션을 지정하면 login_required 데코레이션 함수가 먼저 실행 됩니다.
(즉 def login_required(view)라는 것이 @login_required 과 똑같은 의미입니다.)
login_required 함수는 g.user가 있는지 조사하고 없으면 로그인 URL로 리다이렉트합니다.
g.user가 있으면 원래 함수를 그대로 실행합니다.
이런걸 데코레이터 함수라고 하는데 나중에 설명해서 올리도록 하겠습니다.
from datetime import datetime
from flask import Blueprint, url_for, request, render_template, g
from werkzeug.utils import redirect
from .auth_views import login_required
from .. import db
from ..models import Question, Answer
from ..forms import AnswerForm
bp = Blueprint('answer', __name__, url_prefix='/answer')
@bp.route('/create/<int:question_id>', methods=('POST', ))
@login_required
def create(question_id):
form = AnswerForm()
question = Question.query.get_or_404(question_id) # 그 질문에 해당하는 번호를 가져온다.
if form.validate_on_submit():
content = request.form['content'] # name 속성이 content인 값
answer = Answer(content=content, create_date=datetime.now(), user=g.user) # textArea 내용, 작성시각, 작성자
question.answer_set.append(answer) # question.answer_set 은 Answer과 동일 즉, 거기에다가 값을 추가하는 것임
db.session.commit() # db에 저장
return redirect(url_for('question.detail', question_id=question_id)) # 상세 질문과 답변이 있는 페이지로 전달
return render_template('question/question_detail.html', question=question, form=form)
answer_views.py 입니다
@login_required를 넣어서 로그인 라우트가 실행하기 전에 로그인 되어있는지 확인하는 것입니다.
from datetime import datetime
from flask import Blueprint, render_template, request, url_for, g
from .auth_views import login_required
from ..models import Question
from werkzeug.utils import redirect
from .. import db
from ..forms import QuestionForm, AnswerForm
bp = Blueprint('question', __name__, url_prefix='/question')
@bp.route('/list')
def _list():
page = request.args.get('page', type=int, default=1) # 페이지
question_list = Question.query.order_by(Question.create_date.desc())
question_list = question_list.paginate(page, per_page=10)
return render_template('question/question_list.html', question_list=question_list)
@bp.route('/detail/<int:question_id>')
def detail(question_id):
form = AnswerForm()
question = Question.query.get_or_404(question_id)
return render_template('question/question_detail.html', question=question, form=form)
@bp.route('/create/', methods=('GET', 'POST'))
@login_required
def create():
form = QuestionForm()
if request.method == 'POST' and form.validate_on_submit():
question = Question(subject=form.subject.data, content=form.content.data, create_date=datetime.now(), user=g.user)
db.session.add(question)
db.session.commit()
return redirect(url_for('main.index'))
return render_template('question/question_form.html', form=form)