add fastapi init

This commit is contained in:
XIE7654
2025-07-16 21:14:02 +08:00
parent ed3e325962
commit 682e3805eb
11 changed files with 155 additions and 0 deletions

23
chat/api/v1/ai_chat.py Normal file
View File

@@ -0,0 +1,23 @@
from fastapi import APIRouter, Depends, Request
from pydantic import BaseModel
from deps.auth import get_current_user
from services.chat_service import chat_service
from utils.resp import resp_success
router = APIRouter()
class ChatRequest(BaseModel):
prompt: str
@router.post("/")
def chat_api(data: ChatRequest, user=Depends(get_current_user)):
# return {"msg": "pong"}
return resp_success(data="dasds")
# reply = chat_service.chat(data.prompt)
# return {"msg": "pong"}
# return ChatResponse(response=reply)

12
chat/config.py Normal file
View File

@@ -0,0 +1,12 @@
import os
# 数据库配置
MYSQL_USER = os.getenv('DB_USER', 'root')
MYSQL_PASSWORD = os.getenv('DB_PASSWORD', 'my-secret-pw')
MYSQL_HOST = os.getenv('DB_HOST', 'localhost')
MYSQL_PORT = os.getenv('DB_PORT', '3306')
MYSQL_DB = os.getenv('DB_NAME', 'django_vue')
SQLALCHEMY_DATABASE_URL = (
f"mysql+pymysql://{MYSQL_USER}:{MYSQL_PASSWORD}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DB}?charset=utf8mb4"
)

13
chat/db/session.py Normal file
View File

@@ -0,0 +1,13 @@
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from config import SQLALCHEMY_DATABASE_URL
engine = create_engine(SQLALCHEMY_DATABASE_URL, pool_pre_ping=True)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()

21
chat/deps/auth.py Normal file
View File

@@ -0,0 +1,21 @@
from fastapi import Depends, HTTPException, status, Request
from sqlalchemy.orm import Session
from db.session import get_db
from models.user import AuthToken, DjangoUser
def get_current_user(request: Request, db: Session = Depends(get_db)):
auth = request.headers.get('Authorization')
if not auth or not auth.startswith('Bearer '):
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='未登录')
token = auth.split(' ', 1)[1]
token_obj = db.query(AuthToken).filter(AuthToken.key == token).first()
if not token_obj:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Token无效或已过期')
user = db.query(DjangoUser).filter(DjangoUser.id == token_obj.user_id).first()
if not user:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='用户不存在')
return {"user_id": user.id, "username": user.username, "email": user.email}

26
chat/main.py Normal file
View File

@@ -0,0 +1,26 @@
from fastapi import FastAPI
from api.v1 import ai_chat
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"http://localhost",
"http://localhost:8010",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 注册路由
app.include_router(ai_chat.router, prefix="/chat/api/v1", tags=["chat"])
# 健康检查
@app.get("/ping")
def ping():
return {"msg": "pong"}

16
chat/models/user.py Normal file
View File

@@ -0,0 +1,16 @@
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class AuthToken(Base):
__tablename__ = 'authtoken_token'
key = Column(String(40), primary_key=True)
user_id = Column(Integer, nullable=False)
created = Column(DateTime)
class DjangoUser(Base):
__tablename__ = 'system_users'
id = Column(Integer, primary_key=True)
username = Column(String(150), nullable=False)
email = Column(String(254))

3
chat/requirements.txt Normal file
View File

@@ -0,0 +1,3 @@
fastapi
uvicorn[standard]
langchain-openai

9
chat/schemas/user.py Normal file
View File

@@ -0,0 +1,9 @@
from pydantic import BaseModel
class UserOut(BaseModel):
id: int
username: str
email: str = None
class Config:
orm_mode = True

View File

@@ -0,0 +1,15 @@
# LangChain集成示例
from langchain_openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
class ChatService:
def __init__(self):
# 这里以OpenAI为例实际可根据需要配置
self.llm = OpenAI(temperature=0.7, api_key='sssss')
def chat(self, prompt: str) -> str:
# 简单调用LLM
return self.llm(prompt)
chat_service = ChatService()

1
chat/utils/jwt.py Normal file
View File

@@ -0,0 +1 @@
# 预留如需JWT校验可在此实现

16
chat/utils/resp.py Normal file
View File

@@ -0,0 +1,16 @@
from typing import Any, Optional
from pydantic import BaseModel
class CommonResponse(BaseModel):
code: int = 0
message: str = "success"
data: Any = None
error: Optional[Any] = None
def resp_success(data=None, message="success"):
return CommonResponse(code=0, message=message, data=data, error=None)
def resp_error(message="error", code=1, error=None):
return CommonResponse(code=code, message=message, data=None, error=error)