Block mobile devices: show desktop-only page
This commit is contained in:
+46
@@ -159,6 +159,52 @@ async def request_logging_middleware(request: Request, call_next):
|
|||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import re as _re_mob
|
||||||
|
|
||||||
|
_MOBILE_UA_RE = _re_mob.compile(
|
||||||
|
r"(Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|webOS)",
|
||||||
|
_re_mob.IGNORECASE,
|
||||||
|
)
|
||||||
|
_MOBILE_PAGE = (
|
||||||
|
"<!doctype html>"
|
||||||
|
'<html lang="ru">'
|
||||||
|
"<head>"
|
||||||
|
'<meta charset="utf-8"/>'
|
||||||
|
'<meta name="viewport" content="width=device-width,initial-scale=1"/>'
|
||||||
|
"<title>МОНТ - инфрастуктурный полигон</title>"
|
||||||
|
"<style>"
|
||||||
|
"*{box-sizing:border-box;margin:0;padding:0}"
|
||||||
|
"body{min-height:100dvh;display:flex;flex-direction:column;align-items:center;"
|
||||||
|
"justify-content:center;background:linear-gradient(160deg,#0a2a4a 0%,#1565a0 60%,#1e88c8 100%);"
|
||||||
|
"font-family:sans-serif;color:#fff;padding:2rem 1.5rem;text-align:center}"
|
||||||
|
".logo{width:120px;margin-bottom:2rem}"
|
||||||
|
"h1{font-size:1.3rem;font-weight:700;margin-bottom:1rem;line-height:1.35}"
|
||||||
|
"p{font-size:0.95rem;color:rgba(255,255,255,.75);line-height:1.5;max-width:280px}"
|
||||||
|
".icon{font-size:3.5rem;margin-bottom:1.2rem}"
|
||||||
|
"</style>"
|
||||||
|
"</head>"
|
||||||
|
"<body>"
|
||||||
|
'<img class="logo" src="/static/logo.png" alt="MONT"/>'
|
||||||
|
'<div class="icon">🖥</div>'
|
||||||
|
"<h1>Ресурс доступен<br>только с ПК</h1>"
|
||||||
|
"<p>Пожалуйста, откройте эту страницу на компьютере или ноутбуке.</p>"
|
||||||
|
"</body>"
|
||||||
|
"</html>"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@app.middleware("http")
|
||||||
|
async def mobile_block_middleware(request: Request, call_next):
|
||||||
|
path = request.url.path
|
||||||
|
if path.startswith("/static/"):
|
||||||
|
return await call_next(request)
|
||||||
|
ua = request.headers.get("user-agent", "")
|
||||||
|
if _MOBILE_UA_RE.search(ua):
|
||||||
|
from starlette.responses import HTMLResponse as _HR
|
||||||
|
return _HR(content=_MOBILE_PAGE, status_code=200)
|
||||||
|
return await call_next(request)
|
||||||
|
|
||||||
class Base(DeclarativeBase):
|
class Base(DeclarativeBase):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user