Django2.0——实现简易登陆、注册
思路:
实现简易的登陆、注册,我们至少需要三个HTML页面,一个主页面、一个登陆界面、一个注册界面。为了存储和校验用户的账号和密码,我们需要写一个模型类(用于映射到数据库)、两个form类(一个登陆、一个注册,用户校验前端传来的数据是否合法)、视图函数、url配置。出于安全考虑,我们还要将密码进行加密再存储到数据库,这里用的hash加密,django已封装好了这个库,位于django.contrib.auth.hashers中的make_password方法,还有个check_password方法用于检验加密前后的密码是否属于同一个。
模板代码如下:
主页模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>家目录</title>
<style>
* {
padding: 0;
margin: 0;
}
</style>
</head>
<body>
你好 {{ username }} <br>
<a href = {% url 'baidu1_login' %} >登陆</a>
<a href = {% url 'baidu1_register' %}>注册</a>
<a href = {% url 'baidu1_loginout' %}>退出</a>
</body>
</html>
注册模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
<style>
div img{
display:inline-block;
width:130px;
height:80px;
vertical-align: 0px;
}
div p{
display: inline-block;
width:130px;
height:80px;
margin-left: 10px;
text-align:center;
line-height:50px;
vertical-align:33px;
}
input{
display: inline-block;
width:300px;
height:30px;
}
.four{
width:300px;
}
.yan{
width:181px;
height:36px;
}
#o666{
width:10px;
height:10px;
}
label{
font-size:12px;
vertical-align:1px;
}
.zhuce{
display:inline-block;
margin-left: 55px;
background-color:blue;
color:white;
padding:0px;
border-width:0px;
height:46px;
}
</style>
</head>
<body>
<div>
<img src="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=3572347546,3948256807&fm=27&gp=0.jpg" alt="logo">
<p>注册百度账号</p>
</div>
<form action = "" method = "post">
{% csrf_token %}
<p>用户名 <input type = "text" name = "username" placeholder="请设置用户名" ><span style ="color:red">{{ userform.username.errors.0 }}</span></p>
<p>密 码 <input type="password" name = "password" placeholder="请设置登陆密码" /><span style ="color:red">{{ userform.password.errors.0 }}</span></p>
<p>邮 箱 <input type = "text" name = 'email' placeholder="请输入邮箱" class = "four"/> <span style ="color:red">{{ userform.email.errors.0 }}</span>
<p>
<input type = "checkbox" id = "o666">
<label for="o666">阅读并接受《百度用户协议》及《百度隐私权保护声明》</label>
</p>
<p>
<input type = "submit" value = "注册" class = "zhuce">
</p>
</form>
</body>
</html>
登陆模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆</title>
<style>
div img{
display:inline-block;
width:130px;
height:80px;
/*border: solid 5px red;*/
vertical-align: 0px;
}
div p{
/*border: solid 5px red;*/
display: inline-block;
width:130px;
height:80px;
margin-left: 10px;
/*padding-left:20px;*/
/*padding-top:20px;*/
text-align:center;
line-height:50px;
vertical-align:33px;
/*vertical-align: super;*/
}
input{
display: inline-block;
width:300px;
height:30px;
}
.four{
width:300px;
}
.yan{
width:181px;
height:36px;
}
#o666{
width:10px;
height:10px;
}
label{
font-size:12px;
vertical-align:1px;
}
.zhuce{
display:inline-block;
margin-left: 55px;
background-color:blue;
color:white;
padding:0px;
border-width:0px;
height:46px;
}
</style>
</head>
<body>
<div>
<img src="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=3572347546,3948256807&fm=27&gp=0.jpg" alt="logo">
<p>登陆百度账号</p>
</div>
<form action = "" method = "post">
{% csrf_token %}
<p>用户名 <input type = "text" name = "username" placeholder="请设置用户名" /></p>
<p>密 码 <input type="password" name = "password" placeholder="请设置登陆密码" /></p>
<p>
<input type = "submit" value = "登陆" class = "zhuce">
</p>
</form>
</body>
</html>
app名为baidu,子路由分配如下:
from django.urls import path
from .import views
urlpatterns = [
path('home/',views.home,name = 'baidu1_home'),
path('login/',views.login,name = 'baidu1_login'),
path('register/',views.register,name = 'baidu1_register'),
path('loginout/',views.loginout,name = "baidu1_loginout"),
]
主路由分配:
path('baidu1/',include('baidu1.urls'))
模型类如下:
from django.db import models
# Create your models here.
class baidu_User(models.Model):
user_name = models.CharField(max_length=15,null=False,unique=True)
password = models.CharField(max_length=200)
email = models.EmailField()
form类如下:
from django import forms
class Register_form(forms.Form):
username = forms.CharField(required=True,min_length=6,max_length=15,error_messages={
'min_length':'用户名长度不能低于6',
'max_length':'用户名长度不能大于15',
'require':'用户名不能空',
})
password = forms.CharField(min_length=6,required=True,error_messages={
'min_length':'密码长度不能低于6',
'require':'密码不能空',
})
email = forms.EmailField()
class Login_form(forms.Form):
username = forms.CharField(required=True, min_length=6, max_length=15, error_messages={
'min_length': '用户名长度不能低于6',
'max_length': '用户名长度不能大于15',
'require': '用户名不能空',
})
password = forms.CharField(min_length=6, max_length=30, required=True, error_messages={
'min_length': '密码长度不能低于6',
'require': '密码不能空',
})
视图函数如下:
from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse
# -*- coding:utf-8 -*-
# Create your views here.
from .form import Register_form,Login_form
from .models import baidu_User
from django.contrib.auth.hashers import make_password,check_password
def home(request):
username = request.session.get('username','游客') #默认是游客
return render(request,'baidu1/home.html',context={
'username':username,
})
def login(request):
if request.method == "GET":
return render(request,'baidu1/login.html')
elif request.method == 'POST':
User_form = Login_form(request.POST)
if User_form.is_valid():
username = User_form.cleaned_data.get('username')
password = User_form.cleaned_data.get('password')
user = baidu_User.objects.filter(user_name=username)
if user:
if (check_password(password,user[0].password)): #验证密码的正确性
request.session['username'] = username #服务端返回一个sessionid给客户端
return render(request,'baidu1/home.html',context={
'username':username
})
else:
return redirect(reverse('baidu1_login'))
else:
return render(request, reverse('baidu1_login'), context={
'userform': User_form,
})
else:
return HttpResponse("error")
def register(request):
if request.method == 'GET':
return render(request,'baidu1/register.html')
elif request.method == 'POST':
User_form = Register_form(request.POST)
if User_form.is_valid():
username = User_form.cleaned_data.get('username')
password = User_form.cleaned_data.get('password')
password = make_password(password) #密码加密
email = User_form.cleaned_data.get('email')
user =baidu_User(user_name = username,password = password,email = email)
user.save() #保存到数据库
return HttpResponse("注册成功")
else:
return render(request,'baidu1/register.html',context={
'userform':User_form,
})
else:
return HttpResponse('ERROR')
def loginout(request):
request.session.flush() #清除当前会话,即退出当前用户
return redirect(reverse('baidu1_home'))
效果如下:

