思路:

实现简易的登陆、注册,我们至少需要三个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>用户名&nbsp;<input type = "text" name = "username" placeholder="请设置用户名" ><span style ="color:red">{{ userform.username.errors.0 }}</span></p>
<p>密&emsp;码&nbsp;<input type="password" name = "password" placeholder="请设置登陆密码" /><span style ="color:red">{{ userform.password.errors.0 }}</span></p>
<p>邮&emsp;箱&nbsp;<input type = "text" name = 'email' placeholder="请输入邮箱" class = "four"/>&nbsp;<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>用户名&nbsp;<input type = "text" name = "username" placeholder="请设置用户名" /></p>
<p>密&emsp;码&nbsp;<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——实现简易登陆、注册的更多相关文章

  1. SourceTree 3.0.8 跳过登陆注册

    3.0.8普通用户版account.json跳过登陆注册方法已失效,请安装企业版 https://www.sourcetreeapp.com/enterprise 企业版默认安装在 %programf ...

  2. Django2.0路由层-URLconf

    目录 DJango2.0路由层-URLconf 概述 urlpatterns 实例 path转换器 自定义path转换器 使用正则表达式 命名组(有名分组) URLconf匹配请求URL中的哪些部分 ...

  3. Android通过Http连接MySQL 实现登陆/注册(数据库+服务器+客户端)

    写在最前: 在实际开发中,相信每个项目都会有用户登陆注册功能,这个实现的方法很多,下面是我实现的方法,供大家交流. 新人发帖,万分紧张,怎么样才能装作一副经常发帖的样子不被别人看出来呢-,- ? 好了 ...

  4. PHP数据库登陆注册简单做法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 用户登陆注册【JDBC版】

    前言 在讲解Web开发模式的时候,曾经写过XML版的用户登陆注册案例!现在在原有的项目上,使用数据库版来完成用户的登陆注册!如果不了解的朋友,可以看看我Web开发模式的博文! 本来使用的是XML文件作 ...

  6. 《java入门第一季》模拟用户登陆注册案例集合版

    需求:校验用户名和密码,登陆成功后玩猜数字小游戏. 在这里先写集合版.后面还有IO版.数据库版. 一.猜数字小游戏类: 猜数字小游戏的代码见博客:http://blog.csdn.net/qq_320 ...

  7. Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(1)

    1.开发环境配置 Windows7 64位旗舰版 python3.6 node.js mysql navicat pycharm webstorm或vscode 2.项目初始化 新版的pycharm很 ...

  8. 三篇文章带你极速入门php(三)之php原生实现登陆注册

    看下成果 ps:纯天然h5,绝不添加任何添加剂(css)以及化学成分(js)(<( ̄ ﹌  ̄)我就是喜欢纯天然,不接受任何反驳) 关于本文 用原生的php和html做了一个登陆注册,大概是可以窥 ...

  9. Django2.0 path和re_path使用

    Django2.0发布后,很多人都拥抱变化,加入了2的行列.但是和1.11相比,2.0在url的使用方面发生了很大的变化,下面介绍一下: 一.实例 先看一个例子: from django.urls i ...

随机推荐

  1. C#与unity中base64string和图片互转

    C#: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  2. Fedora 19安装以后的优化

    Fedora 19安装以后的优化 转载自 http://www.zhukun.net/archives/6614 最近安装了Fedora 19 32bit,以下是一些优化配置,使之更适合国人使用. 1 ...

  3. 五十三、SAP中创建一个LVC表格

    一.我们打开之前的程序,在函数里面创建一个名字为SHOW_DATA_LVCE的函数 二.点击编辑->模式 三.选择'REUSE_ALV_GRID_DISPLAY_LVC' 四.选择调用功能,点击 ...

  4. Elasticsearch 使用集群 - 创建索引

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  5. MongoDB 教程

    版权所有,未经许可,禁止转载 章节 MongoDB 入门 MongoDB 优势 MongoDB 安装 MongoDB 数据建模 MongoDB 创建数据库 MongoDB 删除数据库 MongoDB ...

  6. vue学习(八)nextTick[异步更新队列]的使用和应用

    nextTick的使用 为了数据变化之后等待vue完成更新DOM,可以在数据变化之后立即使用Vue.nextTick()在当前的回调函数中能获取最新的DOM <div id="app& ...

  7. Linux Mysql 安装 开启远程连接 供python agent 连接测试 Mark

    Linux     6.3 (1) cat  /etc/redhat-release uname -a 查看yum 源:   阿里源 无源运行: echo 下载阿里云的yum源配置 wget -O / ...

  8. 了解java常用框架

    今天我看了一点看起来比较片面的东西,java常用基本床架,并且在网上搜了相关的知识和概括总结,用来继续后期的学习: 1.struts2框架,这是最经典的框架(可以说没有“之一”).可以帮你快速搭建出一 ...

  9. 65.ORM查询条件:gte,gt,lte和lt的使用

    1. gte: 代表的是大于等于,英文全称为:great than equal.举例:找到文章id大于等于3等文章,示例代码如下: 定义模型的示例代码如下: from django.db import ...

  10. 文献阅读报告 - 3DOF Pedestrian Trajectory Prediction

    文献 Sun L , Yan Z , Mellado S M , et al. 3DOF Pedestrian Trajectory Prediction Learned from Long-Term ...