File size: 1,618 Bytes
bceb9b7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from datetime import datetime
from fastapi import FastAPI, Request
from fastapi.responses import Response, FileResponse
from typing import Any

import json
import subprocess


class PrettyJSONResponse(Response):
    media_type = "application/json"

    def render(self, content: Any) -> bytes:
        return json.dumps(content, indent=2).encode("utf-8")


app = FastAPI()


@app.middleware("http")
async def log_request(request: Request, call_next: Any):
    ts = datetime.now().strftime("%y%m%d%H%M%S%f")
    data = {
        "day": int(ts[:6]),
        "dt": int(ts[:-3]),
        "url": request.url,
        "query_params": request.query_params,
        "client": request.client.host,
        "method": request.method,
        "headers": dict(request.headers),
    }
    output = json.dumps(
        obj=data,
        default=str,
        indent=None,
        separators=(", ", ":"),
    )
    with open("a.json", "a") as f:
        separator = "\n" if f.tell() else ""
        f.write(separator + output)

    response = await call_next(request)
    return response


@app.get("/")
def read_root(request: Request):
    return {"Hello": request.client.host}


@app.get("/a", response_class=PrettyJSONResponse)
def get_analytics(n: int = 5):
    if n == 0:
        cmd = "cat a.json"
    else:
        cmd = f"tail -{n} a.json"
    json_lines = subprocess.run(cmd.split(), capture_output=True).stdout
    content = json.loads(f"[{json_lines.replace(b"\n", b",").decode()}]")
    return content


@app.api_route("/qa", response_class=FileResponse, methods=["GET", "HEAD"])
def query_analytics():
    return "a.json"