text: from django.shortcuts import render
  from django.views.generic.base import View
  from django.contrib.auth import authenticate, login, logout
  from django.http import HttpResponseRedirect, JsonResponse
  from django.urls import reverse
  import redis
  
  from apps.users.forms import LoginForm, DynamicLoginForm, DynamicLoginPostForm, RegisterGetForm, RegisterPostForm
  from apps.users.models import UserProfile
  from apps.utils.random_authcode import generate_random
  from apps.utils.aws_sns import send_sms
  from MxOnline.settings import REDIS_HOST, REDIS_PORT
  
  
  class RegisterView(View):
      def get(self, request, *args, **kwargs):
          register_get_form = RegisterGetForm()
          return render(request, "register.html", {"register_get_form": register_get_form})
  
      def post(self, request, *args, **kwargs):
          register_post_form = RegisterPostForm(request.POST)
          if register_post_form.is_valid():
              mobile = register_post_form.cleaned_data["mobile"]
              password = register_post_form.cleaned_data["password"]
              user = UserProfile(username=mobile)
              user.set_password(password)
              user.mobile = mobile
              user.save()
              login(request, user)
              return HttpResponseRedirect(reverse("index"))
          else:
              register_get_form = RegisterGetForm()
              return render(request, "register.html", {
                  "register_get_form": register_get_form,
                  "register_post_form": register_post_form,
              })
  
  
  class DynamicLoginView(View):
      def post(self, request, *args, **kwargs):
          login_form = DynamicLoginPostForm(request.POST)
          dynamic_login = True
          if login_form.is_valid():
              # find user from database first
              mobile = login_form.cleaned_data["mobile"]
              existed_users = UserProfile.objects.filter(mobile=mobile)
              if existed_users:
                  user = existed_users[0]
              else:
                  # register a new user
                  user = UserProfile(username=mobile)
                  password = generate_random(random_length=10, type=2)
                  user.set_password(password)
                  user.mobile = mobile
                  user.save()
              login(request, user)
              return HttpResponseRedirect(reverse("index"))
          else:
              dynamic_form = DynamicLoginForm()
              return render(request, "login.html", {
                  "login_form": login_form,
                  "dynamic_form": dynamic_form,
                  "dynamic_login": dynamic_login
              })
  
  
  class SendSmsView(View):
      def post(self, request, *args, **kwargs):
          send_sms_form = DynamicLoginForm(request.POST)
          re_dict = {}
          if send_sms_form.is_valid():
              mobile = send_sms_form.cleaned_data["mobile"]
              code = generate_random(6, 0)
              re_json = send_sms(mobile=mobile, authcode=code)
              if re_json["ResponseMetadata"]["HTTPStatusCode"] == 200:
                  re_dict["status"] = "success"
                  r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=0, charset="utf8", decode_responses=True)
                  r.set(str(mobile), code)
                  r.expire(str(mobile), 60 * 5)  # authentication code expire in 5 minutes
              else:
                  re_dict["status"] = "fail"
          else:
              for key, value in send_sms_form.errors.items():
                  re_dict[key] = value[0]
  
          return JsonResponse(re_dict)
  
  
  class LoginView(View):
      def get(self, request, *args, **kwargs):
          if request.user.is_authenticated:
              return HttpResponseRedirect(reverse("index"))
  
          login_form = DynamicLoginForm()
          return render(request, "login.html", {
              "login_form": login_form
          })
  
      def post(self, request, *args, **kwargs):
          # form authenticate
          login_form = LoginForm(request.POST)
  
          if login_form.is_valid():
              username = login_form.cleaned_data["username"]
              password = login_form.cleaned_data["password"]
              # search user exists by username and password
              user = authenticate(username=username, password=password)
  
              # user exists
              if user is not None:
                  login(request, user)
                  return HttpResponseRedirect(reverse("index"))
              else:
                  return render(request, "login.html", {"msg": "username or password error", "login_form": login_form})
  
          # user doesn't exist
          else:
              return render(request, "login.html", {"login_form": login_form})
  
  
  class LogoutView(View):
      def get(self, request, *args, **kwargs):
          logout(request)
          return HttpResponseRedirect(reverse("index"))
  