6、Django实战第6天:用户登录
今天开始,我们需要来写后台逻辑了....
后台逻辑代码都是编写在views.py文件里面,今天要完成的登录功能,因此来编辑users.views.py
这里我们根据请求方法来判断分为2种情况,网页默认请求是的GET方法,当请求login函数(调用登录页面)方法为GET的时候(比如:访问login页面),则返回login的html页面
from django.shortcuts import render def login(request):
if request.method == 'POST':
pass
elif request.method == 'GET':
return render(request, 'login.html', {})
现在登录页面已经要走后台逻辑了,所以我们需要修改login的url配置
...
from users.views import login urlpatterns = [
#url(r'^admin/', admin.site.urls),
url(r'^xadmin/', xadmin.site.urls),
url(r'^$', TemplateView.as_view(template_name='index.html'), name='index'),
url(r'^login/$', login, name='login'),
]
修改完成后,访问登录页面127.0.0.1:8000/login也是正常的
现在来关注POST方法,首先编辑login.html文件
在users.views.py中打上断点

然后开启Debug,访问登录页面127.0.0.1:8000/login,填写账号,密码,点击登录

点击登录后,我们回到编辑器查看断点, 可以看到post已经获取到数据(账号,密码)

获取到数据之后,我们就需要把它们提取出来,编辑users.views.py
from django.shortcuts import render def login(request):
if request.method == 'POST':
user_name = request.POST.get('username', '') #第一个参数是表单input的名字,
pass_word = request.POST.get('password', '') #第二个参数表示没取到则为空值
elif request.method == 'GET':
return render(request, 'login.html', {})
当我们获取到用户名和密码之后,就需要去验证是否合法,我们这里需要用到Django提供的auth方法
from django.shortcuts import render
from django.contrib.auth import authenticate, login def user_login(request): #因为我们上面导入了login,为了避免名字冲突,我们这里改用user_login
if request.method == 'POST':
user_name = request.POST.get('username', '')
pass_word = request.POST.get('password', '')
user = authenticate(username=user_name, password=pass_word) #对比数据表的账号密码
if user is not None: #如果user不为空,则验证通过
login(request, user) #使用login模块进行登录
return render(request, 'index.html') #返回登录状态的首页(在首页做判断,登录前和登陆后显示不一样)
else:
return render(request, 'login.html', {}) #如果验证不通过则返回登录页面
elif request.method == 'GET':
return render(request, 'login.html', {})
上面我们把login函数名改成了user_login, 因为url那里也要改
import xadmin
from django.views.generic import TemplateView
from users.views import user_login urlpatterns = [
#url(r'^admin/', admin.site.urls),
url(r'^xadmin/', xadmin.site.urls),
url(r'^$', TemplateView.as_view(template_name='index.html'), name='index'),
url(r'^login/$', user_login, name='login'),
]
修改index.html做一个判断,登录前和登录后是不同的显示



现在,我们可以用之前创建的超级用户admin(admin123456)去登录,会成功跳转到登录后的首页,如果输入错误的账号或密码则是调到登录页面。因为现在还没有做退出登录操作,因为要想退出登录,可以先进去xadmin后台管理系统,然后注销就可以了
到此,我们完成了以用户名的形式登录,如果想邮箱和用户名都可以登录,这里Django提供了一种方法,可以让我们自定义auth方法
编辑users.views.py,定义CustomBackend类继承ModelBackend重载authenticate方法
from django.contrib.auth.backends import ModelBackend from .models import UserProfile class CustomBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(username=username) #判断用户名
if user.check_password(password): #检查明文密码
return user
except Exception as e:
return None
还需要在settings.py中重载AUTHENTICATION_BACKENDS变量
# Application definition
AUTHENTICATION_BACKENDS = (
'users.views.CustomBackend',
)
这样就完成了我们自定义的authenticate方法,以后user_login里面就会调用我们自己定义的authenticate方法
当我们需要用用户名和邮箱都可以登录验证的时候,可以这样做
from django.db.models import Q #导入Q,可以使用并集查询 from .models import UserProfile class CustomBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(Q(username=username) | Q(email=username)) #判断用户名
if user.check_password(password): #检查明文密码
return user
except Exception as e:
return None
现在我们用heboan@qq.com登录也可以登录成功了
最后,当我们验证失败的时候,给用户提示信息(返回的时候,返回一个msg模板变量)
def user_login(request): #因为我们上面导入了login,为了避免名字冲突,我们这里改用user_login
if request.method == 'POST':
user_name = request.POST.get('username', '')
pass_word = request.POST.get('password', '')
user = authenticate(username=user_name, password=pass_word) #对比数据表的账号密码
if user is not None: #如果user不为空,则验证通过
login(request, user) #使用login模块进行登录
return render(request, 'index.html') #返回登录状态的首页(在首页做判断,登录前和登陆后显示不一样)
else:
return render(request, 'login.html', {'msg': '用户名或密码错误'}) #如果验证不通过则返回登录页面
elif request.method == 'GET':
return render(request, 'login.html', {})
修改下login.html


上面我们做的登录是基于函数,现在我们基于类来做,因为基于类的方法会给我们带来很多方便
编辑users,views.py
...
from django.views.generic.base import View class LoginView(View):
def get(self, request):
return render(request, 'login.html', {}) def post(self, request):
user_name = request.POST.get('username', '')
pass_word = request.POST.get('password', '')
user = authenticate(username=user_name, password=pass_word)
if user is not None:
login(request, user)
return render(request, 'index.html')
else:
return render(request, 'login.html', {'msg': '用户名或密码错误'})
相应的,url那边也要做修改
...
from users.views import LoginView urlpatterns = [
#url(r'^admin/', admin.site.urls),
url(r'^xadmin/', xadmin.site.urls),
url(r'^$', TemplateView.as_view(template_name='index.html'), name='index'),
url(r'^login/$', LoginView.as_view(), name='login'),
]
再次尝试登录,一切正常,这样我们可以把之前写的use_login删掉,完整的代码如下
from django.shortcuts import render
from django.contrib.auth import authenticate, login
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q #导入Q,可以使用并集查询
from django.views.generic.base import View from .models import UserProfile class CustomBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(Q(username=username) | Q(email=username)) #判断用户名
if user.check_password(password): #检查明文密码
return user
except Exception as e:
return None class LoginView(View):
def get(self, request):
return render(request, 'login.html', {}) def post(self, request):
user_name = request.POST.get('username', '')
pass_word = request.POST.get('password', '')
user = authenticate(username=user_name, password=pass_word)
if user is not None:
login(request, user)
return render(request, 'index.html')
else:
return render(request, 'login.html', {'msg': '用户名或密码错误'})
6、Django实战第6天:用户登录的更多相关文章
- [Django实战] 第4篇 - 用户认证(用户登录)
今天来实现用户登录模块 首先,我们创建一个表单(forms.py): from django import forms from django.contrib.auth.models import U ...
- [Django实战] 第3篇 - 用户认证(初始配置)
当大家打开一个网站时,第一步做什么?大部分一定是先登录吧,所以我们就从用户认证开始. 打开用户认证 Django本身已经提供了用户认证模块,使用它可以大大简化用户认证模块的开发,默认情况下,用户认证模 ...
- 潭州课堂25班:Ph201805201 django 项目 第十七课 用户登录,登出实现 (课堂笔记)
登录,校验: 1,判断用户名输入是否为空, 2,判断用户名密码是否匹配, 3,记住我的功能,:将用户信息记到 session 中 请求方式: POST 在视图中: # 1,创建类# 2,获取前台参数# ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-10.Springboot2.x用户登录拦截器开发实战
笔记 10.Springboot2.x用户登录拦截器开发实战 简介:实战开发用户登录拦截器拦截器 LoginInterceptor 1.实现接口 LoginI ...
- [Django实战] 第5篇 - 用户认证(修改密码)
上一篇我们实现了用户认证系统的登录模块,这一篇实现修改密码模块. 同样地,我们首先得给修改密码创建表单(forms.py): class ChangepwdForm(forms.Form): oldp ...
- 「Django」rest_framework学习系列-用户登录
用户POST登录-->后台验证用户名密码-->验证正确返回TOKEN-->验证错误返回错误信息 class UserAPI(APIView): #用户登录类 def post(sel ...
- django使用session来保存用户登录状态
先建好登录用的model,其次理解使用cookie和session的原理,一个在本机保存,一个在服务器保存 使用session好处,可以设置登录过期的时间, 编写views中login的函数 def ...
- python框架Django实战商城项目之用户模块创建
创建用户APP 整个项目会存在多个应用,需要存放在一个单独的文件包了,所以新建一个apps目录,管理所有子应用. 在apps包目录下穿件users应用 python ../../manage.py s ...
- Django学习路13_创建用户登录,判断数据库中账号名密码是否正确
在 models.py 中设置数据库表的信息 from django.db import models # Create your models here. class User(models.Mod ...
- Django Redis配合Mysql验证用户登录
1.redis_check.py # coding:utf-8 import pymysql import redis import sys def con_mysql(sql): db = pymy ...
随机推荐
- [洛谷P2147][SDOI2008]洞穴勘测
题目大意:有$n$个洞穴,$m$条指令,指令有三种 $Connect\;u\;v$:在$u,v$之间连一条边 $Destroy\;u\;v$:切断$u,v$之间的边 $Query\;u\;v$:询问$ ...
- Visio中ShapeAdded和SelectionAdded
SelectionAdded 和 ShapeAdded 事件的相似之处在于它们都在创建形状之后触发.它们的区别在于,当单个操作添加多个形状时它们的行为方式不同.假定一个 Paste 操作创建三个新建形 ...
- 【BZOJ2134】单选错位 概率DP
一句话:有一些看似有关系的期望在把事件全面发生之后就变得相互独立了 #include<cstdio> using namespace std; ]; double ans; int mai ...
- COGS1752. [BOI2007]摩基亚Mokia CDQ
CDQ的板子题 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- 于是他错误的点名开始了 [Trie]
于是他错误的点名开始了 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已 ...
- [hihocoder 1050]求树的最长链
题目链接:http://hihocoder.com/problemset/problem/1050 两种方法: 1. 两遍dfs,第一次随便找一个根,找到距离这个根最远的点,这个点必然是最长链的一端. ...
- vue之axios使用
axios是vue-resource后出现的Vue请求数据的插件.vue更新到2.0之后,作者尤大就宣告不再对vue-resource更新,而是推荐的axios. 下面我们来使用axios npm i ...
- jquery 的相关 width 和 height 方法辨析
width() 设置或返回元素的宽度(不包括内边距.边框或外边距). height() 设置或返回元素的高度(不包括内边距.边框或外边距). innerWidth() 返回元素的宽度(包括内边距). ...
- js密码的匹配正则
匹配的密码是 数字大写或者小写的字母.符号. if(pwd.match(/[\d]/) && pwd.match(/[A-Za-z]/) && pwd.match(/[ ...
- MySql数据库学习总结(MySQL入门到精通)
2017.1.24-2.3日(在大兴实验室) 1.数据库存储引擎: (1)MyISAM: 访问速度快,对事物完整性没要求,并以访问为主的适合这个 (2)InnoDB: 更占磁盘空间,需要进行频繁的更新 ...