python用户管理系统模块_Django的用户模块与权限系统的示例代码

一 导言

设计一个好的用户系统往往不是那么容易,Django提供的用户系统可以快速实现基本的功能,并可以在此基础上继续扩展以满足我们的需求。

先看看Django的用户系统都提供哪些功能:

提供用户模块(User Model)

权限验证(默认添加已有模块的增加删除修改权限)

用户组与组权限功能

用户鉴权与登录功能

与用户登录验证相关的一些函数与装饰方法

如配置了Django的用户系统,仅需调用Django提供的几个函数,便可实现用户的登录,注销,权限验证等功能。例如以下情景

1.登录

# some_view.py

from django.contrib.auth import authenticate, login

def login(request):

username = request.POST['username']

password = request.POST['password']

# Django提供的authenticate函数,验证用户名和密码是否在数据库中匹配

user = authenticate(username=username, password=password)

if user is not None:

# Django提供的login函数,将当前登录用户信息保存到会话key中

login(request, user)

# 进行登录成功的操作,重定向到某处等

...

else:

# 返回用户名和密码错误信息

...

2.注销

# some_view.py

from django.contrib.auth import logout

def logout(request):

# logout函数会清除当前用户保存在会话中的信息

logout(request)

3.验证是否登录

# some_view.py

def some_fuction(request):

user = request.user

if user.is_authenticated:

# 已登录用户,可以往下进行操作

else:

# 返回要求登录信息

4.验证是否有权限

# some_view.py

def some_fuction(request):

user = request.user

if user.has_perm('myapp.change_bar'):

# 有权限,可以往下进行操作

else:

# 返回禁止访问等信息

二 用户模块

Django的用户模块类定义在auth应用中,如要直接使用Django的用户类,在setting配置文件中的INSTALLAPP添加一行django.contrib.auth。

这样就可以在代码中直接用User类创建用户:

from django.contrib.auth.models import User

user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')

user.last_name = 'Lennon'

user.save()

看看Django的源码User类定义了什么属性:

class User(AbstractUser):

"""

Users within the Django authentication system are represented by this

model.

Username, password and email are required. Other fields are optional.

"""

class Meta(AbstractUser.Meta):

swappable = 'AUTH_USER_MODEL'

…,啥都没有?

注意到User类继承AbstractUser类, 用户名和密码信息等定义在父类了。所以再看看AbstractUser类的定义, 限于篇幅仅列出其中一部分,源码在https://github.com/django/django/blob/master/django/contrib/auth/models.py

class AbstractUser(AbstractBaseUser, PermissionsMixin):

username = models.CharField(

_('username'),

max_length=150,

unique=True,

help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),

validators=[username_validator],

error_messages={

'unique': _("A user with that username already exists."),

},

)

first_name = models.CharField(_('first name'), max_length=30, blank=True)

last_name = models.CharField(_('last name'), max_length=30, blank=True)

email = models.EmailField(_('email address'), blank=True)

date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

....

可以看到AbstractUser类中定义了username这个字段了,另外还有email、first_name、last_name等。AbstractUser类还继承AbstractBaseUser和PermissionsMixin类,AbstractBaseUser类提供password字段及将密码加密保存的相关方法,PermissionsMixin类提供User类权限认证功能。

总的来说,一个User类,定义了以下字段:

username: 用户名

password: 密码

first_name: 姓名

last_name: 姓名

email: 邮箱

groups: Group类多对多的关系对象管理器

user_permissions: Permission类多对多的关系对象管理器

is_staff: 是否工作人员

is_active: 是否激活

is_superuser: 是否管理员

last_login: 最近登录时间

date_joined: 注册时间

另外,生成一个User实例,可以使用以下属性:

is_authenticated: 只读,用来判断用户是否存在。只有AnonymousUser类这个属性为False。

is_anonymous: 就是用来区分 User 和 AnonymousUser 对象而已。

User类提供了许多方法方便我们执行各种操作:

set_password(raw_password): 可以将password转成hash值,记得再调用user.save()保存。

check_password(raw_password): 相反,将原生密码与保存在数据库中hash值密码对比(直接对比肯定不相同的)。

has_perm(perm, obj=None),has_perms(perm_list, obj=None): 验证该用户是否拥有某个权限或者权限列表

get_all_permissions(obj=None): 返回该用户拥有的所有权限

三 验证与登录用户

验证用户名和密码看起来很简单,对比提交的用户名和密码与数据库保存的一致即可。

如:

# some_view.py

def some_fuction(request):

username = request.POST['username']

password = request.POST['password']

try:

user = User.objects.get(username=username, password=password)

except ObjectNotExists:

# 用户名和密码不匹配一个用户

...

