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 ...
随机推荐
- phaser常用API总结
1. 游戏画布的尺寸 var width = game.width, height = game.height; 2. 中心点坐标 var game = new Phaser.Game(...); ...
- java的哈希遍历 hashmap
Map<String,String> map = new HashMap<String, String>(); map.put("title"," ...
- MySQL 配置文件及逻辑架构
配置文件: linux:/etc/my.cnf 默认配置文件:/usr/share/mysql/my-default.cnf windows:my.ini 主要日志文件: 二 ...
- [06] JavaScript 类型
下面对知识点总结: 1.类型分类 a.原始类型:number, string, boolean, null, undefined b.对象类型:除了原始类型都是(例如:object,array, fu ...
- MyEclipse中代码提醒功能
一:最近仔细研究了下spring mvc中的代码,自己在配置文件哪里来时出现问题,没有提醒,只好自己搜了下有关的信息.如下 window--->preferences---->java-- ...
- java bigdemical比较大小
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_33451004/article/details/71247041 java中对bigdimic ...
- hdu 1399 Starship Hakodate-maru (暴力搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1399 题目大意:找到满足i*i*i+j*(j+1)*(j+2)/6形式且小于等于n的最大值. #inc ...
- [转]树莓派gpio口控制
0.前言 树莓派现在越来越火,网上树莓派的资料也越来越多.树莓派源自英国,国外嵌入式开源领域具有良好的分享精神,树莓派各种集成库也层出不穷,下面推荐几个. [[开发语言]——python [[ ...
- algorithm ch6 priority queque
堆数据结构的一个重要用处就是:最为高效的优先级队列.优先级队列分为最大优先级队列和最小优先级队列,其中最大优先级队列的一个应用实在一台分时计算机上进行作业的调度.当用堆来实现优先级队列时,需要在队中的 ...
- Makefile之大型工程项目子目录Makefile的一种通用写法【转】
转自:http://www.cnblogs.com/skyofbitbit/p/3680753.html 管理Linux环境下的C/C++大型项目,如果有一个智能的Build System会起到事半功 ...