诚意
诚意如你,当一诚的态度对待

导航

 
from django.contrib import auth
from django.contrib.auth.models import User   (User表)

一:auth模块

1:auth相关表-用户认证的前提

Django 在认证组件里自带一个关于auth的表auth_user。

使用命令插入数据(交互式):python manage.py createsuperuser

 2:用法

1 、authenticate()   :验证用户输入的用户名和密码是否相同

提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数

如果认证信息有效,会返回一个  User  对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!

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

 

2 、login(HttpRequest, user):登录  

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

此函数使用django的session框架给某个已认证的用户附加上session id等信息。

 

3 、logout(request)  注销用户 

该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

  
    # 1:request.COOKIE.get("sessionid)   #取cookie中的值
    # 2:在Django - session表过滤session - key的记录并与删除这条记录
    # 3:删除cookie,response.delete_cookie("sessionid")
session:
    request.session.flush()   #相当于上面3个步骤

  '''
auth模块:
    auth.logout(request)  #相当于上面的那个步骤

 

4 、user对象

4.1 is_authenticated()

如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。 这个方法很重要, 在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name

 

 

要求:

 

1  用户登陆后才能访问某些页面,

 

2  如果用户没有登录就访问该页面的话直接跳到登录页面

 

3  用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址

 

方法1:

 

 

def my_view(request):
  if not request.user.is_authenticated():
    return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

 

方法2:

django已经为我们设计好了一个用于此种情况的装饰器:login_requierd()

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

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

  

4.2 、创建用户:create_user 

(我们之前插入用户对象是通过命令行,但在代码中我们怎么插入呢)

from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')

4.3 、check_password(passwd):密码检查

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

4.4 、修改密码: set_password() 

user = User.objects.get(username='')#拿到用户对象
user.set_password(password='')
user.save 

 

 

二:案例:

前提:python manage.py createsuperuser  往auth_user里添加些数据

1:登陆认证

项目--图书管理系统--第五阶段--加入cookie和session功能 基础上

url.py

    path('log/', views.log,name='log'), #auth登陆
  path('index_user/', views.index_user,name='index_user'),#auth

views.py

from django.contrib import auth

def log(request):

    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        # 获取用户名和密码
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        # 数据库查询用户是否存在
        # authenticate去auth_user查寻记录,查询成功返回用户对象,失败返回None
        user_obj=auth.authenticate(username=user,password=pwd)

        if user_obj:
            # 保存用户状态信息session,保存好后request.user(全局变量)就是当前登陆对象
            auth.login(request,user_obj)  #记录user_obj的相关信息;request.session["user"]=user_obj.pk===>request.user:当前登陆用户对象,默认是anonymousUser
            '''
            print(request.user)#当前用户默认匿名用户anonymousUser
            print(request.user.id)
            print(request.user.username) #True是否是活动用户
            '''else:
            return redirect(reverse('login'))


def index_user(request):
if request.user.id :#或者使用request.user.is_authenticated ===> True/False
        #进入到图书管理界面,分页
book_list = Book.objects.all()
paginator = Paginator(book_list, 5)
try: #如果取超过页码的页面会报错
current_page_num=request.GET.get('page',1) #如果取不到数据,就取第一页的#取值page是多少
current_page=paginator.page(current_page_num)#显示第几页数据
except EmptyPage as e:
current_page_num=1
current_page = paginator.page(1)
return render(request, 'index.html', {'current_page': current_page,'paginator':paginator,'current_page_num':int(current_page_num)})
else:
return redirect(reverse('login'))

def logout(request):
  '''
