抽了半天时间学了一下fastapi,为了方便,代码没分结构。
import sys
import jwt
from pydantic import BaseModel
import uvicorn,asyncio,signal,os
from fastapi import FastAPI, HTTPException, Depends
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from tortoise import fields
from tortoise.models import Model
from tortoise.contrib.pydantic import pydantic_model_creator
from tortoise.contrib.fastapi import register_tortoise
from fastapi import FastAPI, Request
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
async def startup_event():
print("Application has started.")
async def shutdown_event():
print("Application is shutting down.")
app.add_event_handler("startup", startup_event)
app.add_event_handler("shutdown", shutdown_event)
db_config = {
'connections': {
'default': {
'engine': 'tortoise.backends.mysql',
'credentials': {
'host': 'localhost',
'port': '3306',
'user': 'root',
'password': 'root',
'database': 'fiber'
}
},
},
'apps': {
'models': {
'models': ['main'],
'default_connection': 'default',
}
}
}
register_tortoise(
app,
config=db_config,
generate_schemas=False
)
async def jwt_middleware(request: Request, call_next):
if request.url.path == "/token":
response = await call_next(request)
return response
http_bearer = HTTPBearer()
credentials: HTTPAuthorizationCredentials = await http_bearer(request)
token = credentials.credentials
if token is None:
raise HTTPException(status_code=401, detail="Token missing")
try:
payload = jwt.decode(token, JWT_SECRET, algorithms=['HS256'])
user = await User.get(id=payload.get('id'))
except Exception:
raise HTTPException(status_code=401, detail="Token invalid")
request.state.payload = payload
response = await call_next(request)
return response
app.middleware("http")(jwt_middleware)
@app.exception_handler(Exception)
async def handle_exceptions(request: Request, exc: Exception):
return {
"code": 500,
"message": "Internal Server Error",
}
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
class User(Model):
id = fields.IntField(pk=True,generated=True)
username = fields.CharField(max_length=50, unique=True)
password = fields.CharField(max_length=128)
def __str__(self):
return self.username
class Meta:
table = 'users'
@classmethod
def get_user(cls, username):
return cls.get(username=username)
def verify_password(self, password):
return password == self.password
UserPydantic = pydantic_model_creator(User, name='User')
UserInPydantic = pydantic_model_creator(User, name='UserIn',exclude_readonly=True)
class UserInPydantic2(BaseModel):
username: str
password: str
oauth2_sceheme = OAuth2PasswordBearer(tokenUrl="token")
JWT_SECRET = 'myeasypeasyjwtsecret'
async def authenticate_user(username: str, password: str):
user = await User.get(username=username)
if not user:
return False
if not user.verify_password(password):
return False
return user
@app.post('/token')
async def generate_token(form_data: UserInPydantic):
user = await authenticate_user(form_data.username, form_data.password)
if not user:
return {"Error": "Invalid username or password"}
user_obj = await UserPydantic.from_tortoise_orm(user)
token = jwt.encode(user_obj.dict(), JWT_SECRET)
return {
"access_token": token,
"token_type": "Bearer",
}
@app.post('/users')
async def create_user(user: UserInPydantic):
try:
user_obj = User(username=user.username, password=user.password)
await user_obj.save()
return await UserPydantic.from_tortoise_orm(user_obj)
except Exception as e:
print(f"An error occurred while saving the user: {e}")
raise HTTPException(status_code=500, detail="Internal server error")
@app.get('/users/me')
async def get_user(request: Request):
return request.state.payload
if __name__ == "__main__":
try:
uvicorn.run('main:app', host="127.0.0.1", port=8000, reload=True)
except KeyboardInterrupt:
sys.exit(0)
else:
print("Program exited normally")
如果要把路由提出来,常见得方法,新建文件夹api,并添加user.py
from fastapi import APIRouter
api_user = APIRouter()
@api_user.get('/get')
async def get_user(request: Request):
return {"route":"get_user"}
app.py引用
....省略
from api.user import api_user
app = FastAPI()
app.include_router(api_user, prefix="/user", tags=["用户接口"])
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战