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

后台逻辑代码都是编写在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. [洛谷P1951]收费站_NOI导刊2009提高(2)

    题目大意:有一张$n$个点$m$条边的图,每个点有一个权值$w_i$,有边权,询问从$S$到$T$的路径中,边权和小于$s$,且$\max\limits_{路径经过k}\{w_i\}$最小,输出这个最 ...

  2. AtCoder Code Festival 2017 Team Relay J - Indifferent

    题目大意:共$2n$个价格$p_i$.两人轮流取.你每次取最大的,对方每次随机取.问你取的期望和是多少. 题解:从小到大排序,$\sum\limits_{i=0}^{2n-1} \frac{i*p_i ...

  3. MySQL使用笔记(三)表的操作

    By francis_hao    Dec 11,2016 表的操作 表的操作有创建表.查看表.删除表和修改表 创建表 创建表之前要在某个数据库中. mysql> create table ta ...

  4. C语言指针大杂烩

    By francis_hao Oct 31,2016 指针数组和数组指针 指针数组本身是个数组,数组的内容是指针.形如char *pa[].由于[]优先级高于*,pa先于[]结合表示pa是一个数组,p ...

  5. [SDOI2011]消防/[NOIP2007] 树网的核

    消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家最兴旺的 ...

  6. bzoj 2756 [SCOI2012]奇怪的游戏 二分+网络流

    2756:[SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4926  Solved: 1362[Submit][Stat ...

  7. 设置查看java的源程序

    1.点 “window”-> "Preferences" -> "Java" -> "Installed JRES" 2. ...

  8. hdu3294 manacher算法

    这道题哇 其实是裸的manacher 无论怎么变 是回文的就是回文 所以 特殊处理一下输出就好了 不过最后的左右端点l,r.l=(p-p[pos]+2)/2-1,r=(p+p[pos]-2)/2-1; ...

  9. 2017年上海金马五校程序设计竞赛:Problem K : Treasure Map (蛇形填数)

    Description There is a robot, its task is to bury treasures in order on a N × M grids map, and each ...

  10. [bzoj3597][scoi2014]方伯伯运椰子——分数规划,负环

    题解 目标就是 \[Maximize\ \lambda = \frac{X-Y}{k}\] 按照分数规划的一般规律, 构造: \[g(\lambda) = \lambda k + Y - X\] 由于 ...