decorators.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from functools import wraps
  2. from urllib.parse import urlparse
  3. from django.conf import settings
  4. from django.shortcuts import resolve_url
  5. from django.http import JsonResponse
  6. from .models import User, LoginToken
  7. def user_passes_test(test_func, error):
  8. def decorator(view_func):
  9. @wraps(view_func)
  10. def _wrapped_view(request, *args, **kwargs):
  11. if test_func(request):
  12. return view_func(request, *args, **kwargs)
  13. return JsonResponse({'code': 401, 'error': error}, status=401)
  14. return _wrapped_view
  15. return decorator
  16. def login_required(function=None, error='error'):
  17. """
  18. Decorator for views that checks that the _user is logged in, redirecting
  19. to the log-in page if necessary.
  20. """
  21. def is_login(request):
  22. if request.method != 'POST':
  23. return True
  24. username = request.POST.get('username', '')
  25. token = request.POST.get('token', '')
  26. print(f'username={username} token={token}')
  27. try:
  28. user = User.objects.get(username=username)
  29. if user.check_token(token):
  30. user.tokens.get(token=token)
  31. print('已登录')
  32. return True
  33. except:
  34. print('未登录')
  35. return False
  36. print('未登录')
  37. return False
  38. actual_decorator = user_passes_test(is_login, '请登录')
  39. if function:
  40. return actual_decorator(function)
  41. return actual_decorator