From 6ebed1639017501eea04d1c43e5b8d5101697444 Mon Sep 17 00:00:00 2001 From: gilyeon00 <12venus08@naver.com> Date: Thu, 29 Sep 2022 16:56:31 +0900 Subject: [PATCH] =?UTF-8?q?Feat=20:=20#24=20api=20req/res=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 24 +++--------- config/ai_config.py | 2 +- entity/model.py | 6 +-- requirements.txt | 6 ++- s3bucket/s3_connect.py | 2 +- service/image_service.py | 85 ++++++++++++++++++---------------------- 6 files changed, 53 insertions(+), 72 deletions(-) diff --git a/app.py b/app.py index a2891c0..0905f13 100644 --- a/app.py +++ b/app.py @@ -147,29 +147,15 @@ def post(self): @ladder_api.route('/convert-image') class ConvertImage(Resource): def post(self): - # if not request.is_json: - # return jsonify({"msg": "Missing JSON in request"}), 400 - - # email = get_jwt_identity() + origin_image = request.files['file'] + print('originImage request OK') - # email = request.json.get('email') + result_url = saveOriginImage(origin_image) + print("saveImage OK") - # header_request = request.headers - # bearer = header_request.get('Authorization') - # if not bearer: - # return {"error": "You don't have access authentication."}, 401 - # access_token = bearer.split()[1] - # email = pyjwt.decode(access_token, app.config['JWT_SECRET_KEY'], 'HS256')['sub'] - # print(email) + return result_url - originImage = request.files['file'] - print('originImage request OK') - resultImage = saveOriginImage(originImage) - print("saveImage OK") - resp = jsonify(resultImage) - resp.status = 201 - return resp ## Create user @app.route('/create-user', methods=['POST']) diff --git a/config/ai_config.py b/config/ai_config.py index 2cf0d99..27ffbe9 100644 --- a/config/ai_config.py +++ b/config/ai_config.py @@ -3,7 +3,7 @@ # AI_SERVER_HOST=os.environ.get('AI_HOST') # AI_SERVER_PORT=os.environ.get('AI_PORT') -AI_CONVERT_API=f'http://ai:5555/images/result' +AI_CONVERT_API=f'http://ai:5555/api/v1/converting-image' # RABBITMQ_HOST=os.environ.get('RABBITMQ_HOST') # RABBITMQ_PORT=os.environ.get('RABBITMQ_PORT') diff --git a/entity/model.py b/entity/model.py index fca9266..16e6065 100644 --- a/entity/model.py +++ b/entity/model.py @@ -5,7 +5,7 @@ db = flask_sqlalchemy.SQLAlchemy() class User(db.Model): - __tablename__ = 'user' + __tablename__ = 'User' user_id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(50), nullable=False) email = db.Column(db.String(100), unique=True, nullable=False) @@ -25,9 +25,9 @@ def check_password(self, password): class Image(db.Model): - __tablename__ = 'image' + __tablename__ = 'Image' image_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - user_id = db.Column(db.Integer, db.ForeignKey('user.user_id'), nullable=False) + user_id = db.Column(db.Integer, db.ForeignKey('User.user_id'), nullable=False) origin_url = db.Column(db.String(200)) result_url = db.Column(db.String(200)) create_at = db.Column(db.DateTime, default=datetime.now) diff --git a/requirements.txt b/requirements.txt index 8f4fda4..934f80a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,4 +19,8 @@ flask_jwt_extended flask_bcrypt flask_restx redis -requests \ No newline at end of file +requests +pillow +pybase64 +bytesbufio +matplotlib \ No newline at end of file diff --git a/s3bucket/s3_connect.py b/s3bucket/s3_connect.py index ae69cb6..438638a 100644 --- a/s3bucket/s3_connect.py +++ b/s3bucket/s3_connect.py @@ -7,7 +7,7 @@ def s3_connection(): service_name = "s3", region_name = "ap-northeast-2", aws_access_key_id = "AKIAWLCHMQTOJFJOXENM", - aws_secret_access_key = "" + aws_secret_access_key = "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" # secret key 넣고 사용해주세요 ) print("s3 bucket connected!1") diff --git a/service/image_service.py b/service/image_service.py index 15e348b..c8f9d27 100644 --- a/service/image_service.py +++ b/service/image_service.py @@ -3,8 +3,9 @@ from s3bucket import s3_connect from api import s3_api -from entity.model import Image from entity import database +from entity.model import User, Image +from entity.model import db import requests from datetime import datetime as dt @@ -15,6 +16,12 @@ import jwt as pyjwt import redis +import base64 +from PIL import Image +from io import BytesIO +import matplotlib.pyplot as plt + + secrets_key = 'Ladder_teamc' jwt_redis = redis.StrictRedis(host='redis', port=6379, decode_responses=True) @@ -26,38 +33,6 @@ # 사진 받아오는 함수 def saveOriginImage(file) : - - # header_request = request.headers - # bearer = header_request.get('Authorization') - - # # upload api for no login users - # if not bearer: - # email = "anonymous@nouser.com" - # user_id = 999 - # # postgres image table에 업로드 - # origin_url = "https://ladder-s3-bucket.s3.ap-northeast-2.amazonaws.com/origin/"+origin_image_name - # origin_url = origin_url.replace(" ","/") - # database.add_instance(Image, user_id = user_id, origin_url = origin_url, is_deleted = False) - - # return origin_url - - # # upload api for login users - # access_token = bearer.split()[1] - # email = pyjwt.decode(access_token, secrets_key, 'HS256')['sub'] - - # # check signout user - # user_access_key = email + '_access' - # is_logout = jwt_redis.get(user_access_key) - # if is_logout: - # return {"msg": "This is a invalid user."}, 401 - - # 이메일 받아오면 user_id 찾기 - # sql = f"SELECT user_id \ - # FROM user \ - # WHERE email='{email}'" - # cursor = database.session_execute(sql) - # user_id = cursor.fetchall()[0][0] - user_id = 1 # 파일 이름 지정 @@ -77,32 +52,45 @@ def saveOriginImage(file) : # ai 셀러리 요청, 이제 요 다음부터 비동기처리 convertImage.delay(origin_url) - return origin_url - - -# celery가 처리할 거 - # api요청 (ai 서버) @app.task() def convertImage(origin_url): - print("convertImage def : 11111111111") - headers = {'Content-Type': 'application/json; chearset=utf-8'} + req = {'img' : origin_url} - print("=========================================") print(req) - # request : params = request.get_json() - # response : make_photo(params['img']) - result_image = requests.post(AI_CONVERT_API, req, timeout=5) + res = requests.post(AI_CONVERT_API,json=req) + result_json = res.json() print("convertImage def : 333333333333") - #result_image.request.get_file() - saveResultImage(result_image) + # result_url type : + + # image_dict = { + # "converted_image_name": file_name, + # "converted_image.png": encoded_string.decode() + # } + + converted_image_name = result_json['converted_image_name'] + converted_image = result_json['converted_image.png'] + converted_image = converted_image.open(BytesIO(base64.b64decode(base64_string))) + + print("===============app.task finish====================s") + print("===============app.task finish====================s") + print("===============app.task finish====================s") + print(converted_image_name) + + result_url = saveResultImage(converted_image) + print(result_url) + print("===============app.task finish====================s") + + return result_url # 변환된 사진 저장 def saveResultImage(file) : - + print("filename================") + # AttributeError: 'Response' object has no attribute 'filename' + # AttributeError: 'bytes' object has no attribute 'filename' user_id =1 # 파일 이름 지정 filename = file.filename.split('.')[0] @@ -116,8 +104,11 @@ def saveResultImage(file) : # postgres image table에 origin_url 업로드 result_url = "https://ladder-s3-bucket.s3.ap-northeast-2.amazonaws.com/result/"+result_image_name result_url = result_url.replace(" ","/") + database.add_instance(Image, user_id = user_id, result_url = result_url, is_deleted = False) print("성공적으로 변환된 사진이 S3에 저장되었습니다.") + return result_url +