Flask RESTful API - GET /stores/{store_id} (매장상세정보조회 및 평점업데이트)
2019. 7. 3. 15:37ㆍPython/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)
테스트
입력파라미터 설정 및 테스트
반응형
'Python > Flask' 카테고리의 다른 글
Flask + 머신러닝 모델 연동하기-개요 (0) | 2020.09.13 |
---|---|
Flask RESTful API - DELETE /stores/{store_id} (매장정보삭제) (0) | 2019.07.03 |
Flask RESTful API - GET /stores/search (매장검색) (0) | 2019.07.03 |
Flask RESTful API - PATCH /stores (현재 위치 기준 지정한 반경내 모든 매장 정보 등록) (0) | 2019.07.03 |
Flask RESTful API - POST /stores/create (매장등록) (0) | 2019.07.02 |