I've Created a middleware to check every request's header if it's header is application urlencoded content type covert the request data to dictionary but it's throwing some errors and not working
Middleware.py
from json import JSONDecodeError
from fastapi import HTTPException, Request
import urllib.parse
import json
from starlette.middleware.base import BaseHTTPMiddleware
class MyMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request , call_next):
response = await call_next(request)
content_type = response.headers.get('Content-Type')
if content_type == 'application/json':
try:
response = await request.json()
return response
except JSONDecodeError:
raise HTTPException(status_code=400, detail='Invalid JSON data')
elif (content_type == 'application/x-www-form-urlencoded' or
content_type.startswith('multipart/form-data')):
try:
payload = await request.body()
payload = payload.decode()
payload = urllib.parse.parse_qs(payload)
new_dict ={}
for key, value in payload.items():
for val in value:
new_dict[key]=val
print(type(new_dict))
payload = json.dumps(new_dict)
response = new_dict
return response
except Exception:
raise HTTPException(status_code=400, detail='Invalid Form data')
else:
raise HTTPException(status_code=400, detail='Invalid data')
main.py
from fastapi import FastAPI
from middleware.jsonconvertermiddleware import MyMiddleware
from models.index import *
from utils import *
from fastapi.middleware.cors import CORSMiddleware
from routes.user import user_route
app = FastAPI(default_response_class=ApiResponse)
origins = [
'http://localhost',
'http://localhost:4200',
]
app.add_middleware(
CORSMiddleware,
allow_origins=['*'],
allow_credentials=True,
allow_methods=['*'],
allow_headers=['*']
)
app.add_middleware(MyMiddleware)
app.include_router(user_route)
ERROR