decorators.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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})
  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. if hasattr(request, 'user'):
  33. request.user = user
  34. return True
  35. except:
  36. print('未登录')
  37. return False
  38. print('未登录')
  39. return False
  40. actual_decorator = user_passes_test(is_login, '请登录')
  41. if function:
  42. return actual_decorator(function)
  43. return actual_decorator