TIL - 22.05.09 인스타 클론코딩 with flask

개발자 macan·2022년 5월 10일
0

팀프로젝트

목록 보기
2/2

구현 api 목록

  1. 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)
  1. 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';
    
                }
            })
        }
    }
  2. 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'})
    
  3. 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)
profile
개발자로 첫걸음

0개의 댓글