FastApi 422不可处理实体,关于身份验证,如何修复?

2024-07-04 13:14:59 发布

您现在位置:Python中文网/ 问答频道 /正文

即使我删除了函数中的所有内容并只是打印了一些东西,我也无法理解这个错误,但当我使用fastapi文档并尝试用它签名时,它仍然有效

@auth_router.post('/signin')
async def sign_in(username: str = Form(...), password: str = Form(...)) -> dict:
    user = await authenticate_user(username, password)

    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED, 
            detail='Invalid username or password',
        )

    user_obj = await User_Pydantic.from_tortoise_orm(user)
    user_token = await generate_token(user_obj)

    return {
        'access_token': user_token,
        'token_type': 'bearer',
    }

在使用OAuth2PasswordRequestForm之前,当遇到422错误时,请尝试另一种方法

我的模型是乌龟orm,需要时我会把它转换成pydantic模型, 在文档中,一切都是工作

JS

handleEvent(signinform, 'submit', e => {
    e.preventDefault();
    if(!isEmpty(signinform)){

        signInUsername = getElement('input[name="username"]', signinform).value;
        signInPassword = getElement('input[name="password"]', signinform).value;
        recaptchaV3 = getElement('[name="g-recaptcha-response"]').value;

        if(recaptchaV3){
            signInData = new FormData();
            signInData.append('username', signInUsername);
            signInData.append('password', signInPassword);

            isLogened = request('POST', '/signin', signInData);
            if(isLogened){
                log(isLogened);
            }
            
        } else{
            alert('Reload Page');
        }

    }

})

验证用户函数

async def authenticate_user(username: str, password: str):
    user = await User.get(username=username)

    if not user or not user.verify_password(password):
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED, 
            detail='Invalid username or password',
        )
    return user

我的请求函数

const request = (method, url, data = null) => {
    return new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest()
        xhr.open(method, url, true)
        xhr.setRequestHeader('Content-Type', 'application/json')
        xhr.onerror = function () {
            console.log(xhr.response);
        };
        xhr.onload = () => {
        if (xhr.status === 200) {
            return resolve(JSON.parse(xhr.responseText || '{}'))
            } else {
                return reject(new Error(`Request failed with status ${xhr.status}`))
            }
        } 
        if (data) {
            xhr.send(JSON.stringify(data))
        } else {
            xhr.send()
        }


    })
}

Tags: 函数tokennewreturnifstatususernamenot
1条回答
网友
1楼 · 发布于 2024-07-04 13:14:59

虽然您没有发布错误,但谁的目的是告诉您问题所在,我相当确定问题在于您执行请求的方式

线路

xhr.setRequestHeader('Content-Type', 'application/json')

表示您正在发送json数据,openapi的身份验证表单不接受该数据。此外,您正在将数据字符串化为json,而json又不是一种可接受的格式

因此,将内容类型更改为www-form-urlencoded,并将FormData对象添加到请求的主体中,将使其工作

您可以在下面的github讨论中看到它

https://github.com/tiangolo/fastapi/issues/2740https://github.com/tiangolo/fastapi/issues/1431

相关问题 更多 >

    热门问题