decorators.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. from functools import wraps
  2. from .models import User
  3. from utils.http import make_json_response
  4. def user_passes_test(test_func, error):
  5. def decorator(view_func):
  6. @wraps(view_func)
  7. def _wrapped_view(request, *args, **kwargs):
  8. if test_func(request):
  9. return view_func(request, *args, **kwargs)
  10. return make_json_response(code=401, error=error)
  11. return _wrapped_view
  12. return decorator
  13. def login_required(function=None, error='未登录'):
  14. """
  15. Decorator for views that checks that the _user is logged in, redirecting
  16. to the log-in page if necessary.
  17. """
  18. def is_login(request):
  19. if request.method != 'POST':
  20. return False
  21. username = request.POST.get('username', '')
  22. token = request.POST.get('token', '')
  23. print(f'username={username} token={token}')
  24. try:
  25. user = User.objects.get(username=username)
  26. except:
  27. print('用户不存在')
  28. return False
  29. if not user.check_token(token) or not user.tokens.filter(token=token):
  30. print('token无效')
  31. return False
  32. print('已登录')
  33. if hasattr(request, 'user'):
  34. request.user = user
  35. return True
  36. actual_decorator = user_passes_test(is_login, error)
  37. if function:
  38. return actual_decorator(function)
  39. return actual_decorator