Промежуточное ПО FastApi в другой папке не работает - PullRequest
2 голосов
/ 13 июля 2020

Я получаю эту ошибку, когда пытаюсь запустить свой API FastApi.

app = cls (app = app, ** options) TypeError: объект 'module' не вызывается

Я пытаюсь добавить промежуточное ПО в другую папку, отделенную от main.py, и не знаю, почему не работает. В противном случае, когда я добавляю промежуточный код в main.py, он работает без проблем. Вот мой код, спасибо за вашу помощь и извините за мой engli sh.

main.py

from fastapi import FastAPI
from fastapi import Depends, FastAPI, HTTPException
from fastapi import Request
from routers import rutas
from utils import CheckApiKey
from utils.CheckApiKey import check_api_key

app = FastAPI()
app.add_middleware(CheckApiKey, dispatch=check_api_key) <--- Here calling middleware
app.include_router(rutas.router)


if __name__ == "__main__":
  import uvicorn

  uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)

Middleware

from fastapi import Request

async def check_api_key(request: Request, call_next):    

  print("ok")
  response = await call_next(request) 

  return response

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

CheckApiKey выглядит как python модуль в вашем случае, а check_api_key - это функция промежуточного программного обеспечения.

Проблема заключалась в том, что метод add_middleware() ожидает первый аргумент как вызываемую функцию или вызываемый класс . Но в вашем случае вам был предоставлен модуль .

Итак,

Измените свой оператор как

app.add_middleware(<b>check_api_key</b>) 
0 голосов
/ 14 июля 2020

Я нашел решение ... Мне нужно создать класс, унаследованный от starlette basehttpmiddleare, вот так.

from starlette.middleware.base import BaseHTTPMiddleware


class CheckApiKey(BaseHTTPMiddleware):
 async def dispatch(self, request, call_next):
    print("ok")
    response = await call_next(request)

    return response
...