seoul_backend / app.py
ldhldh's picture
Update app.py
3ae8641 verified
import subprocess
from fastapi import FastAPI, BackgroundTasks
from pydantic import BaseModel
from fastapi.middleware.cors import CORSMiddleware
from util.search_data import *
from util.preprocessing import *
from test_server import update_DB
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.cron import CronTrigger
logs = []
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
scheduler = AsyncIOScheduler()
async def run_test_server_script():
subprocess.run(["python3", "test_server.py"])
async def startup_event():
# 맀일 05μ‹œμ— `test_server.py` μ‹€ν–‰
scheduler.add_job(run_test_server_script, CronTrigger(hour=5, minute=0))
scheduler.start()
def save_log(text):
global logs
logs.append(text)
app.add_event_handler("startup", startup_event)
@app.get("/", summary="Test page. Return 'Hellow world' message.", tags=["Hello world"])
async def Hello_world():
save_log(f"GET hello world")
return {"detail": "Hello World"}
@app.get("/logs", summary="Test page. Return logs", tags=["log"])
def open_log():
global logs
if len(logs) > 10:
logs = logs[-5:]
return {"detail": "logs", "data":logs}
@app.get("/word_filter/{word}", summary="검색어와 κ°€μž₯ μœ μ‚¬ν•œ μ‹œμž₯λͺ… 및 ν’ˆλͺ©λͺ… λ°˜ν™˜", tags=["search"])
async def word_filter(word: str):
data = {
"detail": "ok",
"data" : {
"market" : word_to_market_name(word),
"product" : word_to_product_name(word)
}
}
save_log(f"GET /word_filter/{word}")
return data
@app.get("/near_market/{lat}/{lon}", summary="/μœ„λ„/경도 μ •λ³΄λ‘œ κ°€κΉŒμš΄ μ‹œμž₯ 10개 λ°˜ν™˜", tags=["search"])
async def near_market(lat: float, lon: float):
nearest_markets = find_nearest_markets(lat, lon)
data={
"detail": "ok",
"data" : nearest_markets
}
save_log(f"GET /near_market/{lat}/{lon}")
return data
@app.get("/market/{marketname}", summary="μ‹œμž₯ 정보 λ°˜ν™˜", tags=["search"])
async def get_market(marketname: str):
if not check_word(marketname):
return {"detail":"fail", "message":f"{marketname}λŠ” 잘λͺ»λœ μ‹œμž₯λͺ…μž…λ‹ˆλ‹€"}
data = dict()
index, place_name, dist = find_nearest_place(marketname)
lat, lon = get_market_location(marketname)
size, area, store_count = determine_market_size(marketname)
congestion, explain = get_congestion_data(place_name, index)
data={
"detail": "ok",
"data":{
"μ‹œμž₯" : marketname,
"μœ„μΉ˜" : [lat, lon],
"규λͺ¨" : size,
"규λͺ¨ 정보" : {
"면적" : area,
"점포수" : store_count
},
"쑰회" : f"{marketname}κ³Ό(와) κ°€μž₯ κ°€κΉŒμš΄ 쑰회 κ°€λŠ₯ν•œ μž₯μ†ŒλŠ” {place_name}μž…λ‹ˆλ‹€.(κ±°λ¦¬λŠ” {int(dist*100)/100}km)",
"ν˜Όμž‘λ„" : congestion,
"μ„€λͺ…" : explain,
"μ΅œμ €κ°€κ²©" : get_cheapest_products_this_month(marketname),
'text': "졜근 2κ°œμ›” λ‚΄ μ‘°μ‚¬λœ μ„œμšΈ 열린데이터 κ΄‘μž₯의 μ„œμšΈμ‹œ μƒν•„ν’ˆ λ†μˆ˜μΆ•μ‚°λ¬Ό 가격 정보λ₯Ό λ°”νƒ•μœΌλ‘œ κ³„μ‚°λ˜μ—ˆμŠ΅λ‹ˆλ‹€."
}
}
save_log(f"GET /market/{marketname}")
return data
@app.get("/product/{product_name}", summary="μƒν’ˆ 정보 λ°˜ν™˜", tags=["search"])
async def get_market(product_name: str):
if not check_product(product_name):
return {"detail":"fail", "message":f"{product_name}λŠ” 잘λͺ»λœ μƒν’ˆλͺ…μž…λ‹ˆλ‹€"}
monthly_prices = get_monthly_average_price(product_name)
lowest_price_markets = get_lowest_price_markets(product_name)
season_data = get_season_data_by_name(product_name)
data={
"detail": "ok",
"data":{
"μƒν’ˆ" : product_name,
"μ œμ² μ •λ³΄" : season_data,
"졜근 μ‹œμ„Έ" : monthly_prices[0],
"차트" : monthly_prices,
"μ΅œμ €κ°€ μ‹œμž₯" : lowest_price_markets,
'text': "졜근 2κ°œμ›” λ‚΄ μ‘°μ‚¬λœ μ„œμšΈ 열린데이터 κ΄‘μž₯의 μ„œμšΈμ‹œ μƒν•„ν’ˆ λ†μˆ˜μΆ•μ‚°λ¬Ό 가격 정보λ₯Ό λ°”νƒ•μœΌλ‘œ κ³„μ‚°λ˜μ—ˆμŠ΅λ‹ˆλ‹€."
}
}
save_log(f"GET /product/{product_name}")
return data