상세 컨텐츠

본문 제목

영화 추천 서비스 API - 영화 목록 가져오기

API

by yjh0922 2022. 6. 23. 16:50

본문

Mysql movie 테이블

 

vsc 가입 및 작업에 필요한 코드 세팅해두기

# utils.py 파일

from tabnanny import check
from click import password_option
from passlib.hash import pbkdf2_sha256

# 원문 비밀번호를, 암호화 하는 함수
def hash_password(original_password) :
    salt = 'jh*hello12'
    password = original_password + salt
    password = pbkdf2_sha256.hash(password)
    return password

# 비밀번호가 맞는지 확인하는 함수, True / False를 리턴한다.

def check_password(original_password, hashed_password) :
    salt = 'jh*hello12'
    check = pbkdf2_sha256.verify(original_password+salt, hashed_password)
    return check

# mysql_connection.py 파일

import mysql.connector

def get_connection() :
    connection = mysql.connector.connect(
        host = 'jhdb.ct294vqgyq74.ap-northeast-2.rds.amazonaws.com',
        database = 'movie1_db',
        user = 'movie_user',
        password = 'movie1234'
    )
    return connection
    
# config.py 파일

from enum import Flag


class Config :
    JWT_SECRET_KEY = 'yhacademy1029##hello'
    JWT_ACCESS_TOKEN_EXPIRES = False
    PROPAGATE_EXEPTIONS = True

 

vsc코드

# app.py 파일

# 인폴트부분
from resources.movie import MovieListResource
#선언부분
api.add_resource(MovieListResource, '/movie')

# movie.py 파일

#인폴트부분
from http import HTTPStatus
from flask import request
from flask_jwt_extended import get_jwt_identity, jwt_required
from flask_restful import Resource
from mysql.connector.errors import Error
from mysql_connection import get_connection
import mysql.connector

#선언부분
class MovieListResource(Resource):

    def get(self) :
        # 1. 클라이언트로부터 데이터 받아온다.
        # offset : 0 , limit : 25, order : cnt or avg => cnt:카운트, avg: 평균

        offset = request.args['offset']
        limit = request.args['limit']
        order = request.args['order']

        # 2. 디비로부터 영화 가져온다.
        try :
            # 데이터 insert
            # 1. DB에 연결
            connection = get_connection()
            
            # 2. 쿼리문 만들기
            query = '''select m.id, m.title,count(r.movieId) as cnt, ifnull(avg(r.rating), 0) as avg
            # moive 테이블의 id , title, 레이팅의 movieId의 갯수를 가져온다. , 해당 영화의 평점 평균을 가져온다.
                        from movie m
                        left join rating r
                        on m.id = r.movieId
                        group by m.id
                        order by ''' + order + ''' desc
                        limit '''+offset+''' , '''+limit+'''; '''

            # record = (user_id, )                  

            # 3. 커서를 가져온다.
            # select를 할 때는 dictionary = True로 설정한다.
            cursor = connection.cursor(dictionary = True)

            # 4. 쿼리문을 커서를 이용해서 실행한다.
            cursor.execute(query)

            # 5. select 문은, 아래 함수를 이용해서, 데이터를 받아온다.
            result_list = cursor.fetchall()

            print(result_list)
            
            # # 중요! 디비에서 가져온 timstamp는 
            # # 파이썬의 datetime 으로 자동 변경된다.
            # # 문제는 이 데이터를 json으로 바로 보낼 수 없으므로,
            # # 문자열로 바꿔서 다시 저장해서 보낸다.
            i=0
            for record in result_list :
                result_list[i]['avg'] = float(record['avg'])
                
                i = i+1
            # 6. 자원 해제
            cursor.close()
            connection.close()

        except mysql.connector.Error as e :
            print(e)
            cursor.close()
            connection.close()
            return {"error" : str(e), 'error_no' : 20}, 503

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

 

 

관련글 더보기