구현 api 목록
login - 서버, 클라이언트
1) 서버
from functools import wraps
from io import BytesIO
from django.test import RequestFactory
from flask import Flask, jsonify, render_template, request, abort
from datetime import date, datetime, timedelta
from pymongo import MongoClient
import base64
import jwt
import hashlib
from bson.objectid import ObjectId
from PIL import Image
client = MongoClient('mongodb+srv://@cluster0.qwbpf.mongodb.net/myFirstDatabase?retryWrites=true&w=majority')
import certifi
SECRET_KEY = 'spaceGram'
db = client.dbsparta
app = Flask(__name__)
def authrize(f):
@wraps(f)
def decorated_function(*args, **kws):
if not 'mytoken' in request.cookies:
abort(401)
user = None
token = request.cookies['mytoken']
try:
user = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
except:
abort(401)
return f(user, *args, **kws)
return decorated_function
@app.route('/')
def login_page():
return render_template('login_page.html')
@app.route('/login',methods=['POST'])
def sign_in():
email_receive = request.form['email_give']
pw_receive = request.form['pw_give']
hashed_pw = hashlib.sha256(pw_receive.encode('utf-8')).hexdigest()
result = db.user.find_one({'email':email_receive, 'password': hashed_pw})
if result is not None:
payload = {
'id' : str(result.get('_id')),
'nick_name':result.get('nick_name'),
'exp' : datetime.utcnow() + timedelta(seconds=60 * 60 * 24)
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
return jsonify({'result': 'success', 'token': token})
else:
return jsonify({'result':'fail', 'msg': '아이디/비밀번호 오류!'})
2) 클라이언트
function sign_in() {
login_id = $('#login_id').val();
login_pw = $('#login_pw').val();
$.ajax({
type: 'POST',
url: '/login',
data: {
email_give: login_id,
pw_give: login_pw
},
success: function (response) {
if (response['result'] == 'success') {
$.cookie('mytoken', response['token'], { path: '/' });
window.location.replace('/home')
} else {
alert(response['msg'])
}
}
});
}
// const lp_s_b_li_s_btn_blue = document.querySelector('.lp_s_b_li_s_btn_blue');
// lp_s_b_li_s_btn_blue.addEventListener('click',sign_in)
const lp_s_b_li_s_btn_blue = document.querySelector('.lp_s_b_li_s_btn_blue');
lp_s_b_li_s_btn_blue.addEventListener('click', sign_in)
likes - 서버, 클라이언트
1) 서버
@app.route('/like', methods=['POST'])
@authrize
def likes(user):
if user is not None:
user_id = user.get('id')
post_id_receive = request.form['post_id']
action_receive = request.form['action_give']
doc = {
'user_id': user_id,
'post_id' : post_id_receive,
'timestamp': datetime.utcnow()
}
if action_receive == 'like':
db.likes.insert_one(doc)
else:
db.likes.delete_one({
'user_id': user_id,
'post_id': post_id_receive
})
return jsonify({'result':'success'})
2) 클라이언트
function like_button(post_id) {
console.log(post_id)
let heart_icon = document.getElementById(post_id)
if (heart_icon.classList.contains('bi-heart')) {
$.ajax({
type: 'POST',
url: '/like',
data: {
post_id: post_id,
action_give: 'like'
},
success: function (response) {
heart_icon.classList.replace('bi-heart', 'bi-heart-fill')
heart_icon.style.color = 'red';
}
})
} else {
$.ajax({
type: 'POST',
url: '/like',
data: {
post_id: post_id,
action_give: 'unlike'
},
success: function (response) {
heart_icon.classList.replace('bi-heart-fill', 'bi-heart')
heart_icon.style.color = 'black';
}
})
}
}
follow - 서버
1) 서버
@app.route('/follow_map', methods=['POST'])
@authrize
def follow(user):
if user is not None:
user_id = user.get('id')
follow_receive = request.form['target_user_id']
#
doc = {
'user_id': user_id,
'target_user_id': follow_receive,
'timestamp': datetime.utcnow()
}
check_follow = db.user.find_one({'user_id':user_id, 'target_user_id':follow_receive})
if check_follow is None :
db.follower_map.insert_one(doc)
else:
db.follower_map.delete_one({'user_id':user_id, 'target_user_id':follow_receive})
return jsonify({'result':'success'})
bookmark - 서버
1) 서버
@app.route('/mypage/book_mark', methods=['POST'])
@authrize
def bookmark(user):
if user is not None:
user_id = user.get('_id'),
post_id = request.form['post_id']
result = db.book_mark.find_one({'user_id': user_id, 'post_id': post_id})
doc = {
'user_id': user_id,
'post_id': post_id,
'timestamp': datetime.utcnow()
}
if result is not None:
db.book_mark.insert_one(doc)
else:
db.book_mark.delete_one({'user_id': user_id, 'post_id': post_id})
return jsonify({'result':'success'})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)