From d3ffd27f00fee5f497f91f2ecdb99a947dffa834 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Mon, 3 Mar 2025 22:10:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=99=E7=A8=8B=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/api.py | 17 +++++------- account/decorators.py | 28 +++++++++++++++++++ account/models.py | 2 +- api/settings.py | 2 ++ api/urls.py | 1 + requirements.txt | Bin 926 -> 462 bytes tutorial/__init__.py | 0 tutorial/admin.py | 4 +++ tutorial/api.py | 41 ++++++++++++++++++++++++++++ tutorial/apps.py | 6 ++++ tutorial/migrations/0001_initial.py | 31 +++++++++++++++++++++ tutorial/migrations/__init__.py | 0 tutorial/models.py | 12 ++++++++ tutorial/schemas.py | 28 +++++++++++++++++++ 14 files changed, 161 insertions(+), 11 deletions(-) create mode 100644 account/decorators.py create mode 100644 tutorial/__init__.py create mode 100644 tutorial/admin.py create mode 100644 tutorial/api.py create mode 100644 tutorial/apps.py create mode 100644 tutorial/migrations/0001_initial.py create mode 100644 tutorial/migrations/__init__.py create mode 100644 tutorial/models.py create mode 100644 tutorial/schemas.py diff --git a/account/api.py b/account/api.py index e339e54..8971192 100644 --- a/account/api.py +++ b/account/api.py @@ -1,4 +1,5 @@ from django.contrib.auth import authenticate, login, logout +from django.contrib.auth.decorators import login_required from ninja import Router from ninja.errors import HttpError from .schemas import UserRegistrationSchema, UserLoginSchema @@ -7,40 +8,36 @@ from .models import RoleChoices, User router = Router() -@router.get("/") -def account(request): - return {"message": "success"} - - @router.post("/register") def user_register(request, payload: UserRegistrationSchema): if User.objects.filter(username=payload.username).exists(): - raise HttpError(400, "Username already exists") + raise HttpError(400, "用户已存在") User.objects.create_user( username=payload.username, email=payload.email, password=payload.password, ) - return {"message": "User created successfully"} + return {"message": "创建成功"} @router.post("/login") def user_login(request, payload: UserLoginSchema): user = authenticate(username=payload.username, password=payload.password) - if user is not None: + if user: login(request, user) return {"username": user.username, "role": user.role} else: - raise HttpError(401, "Invalid credentials") + raise HttpError(401, "账号密码错误") @router.post("/logout") +@login_required def user_logout(request): logout(request) @router.get("/profile") -def current_user_profile(request): +def my_profile(request): # 暂时这样写 if request.user.is_authenticated: return {"username": request.user.get_username(), "role": request.user.role} diff --git a/account/decorators.py b/account/decorators.py new file mode 100644 index 0000000..06f3906 --- /dev/null +++ b/account/decorators.py @@ -0,0 +1,28 @@ +from ninja.errors import HttpError +from ninja import NinjaAPI +from functools import wraps +from .models import User, RoleChoices + +api = NinjaAPI() + + +def _require(roles): + def decorator(func): + @wraps(func) + def wrapper(request, *args, **kwargs): + if not request.user.is_authenticated: + raise HttpError(401, "用户未登录") + try: + if request.user.role not in roles: + raise HttpError(403, "你没有权限") + except User.DoesNotExist: + raise HttpError(404, "用户不存在") + return func(request, *args, **kwargs) + + return wrapper + + return decorator + +admin_required = _require([RoleChoices.ADMIN, RoleChoices.SUPER]) + +super_required = _require([RoleChoices.SUPER]) diff --git a/account/models.py b/account/models.py index 8aef0ed..ac204bc 100644 --- a/account/models.py +++ b/account/models.py @@ -4,7 +4,7 @@ from django.contrib.auth.models import AbstractUser class RoleChoices(models.TextChoices): - SUPER = "sup er", "超级管理员" + SUPER = "super", "超级管理员" ADMIN = "admin", "管理员" NORMAL = "normal", "普通" diff --git a/api/settings.py b/api/settings.py index 7351483..d99c0f2 100644 --- a/api/settings.py +++ b/api/settings.py @@ -42,7 +42,9 @@ INSTALLED_APPS = [ "django.contrib.staticfiles", "ninja", "corsheaders", + "django_extensions", "account", + "tutorial", ] MIDDLEWARE = [ diff --git a/api/urls.py b/api/urls.py index 1b9f47f..6d081b5 100644 --- a/api/urls.py +++ b/api/urls.py @@ -22,6 +22,7 @@ from ninja import NinjaAPI api = NinjaAPI() api.add_router("account/", "account.api.router") +api.add_router("tutorial/", "tutorial.api.router") urlpatterns = [ path("admin/", admin.site.urls), diff --git a/requirements.txt b/requirements.txt index 0ad3953179a990920ddc0bb9805aa15a3c422a54..d013c53f6168791640aeee5fa8cfcc7e767a74c6 100644 GIT binary patch literal 462 zcmYjOyK=)I5bXIE-v}f>8oE@eQe-Bj=Yp_=EguA7Pn56EqS!O(*yHvEED{SB-*3v2 z{A_JQdukNVL&*MQZA%Bz%AHQZT1|Ri!4%xZTFmL7T%2O&D_3GiJ76jPyG-HJSZg%x zAm;LtN*pq$aj~}RsDaAMnPrI9ZXvT%{fag&=6N%E?tMm-ZjJJ|f~c1{M8QQ%hT11b zf}CNmsfAT9b6Uz61?DT;UpY+2J5QnK5_26J>wFso~zVK8c4D`n6F7MD2B{!h8$o}~m=jdX)%&%qIPezo6&_O`r!ygzodn!l!1 kq$b#+8NLDz$N!Z((nzk#4{9KsX$&4t-R_ST4Yf7-FB0L5MF0Q* literal 926 zcmZ8gK~lm%5bU#6J_U;`h+e#T^5nrPk5o*SfZ~D)SmNW=?in@#Yikp-J<~nYv;6*) zNL(B2P;y7q81a3;mcKjPagA|>8}2bKalxn#4OVE0FASd$yX7tnuXws3uFS$tm7B3O zkqU2ydX93%Td{^UcT0tL?yNjz_NWqLo&8NeDFM)BP;ei$0v2wd(F4{Yx{WRIA?=BdE~V4%;=gqW=YQq%XKf@6-`3i ziR`LXImMCHdx&Hmbd?*pGV7Lknr~@$M6QY@nCHQ!s7@>PTbgt7&m){i`if9@nzee! zxa!Dr`5!Z9oO+FYbTI#1^O1}Xc*awYI+x$d4j*)Ms7QKJ(oL9H&HjH-{|zS)q5Bv4 n)v-QJY`6i1dEu%%d>^OeUIwxTV|Cp