IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Django Auth用户认证系统

    haoflynet发表于 2015-06-20 14:15:12
    love 0

    Django项目默认添加了用户认证系统的,可以通过python manage.py makemigrations python manage.py migrate将认证系统的数据表添加到数据库中去。

    创建用户

    from django.contrib.auth.models import User
    user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
    # 这里可以设置其它的字段
    user.save()

    创建超级用户

    $ python manage.py createsuperuser --email=896499825@qq.com --username=wanghao
    Password:
    Password (again):
    Superuser created successfully.

    验证用户登录

    需要注意的是,为了不与login冲突,views最好不要写成login

    from django.contrib.auth import authenticate, login
    user = authenticate(username='hao', password='test')
    if user is not None:
        if user.is_activate:
            print('用户验证并登录成功')
            login(request, user)     # 这才是登录,才会写入session
        else:
            print('密码正确,但是用户无法登录')
        return HttpResponse('居然有这个用户')
    else:
        return HttpResponse('用户不存在')

    若登录成功,则会返回一个user对象,否则返回None,但是Django默认的认证系统只能认证username和password,却不能认证其它的字段,比如email字段,看似非常糟糕,但是Django却提供了十分方便的功能来扩展默认的验证组件。查看文档:Customizing authentication in Django

    如果要验证用户名或email可以这样做:首先,在myapp目录下新建一个文件,姑且取名叫backends.py,其内容如下:

    from django.conf import settings
    from django.contrib.auth.models import User
    
    class EmailOrUsernameModelBackend(object):
        def authenticate(self, username=None, password=None):
            if '@' in username:
                kwargs = {'email': username}
            else:
                kwargs = {'username': username}
            try:
                user = User.objects.get(**kwargs)
                if user.check_password(password):
                    return user
            except User.DoesNotExist:
                return None
    
        def get_user(self, user_id):
            try:
                return User.objects.get(pk=user_id)
            except User.DoesNotExist:
                return None

    然后在settings.py中添加如下代码:

    # 该字段指定了默认的验证后台,从上到下顺序验证,如果上面验证不成功就验证下面的
    AUTHENTICATION_BACKENDS = (
        'myapp.backends.EmailOrUsernameModelBackend',   # 自定义的认证后台
        'django.contrib.auth.backends.ModelBackend',    # 这是默认的认证后台
    )

    这样,就可以依然使用刚才的代码对用户登录进行验证了。

    退出登录

    from django.contrib.auth import logout
    
    def logout_view(request):
        logout(request)

    限制登录用户访问路由

    某些路由只能登录用户才能访问,那么只需要添加这个装饰器:

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def my_view(request):
        ......



沪ICP备19023445号-2号
友情链接