V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
juventusryp
V2EX  ›  问与答

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

  •  
  •   juventusryp · 2020-08-04 21:27:57 +08:00 · 1982 次点击
    这是一个创建于 1600 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从 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);
            }
        },
    
    
    4 条回复    2020-08-05 09:37:24 +08:00
    juventusryp
        1
    juventusryp  
    OP
       2020-08-04 23:39:46 +08:00
    用 postman 在 headers 添加了 access_token 是可以删除的
    求问,如何在前端的代码中添加 access_token
    renmu123
        2
    renmu123  
       2020-08-04 23:57:10 +08:00 via Android
    你在 docs 里的授权抓一下请求看看,前端我记得是添加在 authentication header 中,前端可以用拦截器拦截 request 统一在 header 中添加这个字段,你可以搜一下,网上到处都是
    ncjcharlie
        3
    ncjcharlie  
       2020-08-05 00:17:48 +08:00 via iPhone
    postman 是可以直接输出各平台代码的 直接看看 js 的几个就好了
    juventusryp
        4
    juventusryp  
    OP
       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));
    },
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2690 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 07:37 · PVG 15:37 · LAX 23:37 · JFK 02:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.