-
Notifications
You must be signed in to change notification settings - Fork 1
3. 문제를 이렇게 해결했어요!
HyeonKyu edited this page Oct 19, 2021
·
8 revisions
jquery로 로그아웃 코드를 넣었지만 $.removecookie is not a function 이라는 오류가 계속 발생했습니다.
$.removeCookie 대신 document.cookie를 사용하여 만료일자를 과거로 지정해서 쿠키가 삭제되도록 했습니다.
- 변경 전
<!-- JS -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js"></script>
<script>
function sign_out() {
$.removeCookie('mytoken', {path: '/'});
alert('로그아웃!')
window.location.href = "/login"
}
</script>
- 변경 후
let delete_cookie = function (name) {
document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT;';
};
DB URL, 암호화 Key 값 등 서버 중요정보를 외부 파일에 저장했습니다.
python-dotenv 라이브러리를 활용하여 Python code에서 import 했습니다.
- 변경 전
client = MongoClient('localhost', 27017)
SECRET_KEY = "SECRETKEY"
- 변경 후
from dotenv import load_dotenv
import os
load_dotenv()
client = MongoClient(os.environ.get("MONGO_URL"))
SECRET_KEY = os.environ.get("SECRET_KEY")
로컬에서는 실행되던 스케줄러가 AWS EB 환경에서 실행되지 않는 문제가 발생했습니다.
서울의 시간으로 설정 안 해줘서 생기는 문제라고 판단, 설정 후 제대로 작동하는 걸 확인했습니다.
- 소스 코드
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
@scheduler.scheduled_job('cron', hour='00', minute='00', id='schedule-job', timezone='Asia/Seoul')
def challenge_scheduler():
today = datetime.now()
yesterday = today - timedelta(1)
date = yesterday.strftime("%Y-%m-%d")
db.challenge.update_many({'challenge_endTime': date}, {'$set': {'challenge_ing': 1}})
scheduler.start()
기존의 main 브런치만으로 개발을 진행하다가 Github actions으로 배포 자동화 환경을 구성하면서
배포, 개발 branch를 분리할 필요성을 느껴서 배포할 branch main과 개발 branch develop으로 branch를 나눴습니다.
검색 기능 구현 시 전체 리스트를 가져와 for문을 이용해 리스트 하나씩 비교하는 코드 대신
mongo db.find() 옵션을 이용하여 특정 값이 포함되어 있는 데이터를 가져오도록 했습니다.
- 변경 전
challenges = objectIdDecoder(list(db.challenge.find({})))
search_ch = []
for challenge in challenges:
if search_receive in challenge["challenge_title"]:
search_ch.append(challenge)
- 변경 후
search_challenges = object_id_decoder(list(db.challenge.find({'challenge_title': {'$regex': search_receive}})))
기존의 유저가 로그인했는지 검사하는 로직이 많은 부분에서 중복되어서
decorator 라이브러리로 어노테이션을 만들어서 중복된 로직을 제거했습니다.
- 변경 전
@application.route('/tmp', methods=['GET'])
def tmp():
token_receive = request.cookies.get(TOKEN_NAME)
try:
payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
...
return jsonify({'result': exists})
except jwt.ExpiredSignatureError:
return jsonify({'result': '쿠키 만료'})
except jwt.exceptions.DecodeError:
return jsonify({'result': '쿠키값 디코드 실패'})
- 변경 후
@application.route('/tmp', methods=['GET'])
@login_required
def tmp():
...
user_id = request.user_id
- decorator.py
import jwt
import os
from dotenv import load_dotenv
from functools import wraps
from flask import request, redirect, url_for
load_dotenv()
SECRET_KEY = os.environ.get('SECRET_KEY')
TOKEN_NAME = 'fever-time'
def login_required(func):
@wraps(func)
def decorated_function(*args, **kwargs):
token_receive = request.cookies.get(TOKEN_NAME)
try:
payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
user_id = payload['id']
request.user_id = user_id
return func(*args, **kwargs)
except jwt.ExpiredSignatureError:
return redirect(url_for('login', msg='로그인 시간이 만료되었습니다.'))
except jwt.exceptions.DecodeError:
return redirect(url_for('login', msg='로그인 정보가 존재하지 않습니다.'))
return