-
Notifications
You must be signed in to change notification settings - Fork 23
/
main.py
127 lines (98 loc) · 3.45 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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
import animalid
import argparse
import asyncio
import os
import json
import uuid
import uvicorn
from httpx import AsyncClient, HTTPError
from sse_starlette.sse import EventSourceResponse
from starlette.applications import Starlette
from starlette.responses import FileResponse, JSONResponse, Response
from starlette.staticfiles import StaticFiles
process_id = f"frontend-{uuid.uuid4().hex[:8]}"
records = list()
async def startup():
global change_event
change_event = asyncio.Event()
star = Starlette(debug=True, on_startup=[startup])
star.mount("/static", StaticFiles(directory="static"), name="static")
@star.route("/")
async def index(request):
return FileResponse("static/index.html")
@star.route("/api/data")
async def data(request):
return JSONResponse(records);
@star.route("/api/notifications")
async def notifications(request):
async def generate():
while True:
await change_event.wait()
yield {"data": "1"}
return EventSourceResponse(generate())
@star.route("/api/generate-id", methods=["POST"])
async def generate_id(request):
id = animalid.generate_id()
response_data = {
"id": id,
"name": id.replace("-", " ").title(),
}
return JSONResponse(response_data)
@star.route("/api/hello", methods=["POST"])
async def hello(request):
request_data = await request.json()
name = request_data["name"]
text = request_data["text"]
backend_request, backend_response, backend_error = await send_greeting(name, text)
record = {
"request": backend_request,
"response": backend_response,
"error": backend_error,
}
records.append(record);
change_event.set()
change_event.clear()
return JSONResponse(backend_response)
async def send_greeting(name, text):
request_data = {
"name": name,
"text": text,
}
async with AsyncClient() as client:
try:
response = await client.post(f"{backend_url}/api/hello", json=request_data)
except HTTPError as e:
return request_data, None, str(e)
response_data = response.json()
return request_data, response_data, None
@star.route("/api/health", methods=["GET"])
async def health(request):
await send_greeting("Testy Tiger", "Hi")
return Response("OK\n", 200)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--host", default="0.0.0.0")
parser.add_argument("--port", type=int, default=8080)
parser.add_argument("--backend", metavar="URL", default="http://backend:8080")
args = parser.parse_args()
global backend_url
backend_url = args.backend
uvicorn.run(star, host=args.host, port=args.port)