Django 使用登录链接登录用户

Django 使用登录链接登录用户,django,python-3.x,django-views,Django,Python 3.x,Django Views,我想向用户发送一个登录链接 我知道有一些一次性密码应用程序有成千上万的功能。但我只是想要一些简单的方式登录用户通过登录链接 我的问题是,这是否是一个正确的方法。比如最佳实践和枯燥的代码 所以我设置了一个存储三行的表。 1. '“用户”是指用户 2. '“自动生成的密钥”自动生成的密钥 3. '在“时间戳”处创建了_ 当他们登录时,系统将发送一封邮件,其中包含有效期为nn分钟的登录链接。 所以登录应该是这样的 对我来说,棘手的部分是找出一个好的方法来检查这个问题并登录用户。 我只是在猜。但这是一

我想向用户发送一个登录链接

我知道有一些一次性密码应用程序有成千上万的功能。但我只是想要一些简单的方式登录用户通过登录链接

我的问题是,这是否是一个正确的方法。比如最佳实践和枯燥的代码

所以我设置了一个存储三行的表。 1. '“用户”是指用户 2. '“自动生成的密钥”自动生成的密钥 3. '在“时间戳”处创建了_

当他们登录时,系统将发送一封邮件,其中包含有效期为nn分钟的登录链接。 所以登录应该是这样的

对我来说,棘手的部分是找出一个好的方法来检查这个问题并登录用户。 我只是在猜。但这是一个好办法吗

class login(generic.CreateView):
  def get(self, request, *args, **kwargs):
    try:
        autgeneratedkey = self.request.GET.get('autgeneratedkey', '')
        username = self.request.GET.get('username', '')

        obj_key = Login.objects.filter(autgeneratedkey=autgeneratedkey)[0]
        obj_user = Login.objects.filter(userusername=username)[0]

        try:
            if obj_user == obj_key: #Compare the objects if same
                if datetime.datetime.now() < (obj_key.created_at + datetime.timedelta(minutes=10)): #Check so the key is not older than 10min
                    u = CustomUser.objects.get(pk=obj_user.user_id)
                    login(request, u)
                    Login.objects.filter(autgeneratedkey=autgeneratedkey).delete()
                else:
                    return login_fail
            else:
                return login_fail

    except:
        return login_fail

    return redirect('index')

def login_fail(self, request, *args, **kwargs):
    return render(request, 'login/invalid_login.html')
类登录(generic.CreateView):
def get(自我、请求、*args、**kwargs):
尝试:
autgeneratedkey=self.request.GET.GET('autgeneratedkey','')
username=self.request.GET.GET('username','')
obj_key=Login.objects.filter(autgeneratedkey=autgeneratedkey)[0]
obj_user=Login.objects.filter(userusername=username)[0]
尝试:
如果obj_user==obj_key:#比较相同的对象
如果datetime.datetime.now()<(obj_key.created_at+datetime.timedelta(分钟=10)):#检查此键,使其不超过10分钟
u=CustomUser.objects.get(pk=obj\u user.user\u id)
登录(请求,u)
Login.objects.filter(autgeneratedkey=autgeneratedkey).delete()
其他:
返回登录失败
其他:
返回登录失败
除:
返回登录失败
返回重定向('索引')
def登录失败(self、request、*args、**kwargs):
返回呈现(请求'login/invalid_login.html')

首先使用autogeneratedkey,然后使用用户名来调用同一个帖子,感觉很草率。如果其他人觉得很俗气,也可以堆叠。

我不会在get请求中发送用户名。只需发送一个自动生成的密钥

