Rest API
API 서버 - 로그인한 회원과 비회원 구분하여 시스템 개발하기 // jwt_required(optional= )
왕현성
2023. 1. 10. 13:13
728x90
- 해당 기능만을 서술한 포스팅으로, 전체 기능에 대한 소스 코드 확인은 깃허브에서 확인 가능합니다.
https://github.com/hyunsungKR/movie_api_server
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