点击注册,输入用户名223,密码123,发现界面提示数据不合法。

再次输入合法的数据,即可成功进行注册。

打开数据库,可以发现密码已被加密。

进入登陆界面进行登陆

登陆后界面如下,此时用户名已改变。

打开存储在本地的cookies,发现服务端发来了一个sessionid。

Django2.0——实现简易登陆、注册的更多相关文章
- SourceTree 3.0.8 跳过登陆注册
3.0.8普通用户版account.json跳过登陆注册方法已失效,请安装企业版 https://www.sourcetreeapp.com/enterprise 企业版默认安装在 %programf ...
- Django2.0路由层-URLconf
目录 DJango2.0路由层-URLconf 概述 urlpatterns 实例 path转换器 自定义path转换器 使用正则表达式 命名组(有名分组) URLconf匹配请求URL中的哪些部分 ...
- Android通过Http连接MySQL 实现登陆/注册(数据库+服务器+客户端)
写在最前: 在实际开发中,相信每个项目都会有用户登陆注册功能,这个实现的方法很多,下面是我实现的方法,供大家交流. 新人发帖,万分紧张,怎么样才能装作一副经常发帖的样子不被别人看出来呢-,- ? 好了 ...
- PHP数据库登陆注册简单做法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 用户登陆注册【JDBC版】
前言 在讲解Web开发模式的时候,曾经写过XML版的用户登陆注册案例!现在在原有的项目上,使用数据库版来完成用户的登陆注册!如果不了解的朋友,可以看看我Web开发模式的博文! 本来使用的是XML文件作 ...
- 《java入门第一季》模拟用户登陆注册案例集合版
需求:校验用户名和密码,登陆成功后玩猜数字小游戏. 在这里先写集合版.后面还有IO版.数据库版. 一.猜数字小游戏类: 猜数字小游戏的代码见博客:http://blog.csdn.net/qq_320 ...
- Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(1)
1.开发环境配置 Windows7 64位旗舰版 python3.6 node.js mysql navicat pycharm webstorm或vscode 2.项目初始化 新版的pycharm很 ...
- 三篇文章带你极速入门php(三)之php原生实现登陆注册
看下成果 ps:纯天然h5,绝不添加任何添加剂(css)以及化学成分(js)(<( ̄ ﹌  ̄)我就是喜欢纯天然,不接受任何反驳) 关于本文 用原生的php和html做了一个登陆注册,大概是可以窥 ...
- Django2.0 path和re_path使用
Django2.0发布后,很多人都拥抱变化,加入了2的行列.但是和1.11相比,2.0在url的使用方面发生了很大的变化,下面介绍一下: 一.实例 先看一个例子: from django.urls i ...
随机推荐
- 《ES6标准入门》(阮一峰)--11.对象的新增方法
1.Object.is() ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===).它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0.J ...
- 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包
将项目复制到其地方的时候编译会报错,按照官网方法也不行,从网上查了一个有用的方法如下 打开CSPROJ文件.删除如下代码, <Import Project="..\packages\ ...
- Node.js 发送Email
章节 Node.js 介绍 Node.js 入门 Node.js 模块 Node.js HTTP模块 Node.js 文件系统模块 Node.js URL模块 Node.js NPM Node.js ...
- 【Python】【Django】查询所有学生信息
要做到以下效果: 改代码后效果: 从0开始顺序计数: 倒叙计数到0
- UVA - 1605 Building for UN (联合国大楼)
题意:一个联合国大楼每层都有数量相等大小相同的格子,将其分配给n个国家,使任意两个不同的国家都相邻(同层有公共边或相邻层的同一个格子). 分析:可以设计一个只有两层的大楼,第一层每个国家占一行,第二层 ...
- ES6 - 装饰器 - Decorater
注意,修饰器对类的行为的改变,是代码编译时发生的,而不是在运行时.这意味着,修饰器能在编译阶段运行代码.也就是说,修饰器本质就是编译时执行的函数. 修饰器是一个对类进行处理的函数.修饰器函 ...
- python阴阳鱼绘制(使用turtle)
from turtle import * def draw(radius ,color1 , color2): #设置画笔的大小 width(3) #设置画笔颜色和填充颜色 color("b ...
- SpringBoot 系列教程之编程式事务使用姿势介绍篇
SpringBoot 系列教程之编程式事务使用姿势介绍篇 前面介绍的几篇事务的博文,主要是利用@Transactional注解的声明式使用姿势,其好处在于使用简单,侵入性低,可辨识性高(一看就知道使用 ...
- Element.scrollIntoView() 和 document.elementFromPoint ()
Element.scrollIntoView() 让当前的元素滚动到浏览器窗口的可视区域内 element.scrollIntoView(); // 等同于element.scrollIntoV ...
- 解决fixed布局里内容不滚动问题
//注意给父级加上 (1)横向滚动 left:0; right:0; 然后想要横向滚动的话 overflow-x:scroll; overflow-y:hidden; (2)竖直方向滚动top:0;b ...