【问题标题】:Fastapi - Failed to load API definition docs due to Form issueFastapi - 由于表单问题无法加载 API 定义文档
【发布时间】:2023-01-27 18:21:51
【问题描述】:
#renders login page
@router.get('/login',response_class=HTMLResponse)
def login(request : Request):
        return templates.TemplateResponse("login.html", {"request": request})

#creates token upon user validation
@router.post('/login', response_class=HTMLResponse)
def login(request : Request, f: OAuth2PasswordRequestForm = Depends()):
        data = generate(f.username,f.password )
        if data:
            access_token = create_token(data={"sub": f.username})
            return templates.TemplateResponse("authenticated.html", {"request": request, "data" : data, "access_token": access_token, "token_type": "bearer"}) 

          <form method="POST">
                <h5> Access Site</h5></br>
                <input class="input-box" type="username" placeholder="Enter Username" name="username" required><br><br>  
                <input class="input-box" type="password" placeholder="Enter Password" name="password" required><br><br>  
                <button class="login_button"  type="submit">Login</button><br>   
                <br>
            </form>  
 File "/usr/local/lib/python3.9/site-packages/fastapi/openapi/utils.py", line 423, in get_openapi
    definitions = get_model_definitions(
  File "/usr/local/lib/python3.9/site-packages/fastapi/utils.py", line 49, in get_model_definitions
    model_name = model_name_map[model]
KeyError: <class 'pydantic.main.Body_login_login_post'>

我不确定为什么我不能加载 swagerUI api,网站本身运行正常....如果我删除表单,那么我可以访问文档(具体删除:f: OAuth2PasswordRequestForm = Depends()).不幸的是,我需要从 html 模板中检索登录输入。见上文的回溯。

【问题讨论】:

    标签: fastapi


    【解决方案1】:

    你的代码不完整,我不知道你是如何实现函数 generate、create_token 和你的路由器的,但我已经尝试使用这段代码并且它有效,两个模板都通过 url 和 /docs url。

    from datetime import datetime, timedelta
    from fastapi import Depends, FastAPI, Request
    from fastapi.security import OAuth2PasswordRequestForm
    from jose import jwt
    from fastapi.responses import HTMLResponse
    from typing import Union
    from fastapi.templating import Jinja2Templates
    
    SECRET_KEY = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7"
    ALGORITHM = "HS256"
    ACCESS_TOKEN_EXPIRE_MINUTES = 30
    
    
    app = FastAPI()
    
    templates = Jinja2Templates(directory="templates")
    
    def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None):
        to_encode = data.copy()
        if expires_delta:
            expire = datetime.utcnow() + expires_delta
        else:
            expire = datetime.utcnow() + timedelta(minutes=15)
        to_encode.update({"exp": expire})
        encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
        return encoded_jwt
    
    @app.get('/login',response_class=HTMLResponse)
    def login(request : Request):
            return templates.TemplateResponse("login.html", {"request": request})
    
    #creates token upon user validation
    @app.post('/login', response_class=HTMLResponse)
    def login(request : Request, f: OAuth2PasswordRequestForm = Depends()):
            data = {"username": f.username, "password": f.password}
            access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
            access_token = create_access_token(
                data={"sub": f.username}, expires_delta=access_token_expires
                )
            return templates.TemplateResponse(
                "authenticated.html", {"request": request, "data" : data, 
                "access_token": access_token, "token_type": "bearer"}
                ) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-13
      • 2021-11-09
      • 2012-06-19
      • 2020-05-10
      • 2019-11-18
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多