Flask RESTful API - GET /stores/{store_id} (매장상세정보조회 및 평점업데이트)

2019. 7. 3. 15:37Python/Flask

반응형
GET /stores/{store_id}

매장상세정보 조회는 store_id로 매장 상세 정보를 검색한다.
추가로 Selenium 을 이용하여서 카카오맵에 접속하여서 매장명을 검색하여서 평점 정보를 업데이트 한 후
매장 정보를 반환하는 로직을 추가 하여 보았다.

Resource URL

http://localhost:5000/stores/

Request 

http://localhost:5000/stores/{store_id}

Response

{
    "abbr_address": "경기 김포시 풍무동 620-1",
    "grade": 4.9,
    "lat": 126.720585355265,
    "lon": 37.6000069299231,
    "phone": "031-998-6728",
    "road_address": "경기 김포시 풍무로 45-1",
    "store_id": 1,
    "store_name": "스타벅스 김포풍무DT점",
}

소스코드 작성

소스코드 작성은 다음과 같이 작성한다.
  • kakao_api.py 파일에 카카오맵 사이트에 접속하여서 매장명 검색 후 평점 정보를 조회 하는 메소드 추가
  • Model 파일에 매장상세정보 조회 메소드 추가
  • Resouce 파일에 매장상세정보 조회 메소드 추가
  • app.py 매장상세정보 Resource 정보 등록



kakao_api.py


selenium을 이용하여서 카카오맵에 접속하여 매장명을 입력 한 후 조회 결과에서 평점 정보를 조회 하여 반환

def find_store_grade_by_name(store_name):
    """
    Selenium 을 이용하여서 카카오맵에서 매장명으로 정보 검색 후
    평점 부분을 파싱 처리 하여서 값을 얻는다.
    """
    chrome_options = webdriver.ChromeOptions()
    driver = webdriver.Chrome("C:/chromedriver/chromedriver.exe",chrome_options=chrome_options)
    driver.set_window_size(1280,1024)

    # 카카오맵 사이트 접속
    driver.get("https://map.kakao.com/?nil_profile=title&nil_src=local")
    driver.implicitly_wait(30)

    # 검색어 입력을 위한 TEXT BOX 를 찾는다.
    search_elemnet = driver.find_element_by_id("search.keyword.query")

    # 원하는 매장 명을 입력한다.
    search_elemnet.send_keys(store_name)

    # 검색을 한다.
    search_elemnet.send_keys(Keys.ENTER)

    # 검색 결과 score 영역을 찾는다.
    score = driver.find_element_by_css_selector('[class*="score"]')

    # 마지막으로 평점 값을 가져온다.
    grade = score.find_element_by_class_name('num').text

    if grade is None:
        grade = ''

    driver.implicitly_wait(30)

    # 브라우저 닫기
    driver.close()

    return grade



store.py - Model


@classmethod
def find_store_by_store_id(self, store_id):
	store = db.session.query(self).filter_by(store_id=store_id).first()

	return store


store.py - Resource


"""
GET /store/{store_id} - 매장 상세 정보 조회
"""
store_schema = StoreSchema()

class Store(Resource):
    def get(self,store_id):
        # 매장 상세 정보 조회
        store = StoreModel.find_store_by_store_id(store_id)

        # 평점 조회
        grade = find_store_grade_by_name(store.store_name)

        # 매장 객체에 평점 추가
        store.grade = grade

        # 매장 정보 업데이트
        StoreModel.save(store)

        # 매장 상세 정보 조회
        store = StoreModel.find_store_by_store_id(store_id)

        return store_schema.jsonify(store)


app.py 


import os
import psycopg2

from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

from config import app_config

from resources.store import StoreRegister,StoresRegister,Stores,Store

# set_env.bat 에서 설정한 application 이름 설정
app = Flask(os.getenv('FLASK_APP'))

# set_env.bat 에서 설정한 FLASK_ENV는 development
env_name = os.getenv('FLASK_ENV')
"""
app_config 는 config.py 에서 정의 app_config 이면 위에서 development를 설정하였기
때문에 config.py 의 Development 클래스의 정보가 설정 되게 된다.
"""
app.config.from_object(app_config[env_name])

# 데이터 변경사항에 대해 커밋 전후로 알림 여부
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# Query Debug 여부
app.config['SQLALCHEMY_ECHO'] = False


"""
API Resource 등록
---------------------------------------------------------
POST /stores/create - 매장 등록
PATCH /stores - 벌크 매장 등록
GET /stores - 매장목록 조회
GET /stores/<int:store_id> - 매장정보조회
PUT /stores/<int:store_id> -매장정보수정
DELETE /stores/<int:store_id> - 매장정보삭제
"""
api = Api(app)
api.add_resource(StoreRegister, '/stores/create')
api.add_resource(StoresRegister, '/stores')
api.add_resource(Stores, '/stores/search')
api.add_resource(Store, '/stores/<int:store_id>')

if __name__ == "__main__":
    from db_init import db
    db.init_app(app)
    app.run(debug=True,port=5000)


테스트


입력파라미터 설정 및 테스트



반응형