Django——auth

一、auth组件介绍

可以实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,内置了强大的用户认证系统--auth,它其实就是一个app

二、内置属性方法

注意:在用属性方法前,必须进行数据库迁移,两条命令

1. authenticate用户认证

settings.py  基本路径配置好

urls.py注意每次配好路由

login.html

ps : {% csrf_token %} 用上它不用注释csrf那个中间件了
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>用户名:<input type="text" name="name"></p>
    <p>密码:<input type="password" name="password"></p>
    <p><input type="submit" value="提交"></p>
</form>

</body>
</html>

views.py

from django.shortcuts import render, HttpResponse, redirect

#from django.contrib.auth.models import User
from django.contrib import auth
def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    else:
        name=request.POST.get('name')
        password=request.POST.get('password') # 明文
        ## 方案行不通,密码是密文的,永远匹配不成功
        # user=User.objects.filter(username=name,password=password)
        ## 使用此方案,有两个注意点
        ## 第一个参数必须是request对象
        ##必须用username和password不能用其他名,看源码
        user=auth.authenticate(request,username=name,password=password)
        if user:
            return HttpResponse('登录成功')
        else:
            return HttpResponse('用户名或密码错误')

2.login

# 调用auth后,表示用户登录了
# 1 存了session
# 2 以后所有的视图函数,都可以使用request.user,它就是当前登录用户
auth.login(request,user)

代码:

urls.py略

order.html   这里只是测试下

<body>
{{ request.user.username }}的订单页面,买了好多东西
</body>

index.html

<body>
{{ request.user.username }}登录了
</body>

views.py

from django.shortcuts import render, HttpResponse, redirect
from django.contrib.auth.models import User

# 不管是否登录,都能访问
def index(request):    return render(request, 'index.html')
def order(request):   print(request.user)
    return render(request, 'order.html')

##  用户登录成功后存session
from django.contrib import auth

def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    else:
        name=request.POST.get('name')
        password=request.POST.get('password') # 明文
        ## 此方案行不通,密码是密文的,永远匹配不成功
        # user=User.objects.filter(username=name,password=password)
        ## 使用此方案
        ## 第一个参数必须是request对象
        ##username和password
        user=auth.authenticate(request,username=name,password=password)
        if user:
            # 调用auth,表示用户登录了
            # 1 存了session
            # 2 以后所有的视图函数,都可以使用request.user
            auth.login(request,user)       return HttpResponse('登录成功')
        else:
            return HttpResponse('用户名或密码错误')

3.logout

urls.py略

views.py

def logout(request):
    # 后续再访问视图函数,就没有当前登录用户了request.user(匿名用户AnonymousUser)
    auth.logout(request)
    return redirect('/index/')

oeder.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>订单页面</title>
</head>
<body>
{{ request.user.username }}的订单页面,买了好多东西
<br>
<hr>
<a href="/logout/">点我退出</a>
</body>
</html>

4.is_authenticated

# is_authenticated 返回True或者False,判断用户是否登录

# 用在视图中views.py
if request.user.is_authenticated:
    print('用户登录了')
else:
    print('用户没有登录,匿名用户')

# 用在模板中index.html
{% if request.user.is_authenticated %}
{{ request.user.username }} 登录了
    {% else %}
    <a href="/login/">滚去登录</a>
{% endif %}

5.login_requierd

1 它是个装饰器, 装饰在视图函数上,只要没有登录,就进不来
# 必须登录后才能访问
@login_required(login_url='/login/')  #意思是如果没有登录就重定向到/login/

代码:

from django.shortcuts import render, HttpResponse, redirect
from django.contrib import auth
from django.contrib.auth.decorators import login_required

def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    else:
        name=request.POST.get('name')
        password=request.POST.get('password') # 明文
        ## 方案行不通,密码是密文的,永远匹配不成功
        # user=User.objects.filter(username=name,password=password)
        ## 使用此方案
        ## 第一个参数必须是request对象
        ##username和password
        user=auth.authenticate(request,username=name,password=password)
        if user:
            # 调用auth,表示用户登录了
            # 1 存了session
            # 2 以后所有的视图函数,都可以使用request.user
            auth.login(request,user)
            url=request.GET.get('next')
            if url:
                return redirect(url)
            else:
                return redirect('/index/')
        else:
            return HttpResponse('用户名或密码错误')

# 必须登录后才能访问
@login_required(login_url='/login/')
def order(request):
    print(request.user)  # 如何实现的?
    print(request.user.username)  # AnonymousUser

    if request.user.is_authenticated:
        print('用户登录了')
    else:
        print('用户没有登录,匿名用户')

    return render(request, 'order.html')

6.create_user

# 使用内置的create_user或者create_superuser方法 superuser权限跟user不同
user=User.objects.create_user(username=name,password=password)
# user=User.objects.create_superuser(username=name,password=password)

代码:

views.py

from django.contrib.auth.models import User

def register(request):
    if request.method == 'GET':
        return render(request, 'register.html')
    else:
        name = request.POST.get('name')
        password = request.POST.get('password')
        # 注册用户(有问题,密码是明文)
        # user=User.objects.create(username=name,password=password)
        # print(user)

        # 使用内置的create_user或者create_superuser方法
        user = User.objects.create_user(username=name, password=password)
        # user=User.objects.create_superuser(username=name,password=password)
        return redirect('/login/')

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>用户名:<input type="text" name="name"></p>
    <p>密码:<input type="password" name="password"></p>
    <p>确认密码:<input type="password" name="re_password"></p>
    <p><input type="submit" value="提交"></p>
</form>
</body>
</html>

7.check_password 校验密码

## 有了用户,校验密码是否正确
# 先获取到用户对象
user = User.objects.filter(username=name).first()
# 判断密码是否正确
flag=user.check_password(password)

代码:

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        name = request.POST.get('name')
        password = request.POST.get('password')  # 明文
        # 先获取到用户对象
        user = User.objects.filter(username=name).first()
        # 判断密码是否正确
        flag = user.check_password(password)

        if flag:
            auth.login(request, user)
            url = request.GET.get('next')
            if url:
                return redirect(url)
            else:
                return redirect('/index/')
        else:
            return HttpResponse('用户名或密码错误')

8.set_password 修改密码

views.py

from django.contrib.auth.models import User
def change_password(request):
    if request.method == 'GET':
        return render(request, 'change_pwd.html')
    else:
        old_pwd = request.POST.get('old_pwd')
        new_pwd = request.POST.get('new_pwd')
        re_new_pwd = request.POST.get('re_new_pwd')#注意要核验,不然出bug
        if request.user.check_password(old_pwd):
            # 密码正确再修改
            request.user.set_password(new_pwd)
            # 一定要记住保存(****)
            request.user.save()
            return redirect('/login/')
        else:
            return HttpResponse('原来密码错误')

index.html

<body>

{% if request.user.is_authenticated %}
    {{ request.user.username }} 登录了
    <br>
    <a href="/change_pwd/">修改密码</a>
{% else %}
    <a href="/login/">滚去登录</a>
{% endif %}

</body>

change_pwd.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>修改密码</title>
</head>
<body>
<form action="" method="post">
        {% csrf_token %}
    <p>原密码:<input type="password" name="old_pwd"></p>
    <p>新密码:<input type="password" name="new_pwd"></p>
    <p>确认密码:<input type="password" name="re_new_pwd"></p>
    <p><input type="submit" value="提交"></p>
</form>
</body>
</html>
(0)

