zoukankan      html  css  js  c++  java
  • Django组件之用户认证组件

    用户认证

    • 功能:记录用户登陆状态,必须使用django自带的auth_user表,后续需要添加字段,可以继承这一张表,也可以一对一绑定这张表

    • 创建超级用户:python3 manage.py createsuperuser

    auth模块

    from django.contrib import auth
    

    authenticate()

    用户登陆认证,传入username与password,如果验证成功则返回的是user对象,失败则返回None,当试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的

    user = authenticate(username='someone',password='somepassword')
    

    login(HttpRequest,user)

    该函数接受一个HttpRequest对象,以及一个通过认证了的User对象

    函数使用django的session框架给某个已认证的用户附加上session id等信息。可使用request.user使用该对象,并且该对象是全局变量,在模板中可以直接使用

    如果没有认证通过则调用request.user是一个匿名用户

    def login(request):
        if request.method == 'POST':
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
    
            # 用户认证接口,如果验证成功,则user对象,失败则返回None
            user = auth.authenticate(username=user,password=pwd)
            if user:
                auth.login(request,user) # request.user = user
                # request.user永远是当前登陆对象
                return redirect("/index/")
    
        return render(request,'login.html')
        
    def index(request):
    
        # 假如说没有登陆的话打印的是匿名用户
        # 登陆了打印的是当前登陆的用户信息
        print(request.user)
        print(request.user.id)
        print(request.user.is_anonymous) # 打印当前是否是匿名用户
        return render(request,'index.html')
    

    logout(request)

    注销函数,该函数接收一个HttpRequest参数,使用该参数会清空session以及session数据库中的数据

    def logout(request):
        auth.logout(request)
        return redirect('/login/')
    

    基于用户认证组件的注册功能

    User 对象属性:username, password(必填项)password用哈希算法保存到数据库

    from django.contrib.auth.models import User
    
    • User对象的is_authenticated

    如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。

    • 注册
    from django.contrib.auth.models import User
    user = User.objects.create_user(username='',password='',email='')
    
    def reg(request):
        if request.method == 'POST':
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
            # 注册普通用户
            user = User.objects.create_user(username=user,password=pwd)
            # 注册超级用户
            # user = User.objects.create_superuser(username=user,password=pwd)
            return redirect('/login/')
    
        return render(request,'reg.html')
    
    • check_password(password)

    用户需要修改密码的时候 首先要让他输入原来的密码 ,如果给定的字符串通过了密码检查,返回 True

    • 修改密码

    使用 set_password() 来修改密码

    user = User.objects.get(username='')
    user.set_password(password='')
    user.save
    

    基于用户认证组件的认证装饰器

    要求:

    • 用户登陆后才能访问某些页面,
    • 如果用户没有登录就访问该页面的话直接跳到登录页面
    • 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址

    可以直接使用django设计好装饰器:login_required()

    若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递 当前访问url的绝对路径 (登陆成功后,会重定向到该路径)

    from django.contrib.auth.decorators import login_required
    

    假设登陆后才可以访问order(不是在登陆成功后写死)

    def login(request):
        if request.method == 'POST':
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
            user = auth.authenticate(username=user,password=pwd)
            if user:
                auth.login(request,user) # request.user = user
    
                # 使用装饰器动态获取登陆后跳转的页面,如果没有获取到next值则默认跳转到index
                red_url = request.GET.get('next','/index/')
                return redirect(red_url)
    
        return render(request,'login.html')
        
    @login_required
    def order(request):
        return render(request,'order.html')
    
    
  • 相关阅读:
    [置顶] NO.4 使用预处理器进行调试
    VC用OLE方式读写Excel
    Eclipse 4.2 + Tomcat 7.x + JDK 7 搭建Java Web开发环境
    (step4.3.1) hdu 1010(Tempter of the Bone——DFS)
    linked-list-random-node
    insert-delete-getrandom-o1-duplicates-allowed
    C++中对Mysql的操作函数可以参考以下blog中的内容
    insert-delete-getrandom-o1
    kth-smallest-element-in-a-sorted-matrix
    combination-sum-iv
  • 原文地址:https://www.cnblogs.com/wualin/p/10146335.html
Copyright © 2011-2022 走看看