진즉에 작성했어야는데 급여명세서 이슈로 미루다미루다 이제야 작성..
셋째 주는 복습같은 느낌이라 새로운 내용이 거의 없었는데 4주차는 새로운 기능이 많아서 3주차에 일부 기능을 좀 분산해서 알려주었으면 좋았겠다고 생각했다.
순수 CSS 프레임워크, 꾸미기 특화인듯 하다. 교육 중 사용한 버전은 0.9.1이지만 공식 홈페이지를 가보니 현재는 0.9.3이 최신인듯
https://bulma.io/documentation/overview/start/ 에서 import 주소를 확인할수 있다.
임의의 데이터를 입력 받아 항상 고정된 길이의 임의의 값으로 변환해주는 함수
계정 비밀번호 저장 시 DB에서 비밀번호를 보더라도 바로 알아볼 수 없도록 비밀번호의 해시값을 DB에 저장하였다.
import hashlib
pw_hash = hashlib.sha256(비밀번호.encode('utf-8')).hexdigest()
문자열을 encode로 byte형태로 바꾸지 않으면 sha256으로 암호화 불가
sha256 자체는 object이기 때문에 hexdigest()는 필수라고 한다
hash = hashlib.sha256()
hash.update(b"해시화할 값")
hash.hexdigest()
이렇게도 가능한듯
로그인한 사용자에게 서버에서 '토큰'을 발행하여 사용자가 유효한지 확인할 수 있다.
사용자 쪽에서는 웹페이지나 기능에 접근할 때 쿠키에 저장되어있는 토큰 정보를 서버에 전송하게 되는데, 이 때 토큰이 유효한지만 확인하면 페이지나 기능 접근을 허락/금지할 수 있다.
과정에서는 JSON Web Token(JWT)를 사용하였다
@app.route('/sign_in', methods=['POST'])
def sign_in():
username_receive = request.form['username_give']
password_receive = request.form['password_give']
pw_hash = hashlib.sha256(password_receive.encode('utf-8')).hexdigest()
result = db.users.find_one({'username': username_receive, 'password': pw_hash})
# 아이디 비밀번호가 맞는 계정이 있으면
if result is not None:
payload = {
'id': username_receive,
'exp': datetime.utcnow() + timedelta(seconds=60 * 60 * 24) # 로그인 24시간 유지
}
# SECRET_KEY가 있어야 추후 토큰 검증이 가능한데, 임의의 문자열로 가능하다
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
return jsonify({'result': 'success', 'token': token})
else:
return jsonify({'result': 'fail', 'msg': '아이디/비밀번호가 일치하지 않습니다.'})
@app.route('/posting', methods=['POST'])
def posting():
# 이건 클라이언트 쪽에서 받을 때 $.cookie('mytoken', response['token'], {path:'/'}) 로 받았기 때문에 mytoken
token_receive = request.cookies.get('mytoken')
try:
# 토큰 검증
payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
user_info = db.users.find_one({"username": payload["id"]})
... (작업)
return jsonify({"result": "success", 'msg': '포스팅 성공'})
# 토큰이 만료되었거나 검증 실패한 경우
except (jwt.ExpiredSignatureError, jwt.exceptions.DecodeError):
return redirect(url_for("home"))
Javascript에서 간단한 조건문이라면 아래와 같이 True/False에 따른 값을 불러올 수 있다
# 조건이 True면 : 앞의 값을, False
condition ? exprIfTrue : exprIfFalse
#다중 조건도 처리가 가능하다. Excel의 if 중첩을 생각하면 쉬울듯
condition1 ? value1 : condition2 ? value2 : condition3 ? value3 : value4;
# 결과값 뒤에 바로 .sort, .limit을 붙여주면 된다
# -1은 내림차순, 1은 오름차순
list(db.posts.find({}).sort("정렬 기준", -1).limit(갯수 제한))
# 여러 기준에 대해 정렬도 가능하다
# pymongo.ASCENDING / DECENDING 으로도 오름/내림차순을 정할 수 있다
list(db.posts.find({}).sort([("정렬 기준 1", pymongo.ASCENDING),
("정렬 기준2",pymongo.DESCENDING)]).limit(갯수 제한))