教程模块
This commit is contained in:
@@ -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}
|
||||
|
||||
28
account/decorators.py
Normal file
28
account/decorators.py
Normal file
@@ -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])
|
||||
@@ -4,7 +4,7 @@ from django.contrib.auth.models import AbstractUser
|
||||
|
||||
|
||||
class RoleChoices(models.TextChoices):
|
||||
SUPER = "sup er", "超级管理员"
|
||||
SUPER = "super", "超级管理员"
|
||||
ADMIN = "admin", "管理员"
|
||||
NORMAL = "normal", "普通"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user