add Visitor in example

This commit is contained in:
long2ice
2020-09-22 23:28:53 +08:00
parent 7e2889510e
commit a28bd454dd
4 changed files with 52 additions and 0 deletions

12
examples/common.py Normal file
View File

@ -0,0 +1,12 @@
from starlette.requests import Request
def get_client_ip(request: Request):
"""
:param request:
:return:
"""
forwarded = request.headers.get("X-Forwarded-For")
if forwarded:
return forwarded.split(",")[0]
return request.client.host

View File

@ -17,6 +17,21 @@
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for category
-- ----------------------------
DROP TABLE IF EXISTS `visitor`;
CREATE TABLE `visitor`
(
`id` int NOT NULL AUTO_INCREMENT,
`ip` varchar(200) NOT NULL UNIQUE,
`updated_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`created_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci;
-- ----------------------------
-- Table structure for category
-- ----------------------------

View File

@ -3,10 +3,14 @@ import os
import uvicorn
from fastapi import Depends, FastAPI
from starlette.middleware.cors import CORSMiddleware
from starlette.requests import Request
from starlette.templating import Jinja2Templates
from tortoise.contrib.fastapi import register_tortoise
from tortoise.contrib.pydantic import pydantic_queryset_creator
from tortoise.exceptions import IntegrityError
from examples.common import get_client_ip
from examples.models import Visitor
from fastapi_admin.depends import get_model
from fastapi_admin.factory import app as admin_app
from fastapi_admin.schemas import BulkIn
@ -52,6 +56,18 @@ def create_app():
app = create_app()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
ip = get_client_ip(request)
v = await Visitor.get_or_none(ip=ip)
try:
await v.save() if v else await Visitor.create(ip=ip)
except IntegrityError:
pass
response = await call_next(request)
return response
@app.on_event("startup")
async def start_up():
await admin_app.init( # nosec
@ -89,6 +105,9 @@ async def start_up():
icon="fa fa-table",
search_fields=("name",),
),
Menu(
name="Visitor", url="/rest/Visitor", icon="fa fa-child", exclude=("ip",)
),
],
),
Menu(

View File

@ -82,3 +82,9 @@ class Config(Model):
def __str__(self):
return f"{self.pk}#{self.label}"
class Visitor(Model):
ip = fields.CharField(max_length=200, unique=True)
updated_at = fields.DatetimeField(auto_now=True)
created_at = fields.DatetimeField(auto_now_add=True)