相关推荐

  • python测试开发django-106.form表单中局部钩子(clean_)和全局钩子校验

    前言 在实际开发中,不仅仅是对输入框字符的格式校验,比如注册功能,注册账号还得校验数据库是否已经有账号被注册过了. 有些场景不仅仅是对单个输入框的字符校验,比如修改密码的时候,会涉及2个输入框的数据格 ...

  • python测试开发django-25.表单提交之post注册案例

    前言 一个网站上新用户注册,会写个注册页面,如果用django写个注册页面的流程呢? 本篇以post请求示例,从html页面上输入用户注册信息,提交到后台处理数据,然后传参数据到User数据库表里面 ...

  • python测试开发django-102.验证时form表单error_messages

    前言 form表单验证前端输入内容是否合法时,可以定义error_messages参数,用于前端页面展示错误信息 error_messages参数 LoginForm 表单添加 常用的error_me ...

  • 用 Python 撸一个 Web 服务器-第8章:用户管理

    用户登录原理 用户登录与注册功能几乎已成为 Web 应用的标配.所以我们有必要给 Todo List 程序增加一个用户管理模块,以此来学习用户登录原理. HTTP 协议是无状态的,这意味着每个完整的 ...

  • python测试开发django-26.表单提交之post登录案例

    前言 注册和登录功能实现都是post请求接口,只不过注册是往数据库插入数据,登录是从数据库里面查询数据. 本篇接着上一篇写个简单的登录页面请求,用户注册时密码加密存储,用户登录时候对输入的密码校验. ...

  • python测试开发django-42.auth模块登陆认证

    前言 在开发一个网站时,经常会用到用户的注册和登陆相关的账号管理功能,auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. 像用户注册.用户登录.用户认证.注销 ...

  • python测试开发django-43.session机制(登录/注销)

    前言 当我们登录访问一个网站时,服务器需要识别到你已经登录了,才有相应的权限访问登录之后的页面.用户退出登录后,将无权限访问再访问登录后的页面. 从登录到退出的一整个流程,可以看成是与服务器的一次会话 ...

  • python测试开发django-74.auth认证之is_active

    前言 在 django 的 User 表里面有个 is_active 字段可以判断用户是否是激活状态. 使用 authenticate 校验登录的时候 is_active 是不生效的. authent ...

  • ImportError: cannot import name 'login' from 'django.contrib.auth.views'

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/ImportError: cannot import name 'login' from 'django.contrib.auth.views' ...

  • Flask VS Django选择哪个好?优缺点对比!

    flask和Django是Python爆火的框架,用途广.功能多.优势突出,深受大家的喜欢.那么flask对比Django框架,哪种更好呢?我想大家都有这样的疑问,通过这篇文章为大家讲解一下. 什么是 ...

  • Django的开发流程与数据库设计

    引言:项目开发流程: 需求分析(成员:架构师 .产品经理 .开发者组长) 在跟客户谈需求之前,会大致先了解客户的需求,然后自己先设计一套比较好写的方案.跟客户沟通交流中引导客户往我们之前想好的方案上面 ...

  • Django Full Coverage(飞速入门)

    Django(个人推荐, 如果项目较大 需要协同开发, 建议使用django这种重量级框架, 如果类似于纯api的后端应用建议使用 flask, 轻量小巧 , 麻雀虽小五脏俱全) 1.Django是什 ...

  • Python 里最强的Web框架,早就不是Django和Flask了

    Python 里最强的Web框架,早就不是Django和Flask了

  • 我来记笔记啦-Django开发流程与配置

    目录 1.Django介绍 1.2 MVC模式说明 1.3 Django的MVT 1.4 Django配置顺序 1. 创建Django项目 2.创建Django子应用 3. 注册安装子应用 4. 使用 ...

  • vue django部署

    部署前的准备 在开发完django后端接口和vue前端页面之后,我们的代码并不能直接放到远程服务器上去部署,需要一些准备,下面是在项目已经在本地对好接口,可以运行的情况下的部署准备操作 前端vue项目 ...

  • 干货|vue-element-admin和Django简单整合

    前言 笔者是一个python script guy开发者-----俗称'二把刀开发者',平常大部分时间写的都是poc.脚本和工具类应用,很少写整站项目.如果你是一个前端工程师和资深开发工程师,请忽略本 ...

  • 使用AJAX获取Django后端数据

    使用Django服务网页时,只要用户执行导致页面更改的操作,即使该更改仅影响页面的一小部分,它都会将完整的HTML模板传递给浏览器.但是如果我们只想更新页面的一部分,则不必完全重新渲染页面-这时候就要 ...