views.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from django.shortcuts import render
  2. from .forms import RegisterForm, LoginForm
  3. from django.contrib.auth import authenticate, login, logout
  4. # from django.views.generic.edit import FormView
  5. from django.views.generic import FormView, RedirectView
  6. from django.contrib.auth import get_user_model
  7. from django.http import HttpResponseRedirect
  8. from django.urls import reverse
  9. from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
  10. from django.contrib.auth import REDIRECT_FIELD_NAME
  11. from django.views.decorators.csrf import csrf_protect
  12. from django.contrib import auth
  13. from django.views.decorators.cache import never_cache
  14. from django.shortcuts import redirect
  15. from django.utils.decorators import method_decorator
  16. from django.views.decorators.debug import sensitive_post_parameters
  17. from django.utils.http import is_safe_url
  18. # Create your views here.
  19. class RegisterView(FormView):
  20. form_class = RegisterForm
  21. template_name = 'account/registration_form.html'
  22. def form_valid(self, form):
  23. user = form.save(False)
  24. user.save(True)
  25. url = reverse('accounts:login')
  26. return HttpResponseRedirect(url)
  27. class LogoutView(RedirectView):
  28. url = '/login/'
  29. @method_decorator(never_cache)
  30. def dispatch(self, request, *args, **kwargs):
  31. return super(LogoutView, self).dispatch(request, *args, **kwargs)
  32. def get(self, request, *args, **kwargs):
  33. from website.utils import cache
  34. cache.clear()
  35. logout(request)
  36. return super(LogoutView, self).get(request, *args, **kwargs)
  37. class LoginView(FormView):
  38. form_class = LoginForm
  39. template_name = 'account/login.html'
  40. success_url = '/'
  41. redirect_field_name = REDIRECT_FIELD_NAME
  42. @method_decorator(sensitive_post_parameters('password'))
  43. @method_decorator(csrf_protect)
  44. @method_decorator(never_cache)
  45. def dispatch(self, request, *args, **kwargs):
  46. return super(LoginView, self).dispatch(request, *args, **kwargs)
  47. def get_context_data(self, **kwargs):
  48. redirect_to = self.request.GET.get(self.redirect_field_name)
  49. if redirect_to is None:
  50. redirect_to = '/'
  51. kwargs['redirect_to'] = redirect_to
  52. return super(LoginView, self).get_context_data(**kwargs)
  53. def form_valid(self, form):
  54. form = AuthenticationForm(data=self.request.POST, request=self.request)
  55. if form.is_valid():
  56. from website.utils import cache
  57. if cache and cache is not None:
  58. cache.clear()
  59. print(self.redirect_field_name)
  60. redirect_to = self.request.GET.get(self.redirect_field_name)
  61. auth.login(self.request, form.get_user())
  62. return super(LoginView, self).form_valid(form)
  63. # return HttpResponseRedirect('/')
  64. else:
  65. return self.render_to_response({
  66. 'form': form
  67. })
  68. @property
  69. def get_success_url(self):
  70. print(self.redirect_field_name)
  71. redirect_to = self.request.POST.get(self.redirect_field_name)
  72. if not is_safe_url(redirect_to, allowed_hosts=self.request.get_host()):
  73. redirect_to = self.success_url
  74. return redirect_to