Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第九章:django用户认证系统 > 9.2节: 使用auth进行用户认证

9.2节: 使用auth进行用户认证

薯条老师 2020-09-29 07:23:31 232670 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

9.2.1 对用户进行认证的方法

在9.1节的内容中,使用内置的User模型对用户进行了注册。用户注册成功以后,在进行登录时需要对用户进行认证,认证通过则表明当前用户为一个合法用户。对用户的账号进行验证有以下两种方法:

(1) 将用户的输入与User模型中的字段值进行逐一比较

例如通过用户输入的账号名在User模型中获取到User对象,然后通过User对象的check_password方法来验证密码的正确性。

(2) 使用内置的auth模块

直接使用内置的auth模块来进行用户的认证。

在本节的教程中,使用第二种方法来对用户进行认证。

 9.2.2 django的auth模块

django内置的auth模块用来对用户进行认证,auth模块的主要方法:

方法名

描述

 

authenticate(request=None, **credentials)

request为一个HttpRequest对象,credentials表示传递的与用户认证相关的关键字参数,主要的关键字参数为username和password,分别表示用户名和密码。

返回值为一个User对象,如果返回的User对象为真,则表示认证通过。

login(request, user)

request为一个HttpRequest对象,user表示一个已通过认证的User对象。

执行login方法后,django会为当前用户创建登录会话。

logout(request)

request为一个HttpRequest对象,使用logout方法来注销当前用户。

9.2.3 使用auth模块进行用户认证

我们需要先在站点中提供一个供用户登录的入口,与用户的注册类似,需要定义一个用户登录的视图,以及配置登录页面的url与视图的路由。现在请读者按照以下步骤进行操作:

(1) 进入django项目中的模板目录,创建login.html文件,代码如下:

<form action="{% url 'login' %}" method = 'post'>
{% csrf_token %}
    <div>
        <input type="text" name="username" placeholder="请输入登录账号">
    </div>

    <div>
        <input type="password" name="password" placeholder="请输入登录密码">
    </div>
 
    <div>
        <input type="submit" value = "登录"/>
    </div>
    <p>{{prompt}}</p>
</form>

(2) 定义对用户的登录进行处理的视图

打开django应用目录下的views.py,定义Login视图,代码如下:

# 导出User模型
from django.contrib.auth.models import User
 
# 从auth模块中导出authenticate方法,login方法
from django.contrib.auth import authenticate, login
 
# 定义Login视图
class Login(View):
    def post(self, request):
        """
        通过查询form表单中的name,可以获取用户在表单中的输入值
        """
        
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        prompt = "用户登录成功"
        
        user = authenticate(username=username, password=password)
        
        # 判断user是否有效,如果无效则表示认证失败
        if not user:
            prompt = "用户的账号或密码无效"
        else:
            # 调用login方法来为认证通过的用户创建会话
            login(request, user)
            
        return render(request, "login.html",{"prompt": prompt})
    
    def get(self, request):
        # 如果为get请求,则直接对登录页面进行渲染
        return render(request, "login.html")

(3) 配置注册页面的url与Login视图的路由

定义注册页面的url为/login/, urls.py更新后的代码如下:

urlpatterns = [
    path('login/', blog.Login.as_view(), name="login"),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

(4) 在浏览器中进行测试

启动django服务器后,在浏览器中输入http://127.0.0.1:8080/login/:

JHWM%2ZFR0[7BQSDVN6JA1M.png

在页面中输入账号名及密码,然后点击登录。若认证成功,页面会显示用户登录成功的提示信息:

A@K7[T]$AG2E3{{$})[L142.png 

9.2.4 判断用户是否已登录

http是一种无状态协议,用户在登录页面认证通过以后,服务端需要借助于web的会话机制,将用户的登录态进行保存,当用户浏览其它的页面时,服务器通过查询会话中的用户状态信息,可以知道当前用户是否已登录。django会在视图方法中传递一个HttpRequest对象,HttpRequest对象有一个很重要的属性user,通过查询user对象的属性值可以判断用户是否已登录。

 

在User对象中与用户登录有关的属性:

属性名

描述

 

is_authenticated

布尔类型,只读的属性,表示当前用户是否已验证

is_anonymous

布尔类型,只读的属性,表示当前用户是否为匿名用户,如果为True,则用户对象的is_authenticated恒为False。

继续以Login视图为例,代码实例:

# 导出User模型
from django.contrib.auth.models import User
 
# 从auth模块中导出authenticate方法,login方法
from django.contrib.auth import authenticate, login
 
class Login(View):
    def post(self, request):
        # 先判断当前用户是否已通过认证 
        if not request.user.is_authenticated:
            pass
        else:
            prompt = "您已经登录"
    
    def get(self, request):
        # 如果为get请求,则直接对登录页面进行渲染
        return render(request, "login.html")

通过判断用户是否已登录,可以实现这样的需求:仅当用户登录以后才能访问该页面。

9.2.5 对函数视图使用@login_required

在每个视图中都对用户是否已登录进行判断,未免繁琐。django提供了一个装饰器@login_required, 使用该装饰器时,django会自动对用户是否已登录进行判断,如果用户未登录,则会跳转至登录页面。@login_required的可选参数:

属性名

描述

 

login_url

定义登录页的url,如果用户未登录,django会自动跳转至该页面

redirect_field_name

定义登录页的查询参数,默认参数为next

如果未在login_url参数中指定跳转的url,则必须在settings.py中使用全局变量LOGIN_UR来定义登录页面的url, 并将该url与特定的视图进行关联。

代码实例:

# 对点赞视图使用@login_required,用户在点赞前必须先登录
# 如果用户未登录,会跳转至/login/页面
@login_required(login_url="/login/")
def like(request):
    pass
 
未指定login_url参数的代码实例:
# 对点赞视图使用@login_required,用户在点赞前必须先登录
 
@login_required()
    def like(request):
        pass
 
# settings.py中的代码:
LOGIN_URL="/login/"

9.2.6 对类视图使用LoginRequiredMixin

如果视图为类类型,则需要借助于LoginRequiredMixin类来进行登录验证。视图类需要从LoginRequiredMixin中进行继承,继承时将其置于最左边的位置。

代码实例:

# 导出LoginRequiredMixi类型
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views import View
 
# 将LoginRequiredMixin置于继承链最左边的位置
class AnotherView(LoginRequiredMixin, View):
    # redirect_field_name与login_url属性的作用同login_required装饰器中的参数
    redirect_field_name = "the query field in url"
    login_url = "the login url"

9.2.7 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4)
Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:



欢迎 发表评论: