¿Cómo puedo redirigir una solicitud con FastAPI si hay una HTTPException?
En Flask podemos lograr eso así:
@app.errorhandler(404) def handle_404(e): if request.path.startswith('/api'): return render_template('my_api_404.html'), 404 else: return redirect(url_for('index'))O en Django podemos usar django.shortcuts:
from django.shortcuts import redirect def view_404(request, exception=None): return redirect('/')¿Cómo podemos lograr eso con FastAPI?
Podemos lograr eso usando el controlador de excepciones de FastAPI:
Si tienes prisa, puedes usar esto:
from fastapi.responses import RedirectResponse from starlette.exceptions import HTTPException as StarletteHTTPException @app.exception_handler(StarletteHTTPException) async def custom_http_exception_handler(request, exc): return RedirectResponse("/")Pero un enfoque más específico, puede crear su(s) propio(s) controlador(es) de excepciones:
class UberSuperHandler(StarletteHTTPException): pass def function_for_uber_super_handler(request, exc): return RedirectResponse("/") app.add_exception_handler(UberSuperHandler, function_for_uber_super_handler)Sé que es demasiado tarde, pero este es el enfoque más corto para manejar las excepciones 404 a su manera personal.
redirigir
from fastapi.responses import RedirectResponse @app.exception_handler(404) async def custom_404_handler(_, __): return RedirectResponse("/")Plantilla Jinja personalizada
from fastapi.templating import Jinja2Templates from fastapi.staticfiles import StaticFiles templates = Jinja2Templates(directory="templates") app.mount("/static", StaticFiles(directory="static"), name="static") @app.exception_handler(404) async def custom_404_handler(request, __): return templates.TemplateResponse("404.html", {"request": request})Servir HTML desde un archivo
@app.exception_handler(404) async def custom_404_handler(_, __): return FileResponse('./path/to/404.html')Sirve HTML directamente
from fastapi.responses import HTMLResponse response_404 = """ <!DOCTYPE html> <html lang="en"> <head> <title>Not Found</title> </head> <body> <p>The file you requested was not found.</p> </body> </html> """ @app.exception_handler(404) async def custom_404_handler(_, __): return HTMLResponse(response_404) Nota : el decoradorException_handler pasa la request exception exception_handler argumentos a la función. He usado _ y __ donde las variables son innecesarias.
Yo uso este método,
from fastapi.responses import RedirectResponse from starlette.exceptions import HTTPException as StarletteHTTPException app.mount("/static", StaticFiles(directory="static"), name="static") templates = Jinja2Templates(directory="templates") @app.exception_handler(StarletteHTTPException) async def custom_http_exception_handler(request, exc): return templates.TemplateResponse("404.html", {"request": request})