然后这个db模式(它是一个新表,因为我不知道是否已经在使用
Login

LoginKey ( id [PK], user [FK(CustomUser)], key [Unique], expiry )
当用户提供电子邮件时,您将创建一个新的
LoginKey

然后像这样做:

def get(self, request, *args, **kwargs):
  key = request.GET.get('key', '')
  if not key:
    return login_fail

  login_key = LoginKey.objects.get(key=key)
  if login_key is None or datetime.datetime.now() > login_key.expiry:
    return login_fail

  u = login_key.user
  login(request, u)
  login_key.delete()
  return redirect('index')
class Login(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
class LoginView(generic.View):
  def get(self, request, *args, **kwargs):
    try:
        autgeneratedkey = self.request.GET.get('autgeneratedkey', '')
        username = self.request.GET.get('username', '')           
        user = CustomUser.objects.get(login__autgeneratedkey=autgeneratedkey, username=username, login__created_at__gte=datetime.now()-datetime.timedelta(minutes=10))
        login(request, user)
        user.login_set.all().delete()  # delete all login objects

    except CustomUser.DoesNotExist:
        return login_fail

    return redirect('index')

您可能可以这样优化代码:

def get(self, request, *args, **kwargs):
  key = request.GET.get('key', '')
  if not key:
    return login_fail

  login_key = LoginKey.objects.get(key=key)
  if login_key is None or datetime.datetime.now() > login_key.expiry:
    return login_fail

  u = login_key.user
  login(request, u)
  login_key.delete()
  return redirect('index')
class Login(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
class LoginView(generic.View):
  def get(self, request, *args, **kwargs):
    try:
        autgeneratedkey = self.request.GET.get('autgeneratedkey', '')
        username = self.request.GET.get('username', '')           
        user = CustomUser.objects.get(login__autgeneratedkey=autgeneratedkey, username=username, login__created_at__gte=datetime.now()-datetime.timedelta(minutes=10))
        login(request, user)
        user.login_set.all().delete()  # delete all login objects

    except CustomUser.DoesNotExist:
        return login_fail

    return redirect('index')
首先假设用户和登录模型之间的关系如下:

def get(self, request, *args, **kwargs):
  key = request.GET.get('key', '')
  if not key:
    return login_fail

  login_key = LoginKey.objects.get(key=key)
  if login_key is None or datetime.datetime.now() > login_key.expiry:
    return login_fail

  u = login_key.user
  login(request, u)
  login_key.delete()
  return redirect('index')
class Login(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
class LoginView(generic.View):
  def get(self, request, *args, **kwargs):
    try:
        autgeneratedkey = self.request.GET.get('autgeneratedkey', '')
        username = self.request.GET.get('username', '')           
        user = CustomUser.objects.get(login__autgeneratedkey=autgeneratedkey, username=username, login__created_at__gte=datetime.now()-datetime.timedelta(minutes=10))
        login(request, user)
        user.login_set.all().delete()  # delete all login objects

    except CustomUser.DoesNotExist:
        return login_fail

    return redirect('index')
然后可以使用如下视图:

def get(self, request, *args, **kwargs):
  key = request.GET.get('key', '')
  if not key:
    return login_fail

  login_key = LoginKey.objects.get(key=key)
  if login_key is None or datetime.datetime.now() > login_key.expiry:
    return login_fail

  u = login_key.user
  login(request, u)
  login_key.delete()
  return redirect('index')
class Login(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
class LoginView(generic.View):
  def get(self, request, *args, **kwargs):
    try:
        autgeneratedkey = self.request.GET.get('autgeneratedkey', '')
        username = self.request.GET.get('username', '')           
        user = CustomUser.objects.get(login__autgeneratedkey=autgeneratedkey, username=username, login__created_at__gte=datetime.now()-datetime.timedelta(minutes=10))
        login(request, user)
        user.login_set.all().delete()  # delete all login objects

    except CustomUser.DoesNotExist:
        return login_fail

    return redirect('index')

还有一件事,在更新数据库时使用
GET
方法不是一个好做法。最好在此处使用post方法。只需允许用户单击链接(将由其他模板视图处理),然后从该模板,使用ajax对此视图发出POST请求。

我看到您在模型中添加了一个“到期日”。我似乎找不到任何关于此的文档。它是什么?将其设置为日期时间,就像您在