求教 fastapi 如何从数据库删除数据

2020-08-04 21:27:57 +08:00
 juventusryp

从 fastapi 官方的示例代码修改,现在想删除一条数据,总是返回 403 求教是什么原因?

后端:

@router.delete("/{user_id}", response_model=schemas.User)
def delete_user(
        user_id: int,
        *,
        db: Session = Depends(deps.get_db),
        user_in: schemas.UserDelete,
        current_user: models.adminUser = Depends(deps.get_current_active_superuser),
) -> Any:
    user = crud.user.remove(db, user_id=user_id)
    if user is None:
        raise HTTPException(
            status_code=404,
            detail="User not found",
        )
    return user
    
# remove 方法 
def remove(
      self, db: Session, user_id: int
    ) -> adminUser:
        db_user = db.query(adminUser).filter(adminUser.id == user_id).first()
        if db_user:
            db.delete(db_user)
            db.commit()
            db.flush()
            return db_user

前端:

async actionDeleteUser(context: MainContext, payload: IUserDelete) {
        try {
            const loadingNotification = { content: 'delete', showProgress: true };
            commitAddNotification(context, loadingNotification);
            const response = (await Promise.all([
                api.deleteUser(context.rootState.main.token, payload.id),
                await new Promise((resolve, reject) => setTimeout(() => resolve(), 500)),
            ]))[0];
        } catch (error) {
            await dispatchCheckApiError(context, error);
        }
    },

1831 次点击
所在节点    问与答
4 条回复
juventusryp
2020-08-04 23:39:46 +08:00
用 postman 在 headers 添加了 access_token 是可以删除的
求问,如何在前端的代码中添加 access_token
renmu123
2020-08-04 23:57:10 +08:00
你在 docs 里的授权抓一下请求看看,前端我记得是添加在 authentication header 中,前端可以用拦截器拦截 request 统一在 header 中添加这个字段,你可以搜一下,网上到处都是
ncjcharlie
2020-08-05 00:17:48 +08:00
postman 是可以直接输出各平台代码的 直接看看 js 的几个就好了
juventusryp
2020-08-05 09:37:24 +08:00
找到原因了,是因为用 axios 发送 delete 请求时候,需要发送一个 body 字段,为空就行。

如果不发送会提示{loc: ["body"], msg: "field required", type: "value_error.missing"}

现在问题转化为官方的示例代码如果添加这个字段,自己按照代码比葫芦画瓢总是失败

```
async deleteUser(token: string, userId: number, data) {
return axios.delete(`${apiUrl}/api/v1/users/${userId}`, data, authHeaders(token));
},
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/695642

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX