广州番禺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/:
在页面中输入账号名及密码,然后点击登录。若认证成功,页面会显示用户登录成功的提示信息:
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学习资料: