模型定义ok

This commit is contained in:
kf_wuhao 2021-04-01 11:30:58 +08:00
parent 5b46db540a
commit 029b88c5cd
7 changed files with 108 additions and 1 deletions

View File

@ -0,0 +1 @@
from .user import *

49
models/base.py Normal file
View File

@ -0,0 +1,49 @@
import hashlib
from pydantic import Field
from pydantic import BaseModel, validator
from settings import settings
from ipaddress import IPv4Address
FIELD_MAP = {
'ip': 'a01',
'os': 'a08',
}
def to_alias(k: str) -> str:
return FIELD_MAP.get(k) or k
class IP4(str):
@classmethod
def __get_validators__(cls):
yield cls.validate
@classmethod
def validate(cls, v):
IPv4Address(v)
return str(v)
class Base(BaseModel):
# sign = md5(distinct_id+account_id+act+ts+salt)
distinct_id: str = Field(..., title='访客 ID')
game: str
account_id: str
act: str
event_name: str = None
# preset: dict
properties: dict
ts: int
sign: str
@validator('sign')
def sign_validator(cls, v: str, values: dict):
s = f'{values.get("distinct_id")}{values.get("account_id", "")}{values.get("act", "")}{values.get("ts", "")}{settings.SALT}'
if hashlib.md5(s.encode()).hexdigest() == v:
return v
raise ValueError(f'打击违法犯罪行为{hashlib.md5(s.encode()).hexdigest()}')

0
models/event.py Normal file
View File

28
models/user.py Normal file
View File

@ -0,0 +1,28 @@
from pydantic import BaseModel
from .base import Base, IP4, to_alias
__all__ = ('UserModel',)
class Preset(BaseModel):
ip: IP4
os: str
ttt: str = None
def dict(self, **kwargs):
res = super().dict(**kwargs)
return {'#' + k: v for k, v in res.items() if v is not None}
class Config:
alias_generator = to_alias
class UserModel(Base):
preset: Preset
def dict(self, **kwargs):
kwargs.setdefault('exclude', {'preset'})
self.properties.update(self.preset.dict(**kwargs))
return super().dict(**kwargs)

0
routers/event.py Normal file
View File

29
routers/user.py Normal file
View File

@ -0,0 +1,29 @@
import asyncio
import hashlib
from fastapi import APIRouter, Request
from pydantic import BaseModel, validator
from handler_data import HandlerUser, HandlerEvent
from settings import settings
router = APIRouter()
from models import UserModel
@router.post("/user/")
async def user(request: Request, item: UserModel):
ta = getattr(request.app.state.ta, item.act)
# 将不同游戏发送到不同 topic_name
request.app.state.ta.consumer.topic_name = item.game
rdb = request.app.state.redis
await asyncio.gather(*map(lambda o: asyncio.create_task(o(rdb, item)), HandlerUser.handler_link))
ta(item.distinct_id, item.account_id, item.properties)
results = {"code": 0, 'msg': 'ok'}
return results