Rest API

API 서버 - 로그인한 회원과 비회원 구분하여 시스템 개발하기 // jwt_required(optional= )

왕현성 2023. 1. 10. 13:13
728x90
 

GitHub - hyunsungKR/movie_api_server

Contribute to hyunsungKR/movie_api_server development by creating an account on GitHub.

github.com

 

from flask import request
from flask_restful import Resource

from mysql_connection import get_connection
from mysql.connector import Error
from flask_jwt_extended import jwt_required
from flask_jwt_extended import get_jwt_identity

class MovieListResource(Resource) :
    # 비회원과 회원을 구분 ->> optional= 
    # 헤더가 있으면 유저아이디를 가져오고
    # 헤더가 없으면 None로 가져온다.
    @jwt_required(optional=True)
    def get(self) :
        user_id = get_jwt_identity()

        print("유저 아이디")
        print(user_id)


        order=request.args.get('order')
        offset=request.args.get('offset')
        limit=request.args.get('limit')

        try :
            connection = get_connection()
			# if 문으로 유저 아이디가 None이면 아래 코드로 그렇지 않으면 else: 아래의 코드로 실행
            if user_id is None :

                query = '''select m.id,m.title,ifnull(count(r.movie_id),0) as cnt,ifnull(avg(r.rating) , 0) as avg
                        from movie m
                        left join rating r
                        on r.movie_id = m.id
                        group by m.id
                        order by '''+order+''' desc
                        limit '''+offset+''','''+limit+''';'''

                cursor = connection.cursor(dictionary=True)

                cursor.execute(query)
            else :
            	# where를 사용하지 않고 join의 아래에 on의 뒤에 and f.user_id = %s로 변수처리를 해준다
                # where를 사용하면 DB에서 변수가 들어있는 데이터만 가져오지만 아래와같이 코드를 작성하면
                # user_id가 변수가 아닌 것은 null로 가져온다.
                query = '''select m.id,m.title,ifnull(count(r.movie_id),0) as cnt,
                        ifnull(avg(r.rating) , 0) as avg,if(f.user_id is null,0,1) as is_favorite
                        from movie m
                        left join rating r
                        on r.movie_id = m.id
                        left join favorite f
                        on m.id = f.movie_id and f.user_id = %s
                        group by m.id
                        order by '''+order+''' desc
                        limit '''+offset+''','''+limit+''';'''
                
                record = (user_id,)

                cursor = connection.cursor(dictionary=True)

                cursor.execute(query,record)


            result_list=cursor.fetchall()

            i = 0
            for row in result_list :
                result_list[i]['avg'] = float(row['avg'])
                i = i+1

            print(result_list)
            

            cursor.close()
            connection.close()
        except Error as e :
            print(e)
            cursor.close()
            connection.close()
            return{"result":"fail","error":str(e)}, 500
        


        return {"result" : 'seccess','items':result_list,'count':len(result_list)}, 200