今天开始,我们需要来写后台逻辑了....

后台逻辑代码都是编写在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天:用户登录的更多相关文章

  1. [Django实战] 第4篇 - 用户认证(用户登录)

    今天来实现用户登录模块 首先,我们创建一个表单(forms.py): from django import forms from django.contrib.auth.models import U ...

  2. [Django实战] 第3篇 - 用户认证(初始配置)

    当大家打开一个网站时,第一步做什么?大部分一定是先登录吧,所以我们就从用户认证开始. 打开用户认证 Django本身已经提供了用户认证模块,使用它可以大大简化用户认证模块的开发,默认情况下,用户认证模 ...

  3. 潭州课堂25班:Ph201805201 django 项目 第十七课 用户登录,登出实现 (课堂笔记)

    登录,校验: 1,判断用户名输入是否为空, 2,判断用户名密码是否匹配, 3,记住我的功能,:将用户信息记到 session 中 请求方式: POST 在视图中: # 1,创建类# 2,获取前台参数# ...

  4. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-10.Springboot2.x用户登录拦截器开发实战

    笔记 10.Springboot2.x用户登录拦截器开发实战     简介:实战开发用户登录拦截器拦截器 LoginInterceptor                  1.实现接口 LoginI ...

  5. [Django实战] 第5篇 - 用户认证(修改密码)

    上一篇我们实现了用户认证系统的登录模块,这一篇实现修改密码模块. 同样地,我们首先得给修改密码创建表单(forms.py): class ChangepwdForm(forms.Form): oldp ...

  6. 「Django」rest_framework学习系列-用户登录

    用户POST登录-->后台验证用户名密码-->验证正确返回TOKEN-->验证错误返回错误信息 class UserAPI(APIView): #用户登录类 def post(sel ...

  7. django使用session来保存用户登录状态

    先建好登录用的model,其次理解使用cookie和session的原理,一个在本机保存,一个在服务器保存 使用session好处,可以设置登录过期的时间, 编写views中login的函数 def ...

  8. python框架Django实战商城项目之用户模块创建

    创建用户APP 整个项目会存在多个应用,需要存放在一个单独的文件包了,所以新建一个apps目录,管理所有子应用. 在apps包目录下穿件users应用 python ../../manage.py s ...

  9. Django学习路13_创建用户登录,判断数据库中账号名密码是否正确

    在 models.py 中设置数据库表的信息 from django.db import models # Create your models here. class User(models.Mod ...

  10. Django Redis配合Mysql验证用户登录

    1.redis_check.py # coding:utf-8 import pymysql import redis import sys def con_mysql(sql): db = pymy ...

随机推荐

  1. HDU 1394 Minimum Inversion Number(树状数组/归并排序实现

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  2. WebOS系列-了解Wekbit【邓侃】

    注:[转载请注明文章来源.保持原样] 出处:http://www.cnblogs.com/jyli/archive/2010/02/02/1660634.html  作者:李嘉昱 这是Kan老大的We ...

  3. windows下maven打包eclipse工程

    打包过程中,可能出现的2个问题: ①.[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build ...

  4. Spring任务调度<task:scheduled-tasks>【含cron参数详解】 (转载)

    Spring内部有一个task是Spring自带的一个设定时间自动任务调度 task使用的时候很方便,但是他能做的东西不如quartz那么的多! 可以使用注解和配置两种方式,配置的方式如下 引入Spr ...

  5. Dokuwiki 二次开发记录

    Dokuwiki 二次开发记录 [转]http://www.syyong.com/other/Dokuwiki-Secondary-Development-Record.html DokuWiki 是 ...

  6. 51nod K 汽油补给 大根堆+小根堆....

    题目传送门 用优先队列瞎搞... 想着在每个地方 先算上一个点到这一个点要花费多少钱 这个用小根堆算就好 然后在这个地方加油 把油钱比自己多的替代掉 这个用大根堆维护一下 然后两个堆之间信息要保持互通 ...

  7. django原生sql

    参考:http://www.jb51.net/article/128257.htm coding=utf-8 from django.core.paginator import Paginator d ...

  8. [Leetcode Week2]Merge Intervals

    Merge Intervals题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/merge-intervals/description/ Descript ...

  9. linux USB HOST之EHCI和OHCI【转】

    转自:http://blog.csdn.net/ljzcom/article/details/8186914 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 2 关键数据结 ...

  10. React 踩坑记录

    1.React-router error: super expression must either be null or a function 原因:引入babel后写ES6风格的代码: class ...