@jwt_required() 의 기본 동작은 헤더에 token이 없으면 접근이 불가한데,
파라미터 optional에 True를 주면 token이 없어도 접근할 수 있다.
이를 이용해, 분기 처리를 해서 비회원과 로그인 한 회원의 동작을 다르게 하는 API를 만들 수 있다.
영화 리스트를 가져오는 API 코드
- 회원인 경우 즐겨찾기 정보도 추가해서 가져온다.
from flask import request
from flask_restful import Resource
from mysql.connector import Error
from flask_jwt_extended import jwt_required, get_jwt_identity
# mysql.connector 를 사용해 만든 MySQL 접속 함수
from mysql_connection import get_connection
class MovieListResource(Resource):
# 로그인한 유저(헤더에 JWT 토큰이 있는 유저)는
# 즐겨찾기 정보를 추가로 내보내게 수정
@jwt_required(optional=True)
def get(self):
user_id = get_jwt_identity()
# 클라이언트에서 쿼리스트링으로 보내는 데이터는
# request.args에 들어있다.
order = request.args.get('order')
offset = request.args.get('offset')
limit = request.args.get('limit')
try:
connection = get_connection()
# 토큰이 없는 경우
if not user_id:
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)
# 토큰이 있는 경우
elif user_id:
query = '''
select m.id, m.title,
ifnull(count(r.movie_id), 0) as cnt,
ifnull(avg(r.rating), 0) as avg,
if(f.movie_id is not null, 1, 0) as is_favorite
from movie m
left join rating r
on m.id = r.movie_id
left join (select * from favorite where user_id = %s) f
on m.id = f.movie_id
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()
for row in result_list:
row['avg'] = float(row['avg'])
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
'REST API' 카테고리의 다른 글
API서버 - 클라이언트에게 받은 이미지와 텍스트를 DB에 저장하는 API (0) | 2023.01.13 |
---|---|
API서버 - AWS Rekognition을 사용한 Object Detection API (0) | 2023.01.13 |
API서버 - Flask 쿼리스트링(Query String)을 사용한 API (0) | 2023.01.06 |
Flask - PROPAGATE_EXCEPTIONS에 대한 이해 (0) | 2023.01.06 |
Flask에서 JWT 사용하기 (flask-jwt-extended) (0) | 2023.01.05 |