본문 바로가기
Restful API

[Restful API] 회원, 비회원 둘 다 동작하는 API 만들기

by coding_su 2023. 1. 10.

📝회원, 비회원 둘 다 동작하는 API 만들기

클래스 안에 함수를 만들때 위에 @jwt_required()를 입력하면 로그인한 사람만 그 페이지의 정보를 볼 수 있다

로그인 한 사람과 로그인하지 않은 사람도 볼 수 있게 하기 위해서는 @jwt_required(optional=True) 이렇게 입력 해야한다

 

user_id = get_jwt_identity() 했을때 로그인하지 않은 사람이라면 토큰값이 없기때문에 user_id에 None값이 저장된다

이 값으로 if문을 작성해 로그인한 사람과 로그인하지 않은 사람의 페이지를 다르게 보여줄 수 있다

class MovieListResource(Resource) :

    @jwt_required(optional=True) # 비회원도 동작 가능하게 설정
    def get(self) :
        order = request.args.get('order')
        offset = request.args.get('offset')
        limit = request.args.get('limit')

        user_id = get_jwt_identity()
        # 토큰이 없을때는 None값이 저장된다

        try :
            connection = get_connection()
			
            # 비회원이 보는 페이지
            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 m.id = r.movie_id
                        group by m.id
                        order by ''' + order + ''' desc
                        limit ''' + offset + ''' , ''' + limit + ''' ; '''

                cursor = connection.cursor(dictionary= True)

                cursor.execute(query, )
			# 회원이 보는 페이지(본인의 즐겨찾기가 보이게 추가한 페이지)
            else :
                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 'favorite'
                        from movie m
                        left join rating r on m.id = r.movie_id
                        left join favorite f on f.movie_id= m.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

            cursor.close()
            connection.close()

        except Error as e :
            print(e)
            cursor.close()
            connection.close()

            return {"error" : str(e)}, 500

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

 

 

댓글