FastAPI中Postman访问/users/signup路由返回404错误求助
FastAPI /users/signup 404 Not Found 问题排查与解决
问题根源分析
- 路由未注册到主应用:main.py里创建了包含user_router的APIRouter实例,但没把这个路由挂载到FastAPI的
app上,导致所有/users前缀的接口都没被识别,直接返回404。 - 请求方法不符合场景:signup接口用了GET方法,而注册操作需要提交请求体,GET方法不仅违背HTTP语义(GET用于获取资源,POST才是提交数据的正确方式),部分工具(包括Postman)对GET请求体的支持也存在问题,无法正确传递参数。
修复步骤
1. 修复main.py的路由挂载
在main.py中新增一行代码,把总路由挂载到主应用上:
import os import sys from .database import init_db sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))) baseurl = os.path.dirname(os.path.abspath(__file__)) from fastapi import FastAPI, APIRouter from .routers.user import router as user_router from .routers.article import router as article_router from fastapi.middleware.cors import CORSMiddleware router = APIRouter() router.include_router(user_router, prefix="/users",tags=["users"]) router.include_router(article_router, prefix="/articles",tags=["articles"]) app = FastAPI() origins = ["http://localhost:3000"] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 新增:将总路由挂载到主应用 app.include_router(router) @app.on_event("startup") async def on_startup(): await init_db() @app.get("/") async def root(): return {"message ": " Welcome Fastapi"} @app.get("/hello/{name}") async def say_hello(name: str): return {"message": f"Hello {name}"}
2. 修改user.py的signup请求方法
把signup接口的GET改为POST,适配提交数据的业务场景:
from fastapi import APIRouter, Depends from sqlalchemy.orm import Session import app.repository.user as dao from app.admin.utils import currentTime from app.database import get_db from app.schemas.user import UserDTO from app.admin.utils import currentTime router = APIRouter() # 将@router.get改为@router.post @router.post("/signup") async def signup(user: UserDTO, db: Session = Depends(get_db)): print(f" 회원가입에 진입한 시간: {currentTime()} ") print(f"SignUp Inform : {user}") result = dao.signup(user, db) if result == "": result = "failure" return {"data": result} # 其余代码保持不变 @router.post("/login") async def login(user: UserDTO, db: Session = Depends(get_db)): return_user = dao.login(user, db) print(f"로그인 정보 : {return_user}") return {"data": return_user} @router.put("/modify/{id}") async def update(id: str, item: UserDTO, db: Session = Depends(get_db)): dao.update(id, item, db) return {"data": "success"} @router.delete("/delete/{id}", tags=['age']) async def delete(id: str, item: UserDTO, db: Session = Depends(get_db)): dao.delete(id, item, db) return {"data": "success"} @router.get("/page/{page}") async def get_users(page: int, db: Session = Depends(get_db)): ls = dao.find_users(page, db) return {"data": ls} @router.get("/email/{id}") async def get_user(id: str, db: Session = Depends(get_db)): dao.find_user(id, db) return {"data": "success"} @router.get("/point/{search}/{page}") async def get_users_by_point(search: int, page: int, db: Session = Depends(get_db)): dao.find_users_by_point(search, page, db) return {"data": "success"}
3. Postman请求配置
- 请求方法选择POST
- 请求地址:
http://127.0.0.1:8000/users/signup - 请求体选择raw -> JSON,粘贴以下内容:
{"user_email": "hong@naver.com", "id": "hong1234", "username": "홍길동", "password": "hong1234", "cpassword": "hong1234"}
验证
重启FastAPI服务后发送请求,就能收到{"data": "success"}的响应,同时数据会正常存入数据库。
内容的提问来源于stack exchange,提问作者안상호
相关产品推荐
相关产品推荐