# 1:request.COOKIE.get("sessionid) #取cookie中的值
# 2:在Django - session表过滤session - key的记录并与删除这条记录
# 3:删除cookie,response.delete_cookie("sessionid")
request.session.flush() #相当于上面3个步骤
  '''
auth.logout(request) #相当于上面的那个步骤
return redirect(reverse('log'))

 2:注册

(1)前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图书管理系统登陆</title>
</head>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .aa{
            margin: 0 auto;
            margin-top: 100px;
            height: 120px;
            width: 200px;
            background-color: #4cae4c;
        }
        input{
            display: block;
        }
        .right{
            float: right;
        }
        .left{
            float: left;
        }
    </style>
<body>
    <div class="aa">
        <form action="" method="post">
            {% csrf_token %}
            用户名<input type="text" name="user">
            密 码<input type="text" name="pwd">
            <input class="right" type="submit" value="注册">
        </form>
    </div>

</body>
</html>
reg.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图书管理系统登陆</title>
</head>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .aa{
            margin: 0 auto;
            margin-top: 100px;
            height: 120px;
            width: 200px;
            background-color: #4cae4c;
        }
        input{
            display: block;
        }
        .right{
            float: right;
        }
        .left{
            float: left;
        }
    </style>
<body>
    <div class="aa">
        <form action="" method="post">
            {% csrf_token %}
            用户名<input type="text" name="user">
            密 码<input type="text" name="pwd">
            <input class="right" type="submit" value="注册">
        </form>
    </div>

</body>
</html>
login.html

 

(2)后端

urls.py

path('reg/', views.reg,name='reg'), #auth注册

 

views.py

def reg(request):
    if request.method=='GET':

        return render(request,'reg.html')
    else:
        user=request.POST.get('user')
        pwd=request.POST.get('pwd')

        from django.contrib.auth.models import User
        # User.objects.create_superuser()   #创建超级用户
        User.objects.create_user(username=user,password=pwd)          #创建普通用户
        return redirect(reverse('log'))

 

3:修改密码

(1)前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图书管理系统</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .header {
            width: 100%;
            height: 50px;
            background-color: #369;
        }
        .logout{
            display:block;
            float: right;
            margin-right: 50px;
            margin-top: 15px;
        }
        .h{
            margin-left: 46%;
            margin-top: 10px;
            float: left;
            font-size: 20px;
            color: yellow;
        }
    </style>
</head>
<body>
<div class="header">
    <div>
        <p class="h">图书管理系统</p>
        <form action="/logout/">
            <input class="logout"name="logout" type="submit"value="注销">
        </form>
        <form action="/set_password/"method="get">
            <input class="logout"name="logout" type="submit"value="修改密码">

        </form>
    </div>
</div>
<div class="container">
    <div class="row">
        <div class="col-md-2 ">
            <div class="panel panel-default">
                <div class="panel-heading"><div class="btn ">功能系统</div></div>
                <div class="panel-body">
                    <div class="btn "><a href="{% url 'books' %}">图书管理系统</a></div>
                    <div class="btn"><a href="#">作者管理系统</a></div>
                    <div class="btn"><a href="#">出版社管理系统</a></div>
                </div>
            </div>

        </div>

        <div class="col-md-10" style="padding-top: 20px">
            {% block content %}

            {% endblock %}
        </div>
    </div>
</div>
</body>
</html>
base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图书管理系统登陆</title>
</head>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .aa{
            margin: 0 auto;
            margin-top: 100px;
            height: 120px;
            width: 200px;
            background-color: #4cae4c;
        }
        input{
            display: block;
        }
        .right{
            float: right;
        }
        .left{
            float: left;
        }
    </style>
<body>
    <div class="aa">
        <form action="" method="post">
            {% csrf_token %}
            用户名<input type="text" name="user"placeholder="{{ reqest.user.username }}">
            密 码<input type="text" name="pwd">
            <input class="right" type="submit" value="修改密码">
        </form>
    </div>

</body>
</html>
set_password

 

(2)后端

urls.py

path('set_password/', views.set_password,name='set_password'), #auth修改密码

 

views.py

def set_password(request):
    if request.method=='GET':
        return render(request,'set_password.html')
    else:
        # user=request.POST.get('user')
        pwd=request.POST.get('pwd')

        user = User.objects.get(username=request.user.username)
        user.set_password(raw_password=pwd)
        user.save()
        return redirect(reverse('log'))

 

posted on 2018-11-01 01:03  诚意  阅读(172)  评论(0编辑  收藏  举报