django中有关用户的操作

本文详细介绍了Django中用户的相关操作,包括创建用户、修改密码、用户验证、权限测试、添加权限、登录与注销、权限需求装饰器等,强调了权限格式的设置以及如何防止密码修改后导致的登录失效问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、创建用户

	from django.contrib.auth.models import User
    user = User.objects.create_user('用户名','邮箱','密码')

2、修改密码

    user.set_password('新密码')
    user.save()

3、用户验证
用来验证是否有该数据,认证通过则返回一个User类对象,一项都没通过或者抛出了PermissionDenied异常,则返回一个None。

    from django.contrib.auth import authenticate
    user = authenticate(username='john', password='secret')

4、has_perm 权限测试
假设你现在有个app叫做foo,有个model叫做bar

    add: user.has_perm('foo.add_bar')
    change: user.has_perm('foo.change_bar')
    delete: user.has_perm('foo.delete_bar')
    view: user.has_perm('foo.view_bar')

5、添加权限
添加权限后,并不会直接有效,需要重新获取该用户才能使添加的权限有效

    from myapp.models import BlogPost
    from django.contrib.auth.models import Permission
    from django.contrib.contenttypes.models import ContentType
    content_type = ContentType.objects.get_for_model(BlogPost)
    permission = Permission.objects.create(
        codename='can_publish',
        name='Can Publish Posts',
        content_type=content_type,
    )
    user = get_object_or_404(User,pk=1)
    user.user_permission.add(permission)

6、登陆操作
每一次请求中都包含一个request.user属性,表示当前用户。如果该用户未登陆,该属性的值是一个AnonymousUser实例(匿名用户),如果已经登录,该属性就是一个User模型的实例。并且在登陆之前应该先判断该用户名和密码是否有效

    from django.contrib.auth import authenticate, login, logout
    user = authenticate(username=username, password=password)
    if user is not None:
        login(request, user)

7、注销操作

    logout(request)

8、判断是否登陆

方法一:
    if request.user.is_authenticated:
        已登陆
    else:
        未登陆
方法二:
	使用装饰器@login_required(redirect_field_name='next', login_url=None)
    login_url :如果没有登陆。将重定向到这个url,或者设置settings.LOGIN_URL
    redirect_field_name='next': 默认未next,会将当前url的相对路径构成一个next做key的查询字符对附加到 settings.LOGIN_URL后面
    使用LoginRequired mixin,通过继承LoginRequiredMixin类的方式限制用户。在多继承时,该类必须是最左边的父类。
    
    from django.contrib.auth.mixins import LoginRequiredMixin
    class MyView(LoginRequiredMixin, View):
        login_url = '/login/'
        redirect_field_name = 'redirect_to'

9、限制用户访问

方法一:
    user_passes_test(test_func,login_url = None,redirect_field_name ='next'from django.contrib.auth.decorators import user_passes_test
    def email_check(user):
        return user.email.endswith('@example.com')
    @user_passes_test(email_check)
    def my_view(request):
    	该装饰器需要获取一个可调用的User对象
方法二:
    使用 UserPassesTestMixin
    必须覆盖test_func()类的方法以提供执行的测试
    from django.contrib.auth.mixins import UserPassesTestMixin
    class MyView(UserPassesTestMixin, View):
        def test_func(self):
            return self.request.user.email.endswith('@example.com')

9、权限需求装饰器
权限的格式为:< app_name>: < permission codename>
如果raise_exception为True,则装饰器将引发 PermissionDenied,提示403(HTTP Forbidden)视图而不是重定向到登录页面。
若使用了raise_exception还想提供登陆,则需要与login_required一起使用

    from django.contrib.auth.decorators import permission_required
    @permission_required('polls.can_vote', login_url=url, raise_exception=True)

10、防止密码修改后登陆无效

    update_session_auth_hash(request, user)
    使用方法:
    from django.contrib.auth import update_session_auth_hash
    def password_change(request):
        if request.method == 'POST':
            form = PasswordChangeForm(user=request.user, data=request.POST)
            if form.is_valid():
                form.save()
                update_session_auth_hash(request, form.user)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值