在Django中添加装饰器

mac2025-11-04  3

1.没有装饰器的——》Django 的注册功能

def register(request): result = None # 仅检查post if request.method != 'POST': result = {"error": "此方法仅接受post!"} else: try: user = User.objects.create_user(request.POST['username'], request.POST['email'], request.POST['password']) # 可选字段 for field in ['first_name', 'last_name']: if field in request.POST: setattr(user, field, request.POST[field]) user.save() result = {"success": True} except KeyError as e: result = {"error": str(e) } response = HttpResponse(json.dumps(result)) if "error" in set(result): response.status_code = 500 return response

2.只有一个装饰器的注册功能

from functools import wraps def post_only(f): """ 确保方法仅发布 """ @wraps(f) def wrapped_f(request): if request.method != "POST": response = HttpResponse(json.dumps( {"error": "此方法仅接受post!"})) response.status_code = 500 return response return f(request) return wrapped_f @post_only def register(request): result = None try: user = User.objects.create_user(request.POST['username'], request.POST['email'], request.POST['password']) # 可选字段 for field in ['first_name', 'last_name']: if field in request.POST: setattr(user, field, request.POST[field]) user.save() result = {"success": True} except KeyError as e: result = {"error": str(e) } response = HttpResponse(json.dumps(result)) if "error" in set(result): response.status_code = 500 return response

3.只有两个装饰器的注册功能

from decorator import decorator from functools import wraps @decorator # 第一种方式 def post_only(f): """ 确保方法仅发布 """ @wraps(f) # 第二种方式 def wrapped_f(request): if request.method != "POST": response = HttpResponse(json.dumps( {"error": "此方法仅接受post!"})) response.status_code = 500 return response return f(request) return wrapped_f def json_response(f): """ 将响应返回为json,如果存在错误,则返回500错误代码 """ def wrapped(*args, **kwargs): result = f(*args, **kwargs) response = HttpResponse(json.dumps(result)) if type(result) == dict and 'error' in set(result): response.status_code = 500 return response @post_only @json_response def register(request): try: user = User.objects.create_user(request.POST['username'], request.POST['email'], request.POST['password']) # 可选字段 for field in ['first_name', 'last_name']: if field in request.POST: setattr(user, field, request.POST[field]) user.save() return {"success": True} except KeyError as e: return {"error": str(e) }

重新编写登陆功能

@post_only @json_response def login(request): if request.user is not None: return {"error": "User is already authenticated!"} user = auth.authenticate(request.POST['username'], request.POST['password']) if user is not None: if not user.is_active: return {"error": "User is inactive"} auth.login(request, user) return {"success": True, "id": user.pk} else: return {"error": "User does not exist with those credentials"}
最新回复(0)