由于密码已经进行hash后保存,上述代码还得先把提交的password值先hash再去数据库中搜索,总得多写了一些代码。这些Django都已经考虑到了, 提供了一个authenticate函数验证是否存在该用户,就像导言的实例代码:

# some_view.py

from django.contrib.auth import authenticate, login

def login(request):

username = request.POST['username']

password = request.POST['password']

user = authenticate(username=username, password=password)

if user is not None:

login(request, user)

...

else:

...

这里重点说明一下authenticate和login函数。

1.authenticate(**credentials)

传入待验证的参数,默认是username和password,它会调用系统配置里的每一个authentication backend进行验证,验证通过返回一个User实例,否则返回None。

每一个authentication backend指认证后端,在setting.py中配置的AUTHENTICATION_BACKENDS变量,默认是[‘django.contrib.auth.backends.ModelBackend'],可以增加自定义的认证后端,或者使用第三方提供的。authenticate函数会按顺序调用每一个进行验证,如果第一个没有通过,它会使用第二个进行验证,直到所有的认证后端都失败后才返回None。

看看这个ModelBackend类如何返回认证用户(再次缩减源码):

class ModelBackend(object):

def authenticate(self, request, username=None, password=None, **kwargs):

if username is None:

username = kwargs.get(UserModel.USERNAME_FIELD)

try:

user = UserModel._default_manager.get_by_natural_key(username)

except UserModel.DoesNotExist:

UserModel().set_password(password)

else:

if user.check_password(password) and self.user_can_authenticate(user):

return user

# ...

实际上authenticate函数会调用每一个authentication backend类的authenticate方法, ModelBackend类与我们之前的验证方法稍有不同,它先从数据库用户表中取出与username对应的一个User实例,再通过User的check_password方法验证password是否正确,并返回这个User实例。

2.login(request, user, backend=None)

接收HttpRequest对象和一个User对象,login函数会将当前用户信息保存到会话cookie中,所以要使用Django用户系统的所有功能,也得安装Django默认的会话APP。

看看login函数做了什么:

def login(request, user, backend=None):

# (清空当前的session信息)

# ...

request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)

request.session[BACKEND_SESSION_KEY] = backend

request.session[HASH_SESSION_KEY] = session_auth_hash

if hasattr(request, 'user'):

request.user = user

rotate_token(request)

user_logged_in.send(sender=user.__class__, request=request, user=user)

login函数将当前用户的一个唯一标识信息保存在request.session的SESSION_KEY中, 下次请求时即可从会话cookie中拿到当前登录的用户对象。

如果要求登录用户才能访问相应的View,可以这么写:

from django.conf import settings

from django.shortcuts import redirect

def my_view(request):

if not request.user.is_authenticated:

return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

通过login函数可以将用户信息保存在会话中,当下一个请求到达view前,Django的会话中间件从会话cookie中取出用户对象,并赋值给request.user。这样,已登录的用户request.user.is_authenticated值为True,可以进行相应的操作。未登录用户request.user返回一个AnonymousUser对象,它的is_authenticated属性值永远为False,那么要将这个请求重定向到登录页面。

这两行代码可以通过在view函数上加一个装饰器实现,如

@login_required

def my_view(request):

...

装饰器login_required(redirect_field_name='next', login_url=None), 可传入login_url参数设置未登录用户的请求重定向的地址,否则重定向到settings.LOGIN_URL。

四 权限认证

User模型有两个多对多关系的字段: groups 和 user_permissions, 它们与Pemission模型有关。User与Pemission、User与Permission、Group与Permission均是多对多关系, Permission定义了具体的权限,其字段如下:

class Permission(models.Model):

name = models.CharField(_('name'), max_length=255) # 权限名称(用作显示)

content_type = models.ForeignKey( # 内容类型: 每个模型对应一个内容类型,用于定位指定模型

ContentType,

models.CASCADE,

verbose_name=_('content type'),

)

codename = models.CharField(_('codename'), max_length=100) # 权限的代码名称,用在如has_permission函数参数

给一个用户添加、删除权限很简单: myuser.user_permissions.set([permission_list]) myuser.user_permissions.add(permission, permission, …) myuser.user_permissions.remove(permission, permission, …) myuser.user_permissions.clear()

其中,permission是具体的permission对象。 也可以通过用户所在的组添加相应的权限: group.permissions.set([permission_list]) group.permissions.add(permission, permission, …) group.permissions.remove(permission, permission, …) group.permissions.clear()

只要这个用户加入该组也拥有组权限。通过User对象的get_all_permissions(obj=None)方法可以获得该用户的所有权限列表(字符列表),也可以通过get_group_permissions(obj=None)获得对应的组权限列表。

我们更经常要做的是在view中执行操作之前验证用户是否拥有指定权限,这里一般用到User对象的has_perm(perm, obj=None)方法或者has_perms(perm_list, obj=None)判断。

