gpt4 book ai didi

python - 如何在 Django 中处理多种用户类型

转载 作者:行者123 更新时间:2023-11-30 23:22:47 26 4
gpt4 key购买 nike

我正在尝试制作一个包含三种类型用户的小型网站 ["client" , "volunteer" , "coordinator"] 。每种类型的用户对其可以访问的 View 都有限制。所有三个用户都有不同的登录页面。

方法 1:为了实现此目的,我向 session 添加了一个 key category ,在登录期间分配上述给定的 userType 之一,并且每当调用 View 时,检查该用户是否可以访问该 View 。

登录.html:

{% extends "base.html" %}
{% block content %}

{% if form.errors %}
<p class="error"> Sorry , invalid</p>
{% endif %}

<form action="/login_volunteer/authenticate/" method="post">{% csrf_token %}
<label for="username"> Username : </label>
<input type="text" name="username" value="" id="username">
<label for="password"> Password : </label>
<input type="password" name="password" value="" id="password">
<input type="hidden" name="category" value="volunteer" id="category">
<input type="submit" value="login" />
</form>

{% endblock %}

查看.py:

def hello(request):
name = "abhishek"
if request.session.session_key is None:
html = '<html><body>Session is expired</body></html>'
return HttpResponse(html)
try:
if not request.POST.get('category') == 'volunteer
html = '<html><body>You are Not allowed here</body></html>'
return HttpResponse(html)
except :
print "error"
html = '<html><body>Hi this is awesome</body></html>'
return HttpResponse(html)

方法 2: 我认为我可以创建一个自定义 User 类,而不仅仅是使用默认的 User由 Django 提供并将 CustomUser 分配给 request.user登录期间。然后,当调用 View 时,我检查 is_Client 或 is_Volunteer。

自定义用户.py:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser

class VolunteerUser(AbstractBaseUser):
"""
Custom user class.
"""
email = models.EmailField('email address', unique=True, db_index=True)
joined = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
is_volunteer = models.BooleanField(default=False)

class ClientUser(AbstractBaseUser):
"""
Custom user class.
"""
email = models.EmailField('email address', unique=True, db_index=True)
joined = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
is_Client = models.BooleanField(default=False)

所以我的问题是,这些方法中哪一种是完成手头任务的最佳方法?还有其他方法可以解决这个问题吗?

我也担心安全性,我觉得第一种方法比第二种更不安全。

最佳答案

实现您的要求的更好方法是使用 Django 中内置的 GroupPermissions 模型。但由于 Permissions 可能有点棘手,另一种方法是创建一个 UserProfile 模型,如下所示:

from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.ForeignKey(User)
type = models.CharField(max_length=15)

然后使用 @user_passes_test 装饰器来控制对 View 的访问,如下所示:

from django.contrib.auth.decorators import user_passes_test
@user_passes_test(lambda u: u.get_profile().type == 'client')
def view_for_client(request):
...

UserProfile 模型对于保存用户的所有首选项也很有用。您还需要设置以下设置:

AUTH_PROFILE_MODULE = 'accounts.UserProfile'

关于python - 如何在 Django 中处理多种用户类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24319973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com