-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
111 lines (90 loc) · 3.26 KB
/
main.py
File metadata and controls
111 lines (90 loc) · 3.26 KB
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
import os
import re
from ipaddress import ip_address
from typing import Callable
from pathlib import Path
import redis.asyncio as redis
import uvicorn
from fastapi import FastAPI, Depends, HTTPException, Request, status
from fastapi.responses import JSONResponse, HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi_limiter import FastAPILimiter
from sqlalchemy import text
from sqlalchemy.ext.asyncio import AsyncSession
from src.database.db import get_db
from src.routes import todos, auth, users
from src.conf.config import config
app = FastAPI()
banned_ips = [
ip_address("192.168.1.1"),
ip_address("192.168.1.2"),
ip_address("127.0.0.1"),
]
origins = ["*"]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# @app.middleware("http")
# async def ban_ips(request: Request, call_next: Callable):
# ip = ip_address(request.client.host)
# if ip in banned_ips:
# return JSONResponse(status_code=status.HTTP_403_FORBIDDEN, content={"detail": "You are banned"})
# response = await call_next(request)
# return response
user_agent_ban_list = [r"Googlebot", r"Python-urllib"]
@app.middleware("http")
async def user_agent_ban_middleware(request: Request, call_next: Callable):
print(request.headers.get("Authorization"))
user_agent = request.headers.get("user-agent")
print(user_agent)
for ban_pattern in user_agent_ban_list:
if re.search(ban_pattern, user_agent):
return JSONResponse(
status_code=status.HTTP_403_FORBIDDEN,
content={"detail": "You are banned"},
)
response = await call_next(request)
return response
BASE_DIR = Path(__file__).parent
directory = BASE_DIR.joinpath("src").joinpath("static")
app.mount("/static", StaticFiles(directory=directory), name="static")
app.include_router(auth.router, prefix="/api")
app.include_router(users.router, prefix="/api")
app.include_router(todos.router, prefix="/api")
@app.on_event("startup")
async def startup():
r = await redis.Redis(
host=config.REDIS_DOMAIN,
port=config.REDIS_PORT,
db=0,
password=config.REDIS_PASSWORD,
)
await FastAPILimiter.init(r)
templates = Jinja2Templates(directory=BASE_DIR / "src" / "templates")
@app.get("/", response_class=HTMLResponse)
def index(request: Request):
return templates.TemplateResponse(
"index.html", {"request": request, "our": "Build group WebPython #16"}
)
@app.get("/api/healthchecker")
async def healthchecker(db: AsyncSession = Depends(get_db)):
try:
# Make request
result = await db.execute(text("SELECT 1"))
result = result.fetchone()
if result is None:
raise HTTPException(
status_code=500, detail="Database is not configured correctly"
)
return {"message": "Welcome to FastAPI!"}
except Exception as e:
print(e)
raise HTTPException(status_code=500, detail="Error connecting to the database")
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=int(os.environ.get("PORT", 8000)), log_level="info")