`整个代码逻辑是在将post请求传递过来的数据保存到数据库中,Order模型类是tortoise ORM定义的,我在celery中对数据进行保存的时候总是提示never await,celery的版本是5.3.6,我没有实现成功,希望有大佬帮忙看下我的问题是啥`
database.py
from tortoise.contrib.fastapi import register_tortoise
from fastapi import FastAPI
from etc.settings import settings
TORTOISE_ORM={
“connections”:{
“default”:{
“engine”:“tortoise.backends.mysql”,
“credentials”:{
“host”:127.0.0.1,
“port”:“3306”,
“user”:“username”,
“password”:“password”,
“database”:“test”,
“minsize”:1,
“maxsize”:15,
“charset”:“utf8mb4”,
“echo”:True
}
},
},
"apps":{
"models":{
"models":["aerich.models",
"models.details",
],
"default_connections":"default"
},
"use_tz":False,
"timezone":"Asia/Shanghai",
}
async def register_mysql(app: FastAPI):
# 注册数据库
register_tortoise(
app,
config=TORTOISE_ORM,
)
core.Events.py
from fastapi import FastAPI
from typing import Callable
from database import register_mysql
from core.Topic import create_topic
def startup(app: FastAPI) -> Callable:
“”"
FastApi 启动完成事件
:param app: FastAPI
:return: start_app
“”"
async def app_start() -> None:
# APP启动完成后触发
print("fastapi已启动")
# 注册数据库
await register_mysql(app)
print("数据库注册成功")
return app_start
def stopping(app: FastAPI) -> Callable:
“”"
FastApi 停止事件
:param app: FastAPI
:return: stop_app
“”"
async def stop_app() -> None:
# APP停止时触发
print(“fastapi已停止”)
return stop_app
main.py
from fastapi import FastAPI
import uvicorn
from fastapi.middleware.cors import CORSMiddleware
from core import Router,Events,Middleware
from etc.settings import settings
application = FastAPI()
路由
application.include_router(Router.router)
事件监听
application.add_event_handler(“startup”, Events.startup(application))
application.add_middleware(
CORSMiddleware,
allow_origins=settings.CORS_ORIGINS,
allow_credentials=settings.CORS_ALLOW_CREDENTIALS,
allow_methods=settings.CORS_ALLOW_METHODS,
allow_headers=settings.CORS_ALLOW_HEADERS,
)
app=application
if name == ‘main’:
uvicorn.run(“main:app”,port=8090,reload=True,
workers=1)
task_manager.__init.py
from celery import Celery
app=Celery(“task_manager”) #创建Celery_APP
app.config_from_object(“task_manager.config”) #加载配置文件
#加载任务模块
app.autodiscover_tasks()
task_manager.config.py
from task_manager import app
from etc.settings import settings
broker_url=settings.CELERY_BROKER_URL
result_backend=None
broker_connection_retry_on_startup = True
accept_content = [‘json’]
task_serializer = ‘json’
result_serializer= “json”
result_expires=60
timezone=“Asia/Shanghai”
task_default_queue = ‘delivery_queue’
task_default_exchange = ‘delivery_exchange’
imports=(
“task_manager.tasks”,
)
task_manager.tasks.py
from task_manager import app
from models import Orders
def confirm_order_distribute(data):
Orders.create(**data)
Router.py
from fastapi import APIRouter
from urllib.parse import unquote_plus
from task_manager.task import confirm_order_distribute
router = APIRouter(prefix=‘/delivery’)
@router.post(“/delivery”,summary=“数据处理”)
async def data_view(request:Request):
content_type = request.headers.get(“content-type”, “”)
if “application/x-www-form-urlencoded” in content_type:
form_data = await request.form()
decoded_form_data = {key: unquote_plus(value) for key, value in form_data.items()}
if decoded_form_data :
confirm_order_distribute.delay(decoded_form_data)
return {“data”:“ok”}
models.PY
from tortoise import fields,Model
class Orders(Model):
id=fields.CharField(max_length=32,pk=True,unique=True,description=“Id”)
latitude=fields.FloatField(null=True,description=“纬度”)
longitude=fields.FloatField(null=True,description=“经度”)
…