我知道在FastAPI上安装一个烧瓶实例是可能的。这意味着所有发送到根URL的请求都由FastAPI处理,并且只将对指定的烧瓶URL的请求转发给它。有可能反过来这样做吗?我有一个网站,我已经建立了烧瓶,我想添加一个API到它来管理数据库从另一个应用程序。FastAPI有自动文档和验证,这使生活变得更容易了。我想把它装成这样的原因
如果不是,我是否可以用uvicorn单独托管它,并将以/api/开头的所有URL转发给它,并以某种方式返回它通过烧瓶返回的所有URL?
我之所以在这里混在一起而不是单独运行,是因为我在从烧瓶应用程序外部访问数据库时遇到了困难。
发布于 2021-12-28 15:02:56
我已经用两个独立的烧瓶应用程序完成了这个任务(请参阅这里)。
它可以与FastAPI实例一起工作。
发布于 2021-12-28 16:52:33
经过修修补补,我想出了一个解决办法。
我现在将烧瓶和FastAPI作为两个独立的应用程序运行。我添加了一条烧瓶路线,使其成为FastAPI应用程序的代理:
API_URL = "http://127.0.0.1:8000/"
@views.route("/api/<path:rest>")
def api_redirect(rest):
return requests.get(f"{API_URL}{rest}").content然后,我使用FastAPI运行uvicorn main:app --root-path api/,以便前端知道在哪里找到openapi.json文件。
我通过添加以下代码解决了访问数据库时遇到的问题(由于不在会话中)。
engine = create_engine(DB_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
models.db.metadata.create_all(bind=engine)
app = FastAPI()
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.get("/all-items", response_model=List[schemas.Item], tags=["items"])
def all_items(db: Session = Depends(get_db)):
return db.query(models.Item).all()这将为每个API调用创建一个新会话,然后在调用完成后关闭它。
https://stackoverflow.com/questions/70506231
复制相似问题