-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
83 lines (67 loc) · 2.66 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import uvicorn
from simple_background_task import BackgroundTask
from simple_background_task import defer
from fastapi import FastAPI, Depends, HTTPException
from starlette import status
from data_processor import DataProcessor
from data_models import UserStats, SessionStats
data_processor = None
users_pivot_table = None
session_pivot_table = None
app = FastAPI()
BackgroundTask().start()
def load_pivot_tables(req="data/requests.csv", clicks="data/clicks.csv", imp="data/impressions.csv"):
global data_processor, users_pivot_table, session_pivot_table
if data_processor is None:
data_processor = DataProcessor(req, clicks, imp)
if users_pivot_table is None:
users_pivot_table = data_processor.get_users_pivot()
if session_pivot_table is None:
session_pivot_table = data_processor.get_session_pivot()
defer(
func=load_pivot_tables,
arguments={
"args": ["data/requests.csv", "data/clicks.csv", "data/impressions.csv"],
"kwargs": {}
}
)
@app.get("/")
async def read_root():
return {"Hello": "World :D"}
@app.get("/userStats/", response_model=UserStats)
def read_user_stats(user_id: str, is_ready: bool = Depends(lambda: users_pivot_table is not None)):
if is_ready:
try:
user_stats = users_pivot_table.loc[user_id].to_dict()
except KeyError:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"The user id specified does not exist, please enter an existing user id."
)
return UserStats(**user_stats)
else:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Data is not ready yet, please use keepalive to check when ready"
)
@app.get("/sessionId/", response_model=SessionStats)
def read_session_stats(session_id: str, is_ready: bool = Depends(lambda: session_pivot_table is not None)):
if is_ready:
try:
session_stats = session_pivot_table.loc[session_id].to_dict()
except KeyError:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"The session id specified does not exist, please enter an existing session id."
)
return SessionStats(**session_stats)
else:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Data is not ready yet, please use keepalive to check when ready"
)
@app.get("/keepalive")
def check_service_status():
return {"Alive": users_pivot_table is not None and session_pivot_table is not None}
if __name__ == '__main__':
uvicorn.run(app, host='0.0.0.0', port=8000)