has_perm(perm, obj=None)方法中perm是”."格式的权限字符串, 如果有这个权限,方法会返回True。同样,`has_perms(perm_list, obj=None)`方法中perm_list中是"."格式的权限字符串列表。

同login_required装饰器,权限认证也有对应的permission_required装饰器:

permission_required(perm, login_url=None, raise_exception=False)

如果raise_exception=True, 权限没有认证通过则抛出PermissionDenied异常,返回默认的403页面。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

### 回答1: Python Django是一个基于Python语言的Web应用框架,能够帮助开发者快速构建高效、安全和可扩展的管理系统Python Django具有以下特点: 1. 简单易用:Django提供了许多内置的功能和工具,使得开发者可以使用简单的代码完成复杂的任务。它使用了Python语言的简洁和易读的语法,降低了学习和使用的门槛。 2. 高效性:Django具有比较高的性能,可以处理大量的并发请求。它的模型-视图-控制器(MVC)的设计模式可以有效地将业务逻辑和数据处理分离,提高系统的可维护性和可扩展性。 3. 安全性:Django内置了许多安全特性,可以帮助开发者有效地防止常见的Web攻击,如跨站脚本攻击(XSS)和跨站请求伪造(CSRF)。此外,Django还提供了用户认证和权限管理的功能,保护敏感数据的安全性。 4. 可扩展性:Django使用了模块化的设计,提供了许多可重用的应用和插件,可以快速集成到现有的系统中。开发者可以根据自己的需求选择合适的模块和扩展,提高开发效率。 5. 社区支持:Django拥有庞大的开发者社区,提供了丰富的文档、教程和示例代码。开发者可以通过社区分享经验和解决问题,加快开发进程。 综上所述,Python Django是一个功能强大、易用、高效和安全的管理系统开发框架,能够帮助开发者快速构建具有良好用户体验和高度可定制性的管理系统。 ### 回答2: Python Django 是一个开发Web应用程序的高级框架,可以用于快速、高效地开发管理系统。 在 Python Django 管理系统中,我们可以使用 Django 框架中的模型、视图和模板来建立数据模型、业务逻辑和用户界面。通过模型,我们可以定义数据库中的表和字段,以及它们之间的关系。视图是处理用户请求和返回响应的逻辑处理部分,可以从模型中获取数据并通过模板渲染生成用户界面。模板是用户最终看到的页面的呈现方式,我们可以在模板中渲染动态内容,包括从数据库中获取的数据。通过使用 Django 自带的管理界面,我们可以方便地管理模型数据,包括创建、编辑、删除和查询。 使用 Python Django 管理系统的好处有很多。首先,Django 提供了丰富而强大的功能,例如自动化的URL路由、表单处理、用户认证和访问控制、缓存等。这些功能让开发者能够快速构建完整且安全的管理系统。其次,Django 遵循了MVC(模型-视图-控制器)的设计模式,使代码易于组织和维护。此外,Django 还拥有活跃的社区和丰富的第三方库,开发者可以轻松地找到解决方案和扩展功能。 总之,Python Django 管理系统是一个强大而灵活的工具,可以帮助开发者高效地构建管理系统。无论是小型的个人项目还是大规模的企业应用,它都能满足各种需求,并提供良好的开发体验。 ### 回答3: Python Django是一种常用的Web应用程序开发框架,用于快速搭建和管理网站。Django管理系统提供了许多开箱即用的功能,使得开发人员可以轻松地创建和修改网站的后台管理界面。 使用Python Django开发管理系统可以带来许多好处。首先,Django提供了强大的数据库模型层,开发者可以使用简单的Python代码定义数据库表格和字段,然后Django会自动创建和管理数据库结构。这样的设计使得数据管理变得非常方便,开发人员只需要专注于业务逻辑的实现而不必担心数据库操作的细节。 其次,Django管理系统具有丰富的内置功能,例如自动生成的数据列表、搜索、过滤和排序等功能。这些功能使得网站管理员可以直接在后台管理页面上对数据进行操作和管理,无需编写额外的代码。 此外,Django管理系统还支持用户认证和权限控制。开发者可以根据不同的用户角色定义不同的权限,从而确保只有具有相应权限用户才能进行敏感操作。这大大增强了网站的安全性和可靠性。 最后,Python Django的开源社区非常活跃,有许多开源的插件和扩展可供使用。这些插件可以帮助开发者进一步扩展和定制管理系统,满足不同网站的需求。 总而言之,Python Django管理系统是一个强大且易用的工具,可以帮助开发人员快速搭建和管理网站的后台管理界面。无论是大型企业级应用还是小型个人项目,Django都是一个值得考虑的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值