Django:当登录详细信息与自定义模型详细信息不匹配时,不允许用户查看页面

时间:2018-07-03 09:35:33

标签: python django url login views

我有一个用于存储登录详细信息的自定义模型:

class UserRegistration(models.Model):
    # Auto updated when data is inserted
    created_at = models.DateTimeField(auto_now_add=True, auto_now=False)
    # Auto updated when data is altered
    updated_at = models.DateTimeField(auto_now_add=False, auto_now=True)

    username = models.CharField(max_length=255, null=True)
    password = models.CharField(max_length=255, null=True)
    first_name = models.CharField(max_length=255, null=True)
    last_name = models.CharField(max_length=255, null=True)

    def __str__(self):
        return self.first_name

urls.py是

url(r'^login/$', view.login_page, name='login_page'),

views.py是

def login_page(request):
    if request.method == 'GET':
        return render(request, "login_page.html")

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        print username, password
        credentials_matches = False  # considering credentials are wrong

        all_users = UserRegistration.objects.all()
        for user in all_users:
            if user.username == username and user.password == password:
                credentials_matches = True
                break

        if credentials_matches:
            return HttpResponse('success')
            # return redirect("http://127.0.0.1:8000/lmtech")
        else:
            return HttpResponse('fail')

我还有其他视图,如果他们尚未登录,则不希望显示给用户。我虽然使用@login_required(),但在这种情况下,用户详细信息位于自定义模型中。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

绝对不能建立这样的自定义用户模型。编写自己的身份验证系统始终是不安全的。

您应该使用标准的内置身份验证框架-您可以替换自己的用户模型,但是它必须继承自AbstractBaseUser,请参见the docs。但是,由于您没有添加任何自定义功能,因此似乎没有太多理由这样做。

答案 1 :(得分:0)

在您的自定义模型上,您需要名字,姓氏,名称,用户名和密码,在来自django的用户模型中,您只有更多电子邮件,这是可选的。因此,您可以做的是使用Django模型创建一个User,然后使用一种关系来拥有您想要的其他两个属性。

这是一个例子

class User(models.Model):
  username = models.CharField()
  password
  ...

class UserMore(models.Model):
  user = models.OneToOneField(User)
  created_at = ...
  updated_at = ...

  def __str__(self):
    return self.user.username

在这种情况下,您可以使用django的@login_required()。 性格,这就是我的方式。

但是,如果您真的想保留自定义模型而不使用Django的User模型,则可以将用户保留在您在登录视图中启动的会话中,然后在注销时将其删除。这样,您可以轻松检查request.session['username']是否已定义。