From a28bd454dd29535fee1b8d656f79b43f611496b6 Mon Sep 17 00:00:00 2001 From: long2ice Date: Tue, 22 Sep 2020 23:28:53 +0800 Subject: [PATCH] add Visitor in example --- examples/common.py | 12 ++++++++++++ examples/example.sql | 15 +++++++++++++++ examples/main.py | 19 +++++++++++++++++++ examples/models.py | 6 ++++++ 4 files changed, 52 insertions(+) create mode 100644 examples/common.py diff --git a/examples/common.py b/examples/common.py new file mode 100644 index 0000000..5444893 --- /dev/null +++ b/examples/common.py @@ -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 diff --git a/examples/example.sql b/examples/example.sql index 8fc4d82..c3b25fa 100644 --- a/examples/example.sql +++ b/examples/example.sql @@ -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 -- ---------------------------- diff --git a/examples/main.py b/examples/main.py index 0ac3367..58c6751 100644 --- a/examples/main.py +++ b/examples/main.py @@ -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( diff --git a/examples/models.py b/examples/models.py index 256cdec..33b3fa2 100644 --- a/examples/models.py +++ b/examples/models.py @@ -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)