Estoy haciendo una aplicación FastAPI , con una función que se autentica en una instancia de CouchDB . Para solicitar Couchdb, uso la biblioteca (aún sin mantenimiento) python-couchdb .
Aquí está la parte relevante del código que ilustra mi problema:
from fastapi import FastAPI from couchdb import http resource = http.Resource(url, http.Session()) from couchdb import Unauthorized from pydantic import BaseModel app = FastAPI() class RegisteredUser(BaseModel): email: str password: str @app.post("/login") async def log_user(user: RegisteredUser): # some email format verifications here # ... try: status, headers, _ = resource.post_json('_session', { 'name': user.email, 'password': user.password, }) except Exception as e: if isinstance(e, Unauthorized): return 403 else: return 500 # tests print(headers)Los encabezados se ven como:
Cache-Control: must-revalidate Content-Length: 54 Content-Type: application/json Date: Sat, 08 Aug 2020 19:19:49 GMT Server: CouchDB/3.1.0 (Erlang OTP/22) Set-Cookie: AuthSession=am9zZWJvdmVAam9zZWJvdmUuY29tOjVGMkVGQUQ2Op-UUD22VvdxYzbMNp92e30Er_z0; Version=1; Expires=Sat, 08-Aug-2020 20:59:50 GMT; Max-Age=6000; Path=/; HttpOnlyEn este punto (si no aparece ningún error), me gustaría devolver al cliente (navegador) la cookie que proporciona CouchDb. Algo como:
... # tests print(headers) if status == 200 and 'Set-Cookie' in headers: return JSONResponse(content=True, headers=headers) else: return status No estoy acostumbrado a cookies de sesión y no estoy seguro de si debo devolver los encabezados completos o solo la parte de headers['Set-Cookie']
Haga lo que haga, termino con el mismo mensaje de error
RuntimeError: Response content shorter than Content-Length¿Podrías explicarme qué dice el error y cómo puedo resolver mi caso? Ty!
Encontré este subproceso SO pero no tengo ni idea ni el middleware FastAPI mirando a escondidas las respuestas
Aquí hay una solución:
if status == 200 and 'Set-Cookie' in headers: return JSONResponse(content=True, headers={ 'Set-Cookie' : headers['Set-Cookie'] }) else: return statusTy @HernánAlarcón