# gbacc_urls.py
# ————————38PerfectCRM实现全局账号登录注销————————
from django.conf.urls import url
from gbacc import gbacc_views
urlpatterns = [
url(r'^gbacc_login/', gbacc_views.gbacc_login, name='gbacc_login'), # 全局登录
# LOGIN_URL = '/gbacc/gbacc_login/'# login_url 配置,默认'/accounts/login/' #注意 / (斜杠,绝对路径)#settings.py url(r'^gbacc_logout/', gbacc_views.gbacc_logout, name='gbacc_logout'), # 全局注销,默认跳转到accounts/login # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
url(r'^check_code.html/$', gbacc_views.check_code, name='check_code'), # 验证码 校对
# ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号———————— # ————————40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息————————
url(r'^gbacc_register/', gbacc_views.gbacc_register, name='gbacc_register'), # 注册
# ————————40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息————————
]
# ————————38PerfectCRM实现全局账号登密码密码录注销————————

# gbacc_urls.py

 # gbacc_views.py
# ————————38PerfectCRM实现全局账号登录注销————————
from django.contrib.auth import login #记录登录 #Django在数据库创建一条记录 #记住密码,免登录
from django.contrib.auth import authenticate #调用用户认证模块
from django.contrib.auth import logout #注销功能
from django.shortcuts import render #页面返回
from django.shortcuts import redirect #页面返回 # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
#验证码函数 #处理注册的内容
from io import BytesIO #创建内存空间
from django.shortcuts import HttpResponse #页面返回
from gbacc.gbacc_auxiliary.check_code import create_validate_code #验证图片
def check_code(request):
stream = BytesIO()#创建内存空间
img, code = create_validate_code()#调用验证码图片生成函数 返回图片 和 对应的验证码
img.save(stream, 'PNG')#保存为PNG格式
request.session['CheckCode'] = code#保存在session中
return HttpResponse(stream.getvalue())
# ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号———————— #全局账号登录
def gbacc_login(request): # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
email={} #变字典#传前端#页面获取值
_email = request.POST.get('email') #关键语句 #获取前端输入的值
request.session['email'] = _email #保存到 session 里
email=request.session.get('email') #保存到变量#变字典#传前端
import datetime
today_str = datetime.date.today().strftime("%Y%m%d") #获取时间#登陆过期
# ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号———————— errors={}
if request.method =="POST":
_email=request.POST.get('email')
_password=request.POST.get('password')
# ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
#后台生成的验证码#调用上面def check_code(request): #页面输入的验证码
if request.session.get('CheckCode').upper() == request.POST.get('check_code').upper():#验证码
# ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
user =authenticate(username=_email,password=_password)#调用用户认证模块
print('认证账号密码',user)
if user:
login(request,user)#记录登录 #Django在数据库创建一条记录 #记住密码,免登录
# ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
request.session.set_expiry(60*60) #登陆过期时间
# ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
next_url =request.GET.get('next','/')#跳转的页面,默认为首页
return redirect(next_url)
else:
errors['error']='认证失败!'
# ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
else:
errors['error']= "验证码错误!"
# ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
return render(request,'gbacc_specific/gbacc_login.html',locals()) #全局账号注销
def gbacc_logout(request):
logout(request) #调用Djangao 注销功能
return redirect('/gbacc/gbacc_login/')
# ————————38PerfectCRM实现全局账号登录注销———————— # ————————40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息————————
# json 对错误信息对象进行处理 #处理注册的内容
import json # 转为json格式
from django.core.exceptions import ValidationError # 错误信息
class JsonCustomEncoder(json.JSONEncoder):
def default(self, field):
if isinstance(field, ValidationError): # 如果是错误信息进行处理
return {'code': field.code, 'messages': field.messages}
else:
return json.JSONEncoder.default(self, field) # 注册
from gbacc.gbacc_auxiliary.account import RegisterForm # 注册验证
from django.contrib.auth.hashers import make_password # 密码加密
from crm import models #数据库
def gbacc_register(request):
email = {} #页面刷新保留信息
_email = request.POST.get('email') # 关键语句 #获取前端输入的值
request.session['email'] = _email # 保存到 session 里
email = request.session.get('email') # 保存到变量#变字典#传前端 name = {} #页面刷新保留信息
_name = request.POST.get('name') # 关键语句 #获取前端输入的值
request.session['name'] = _name # 保存到 session 里
name = request.session.get('name') # 保存到变量#变字典#传前端 password = {} #页面刷新保留信息
_password = request.POST.get('password') # 关键语句 #获取前端输入的值
request.session['password'] = _password # 保存到 session 里
password = request.session.get('password') # 保存到变量#变字典#传前端 errors = {} #错误信息
if request.method == 'POST':
obj = RegisterForm(request=request, data=request.POST) # 注册验证 #PerfectCRM.gbacc_auxiliary.account
if obj.is_valid(): #如果表单没有错误,则返回true。否则为假。如果错误是被忽略,返回false。
name = obj.cleaned_data.get('name') # 获取用户名
password = obj.cleaned_data.get('password') # 获取密码
email = obj.cleaned_data.get('email') # 获取邮箱账号
password = make_password(password, ) # 对密码进行加密
# ——————数据库添加数据——————
models.UserProfile.objects.create(name=name, password=password, email=email, )
# ——————数据库添加数据——————
# ——————注册后自动登录——————
import datetime
today_str = datetime.date.today().strftime("%Y%m%d") # 获取时间#登陆过期
user =authenticate(username=_email,password=_password)#调用用户认证模块
if user:
login(request,user)#记录登录 #Django在数据库创建一条记录 #记住密码,免登录
request.session.set_expiry(60*60) #登陆过期时间
next_url =request.GET.get('next','/')#跳转的页面,默认为首页
return redirect(next_url)
else:
errors ='认证失败!走到这请联系告诉我。。。'
# ——————注册后自动登录——————
else:
errors = obj.errors.as_data() #获取全部 account.py 处理的不同错误信息 #到页面显示{{ errors.name.0 }}
return render(request, 'gbacc_specific/gbacc_register.html', locals())
# ————————40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息————————

# gbacc_views.py

 # base.py
# ————————39PerfectCRM实现全局账号注册————————
#重写父类 可以传入request
class BaseForm(object):
def __init__(self, request, *args, **kwargs):
self.request = request
super(BaseForm, self).__init__(*args, **kwargs) # ————————39PerfectCRM实现全局账号注册————————

# base.py

 # account.py
# ————————40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息————————
from .base import BaseForm #重写
from django.core.exceptions import ValidationError #错误信息
from django import forms as django_forms # forms
from django.forms import fields as django_fields #字段
from crm import models #数据库
#注册验证
class RegisterForm(BaseForm, django_forms.Form):
name=django_fields.CharField(
min_length=3,
max_length=20,
error_messages={'required': '用户名不能为空.', #默认输入这个
'min_length': "用户名长度不能小于3个字符",
'max_length': "用户名长度不能大于32个字符"}, )
email=django_fields.EmailField(
error_messages={'required': '邮箱不能为空.','invalid':"邮箱格式错误"}, )
password = django_fields.RegexField(
#正则表达 配置密码复杂度
# '^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$\%\^\&\*\(\)])[0-9a-zA-Z!@#$\%\^\&\*\(\)]{8,32}$',
'',
min_length=6,
max_length=32,
error_messages={'required': '密码不能为空.', #默认输入这个
'invalid': '密码必须包含数字,字母、特殊字符', # 正则表达
'min_length': "密码长度不能小于6个字符",
'max_length': "密码长度不能大于32个字符",
'message':None}, )
confirm_password=django_fields.CharField(
error_messages={'required': '确认密码不能为空.',
'invalid': '确认密码不对', }, )
check_code = django_fields.CharField(
error_messages={'required': '验证码不能为空.'}, ) #内置勾子
#用户名重复查询
def clean_username(self):
#查询是否存在
name=self.cleaned_data['name'] #cleaned_data 就是读取表单返回的值,返回类型为字典dict型
u =models.UserProfile.objects.filter(name=name).count() #查询数据库
if not u:
return self.cleaned_data['name']
else:
raise ValidationError(message='用户名已经存在',code='invalid')
#邮箱重复查询
def clean_email(self):
email=self.cleaned_data['email']
e=models.UserProfile.objects.filter(email=email).count() #查询数据库
if not e:
return self.cleaned_data['email']
else:
raise ValidationError('邮箱已经被注册!',code='invalid') #确认密码
def clean_confirm_password(self):
pwd1=self.request.POST.get('password') #通过POST 获取前端 输入的值
pwd2=self.cleaned_data['confirm_password'] #name="confirm_password"
if pwd1 != pwd2:
raise ValidationError('二次输入密码不匹配')
else:
return self.cleaned_data['confirm_password'] # 验证码 校对
def clean_check_code(self):
#调用check_code.py # 获取生成的验证码 #获取输入的验证码
if self.request.session.get('CheckCode').upper() != self.request.POST.get('check_code').upper():
raise ValidationError(message='验证码错误', code='invalid')
else:
return self.cleaned_data['check_code']
# ————————40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息————————

# account.py

 {#global_register.html#}
{## ————————40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息————————#}
{% extends "gbacc_master/gbacc_sample.html" %}
{% block right-container-content %}
<h1 class="form-group col-lg-offset-4"> 用户注册</h1>
<form class="form-horizontal" role="form" method="POST" id="fm"> {% csrf_token %}
<div class="col-lg-offset-3"> <div class="form-inline form-group">
<label class="col-sm-1 " for="email">邮箱账号: </label>
<input class="form-control " type="email" id="email" name="email"
placeholder="请输入邮箱" value={% if email %}{{ email }}{% else %}{{ '' }}{% endif %}>
{% if errors.email %}
<span style="color: #761c19">{{ errors.email.0 }} </span>
{% endif %}
</div> <div class="form-inline form-group">
<label class="col-sm-1" for="username">用户名:</label>
<input class="form-control" type="text" id="username" name="name"
placeholder="请输入用户名" value={% if name %}{{ name }}{% else %}{{ '' }}{% endif %}>
{% if errors.name %}
<span style="color: #761c19">{{ errors.name.0 }} </span>
{% endif %}
</div> <div class="form-inline form-group">
<label class="col-sm-1" for="password">密码:</label>
<input class="form-control" type="password" id="password" name="password"
placeholder="请输入密码" value={% if password %}{{ password }}{% else %}{{ '' }}{% endif %}>
{% if errors.password %}
<span style="color: #761c19">{{ errors.password.0 }} </span>
{% endif %}
</div> <div class="form-inline form-group">
<label class="col-sm-1" for="confirm_password">确认密码:</label>
<input class="form-control" type="password" id="confirm_password" name="confirm_password"
placeholder="请重新输入密码">
{% if errors.confirm_password %}
<span style="color: #761c19">{{ errors.confirm_password.0 }} </span>
{% endif %}
</div> <div class="form-inline form-group">
<label class="col-sm-1" for="text">验证码:</label>
<input class="form-control" type="text" id="check_code" name="check_code"
placeholder="请输入验证码">
{% if errors.check_code %}
<span style="color: #761c19">{{ errors.check_code.0 }}</span>
{% endif %}
{## 配置URL绝对路径#} {## 绑定JS刷新验证码图片#}
<img id="check_code_img" src="/gbacc/check_code.html/" onclick="changeCheckCode(this);"> </div>
<div class="form-inline form-group">
<div class="col-xs-2">
<button class="btn btn-lg btn-primary btn-block" type="submit">注册</button>
</div>
<div class="col-xs-2">
<a class="btn btn-lg btn-primary btn-block" href="/gbacc/gbacc_login/">登陆</a>
</div>
</div>
</div>
</form> <script>
//刷新验证码
function changeCheckCode(ths) {
ths.src = ths.src + '?';
}
</script>
{% endblock %}
{## ————————40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息————————#}

{#global_register.html#}

Django项目:CRM(客户关系管理系统)--49--40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息的更多相关文章

  1. Django项目:CRM(客户关系管理系统)--51--42PerfectCRM实现AJAX全局账号注册

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...

  2. Django项目:CRM(客户关系管理系统)--52--43PerfectCRM实现AJAX全局账号登陆

    # gbacc_ajax_urls.py # ————————42PerfectCRM实现AJAX全局账号注册———————— from django.conf.urls import url fro ...

  3. Django项目:CRM(客户关系管理系统)--50--41PerfectCRM实现全局账号密码修改

    # gbacc_urls.py # ————————38PerfectCRM实现全局账号登录注销———————— from django.conf.urls import url from gbacc ...

  4. Django CRM客户关系管理系统

    CRM需求分析 随着信息化时代带来的科技创新,CRM客户关系管理系统带来的效益在已经成为很多企业提高竞争优势的一分部,CRM客户关系管理系统将企业管理和客户关系管理集成到统一的平台,其系统功能主要体现 ...

  5. Django项目:CRM(客户关系管理系统)--70--60PerfectCRM实现CRM学生上课记录

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...

  6. Django项目:CRM(客户关系管理系统)--63--53PerfectCRM实现CRM客户报名流程缴费

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...

  7. Django项目:CRM(客户关系管理系统)--56--47PerfectCRM实现CRM客户报名流程01

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...

  8. Django项目:CRM(客户关系管理系统)--74--64PerfectCRM实现CRM课程排名详情

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...

  9. Django项目:CRM(客户关系管理系统)--72--62PerfectCRM实现CRM讲师讲课记录

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...

随机推荐

  1. innerHTML 属性用于获取或替换 HTML 元素的内容。

    innerHTML 属性 innerHTML 属性用于获取或替换 HTML 元素的内容. 语法: Object.innerHTML 注意: 1.Object是获取的元素对象,如通过document.g ...

  2. python全栈开发:字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存. 1.百分号方式 %[(name ...

  3. WJMZBMR打osu! / Easy

    WJMZBMR打osu! / Easy 有一个由o,x,?组成的长度为n的序列,?等概率变为o,x,定义序列权值为连续o的长度o的平方之和,询问权值的期望, 解 注意到权值不是简单的累加关系,存在平方 ...

  4. JSP四个域对象的应用场景

    request 如果客户向服务器发请求,产生的数据,用户看完就没用了,像这样的数据就存在request域 比如新闻数据,属于用户看完就没用的 session 如果客户向服务器发请求,产生的数据,用户用 ...

  5. SpringBoot_01_SpringBoot入门

    1 Spring的优点分析 Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品.无需开发重量级的Enterprise JavaBean( ...

  6. jeecms v9 vue环境搭建

    一.安装NODEJS运行环境 前往nodejs官网下载nodejs,https://nodejs.org/en/ ,建议下载最新稳定版的,下载后安装即可,下载选择类似如下 安装完毕之后,在cmd中输入 ...

  7. linux最基础最常用的命令快速手记 — 让手指跟上思考的速度(三)

    这一篇作为姐妹篇的第三篇,废话不多说,我觉得这个比mysql的还要重要,为什么,一旦你摊上linux 敲键盘输入命令简直是要飞的速度,不断的卡壳查命令,效率太低了,而且非常严重的影响思绪,思绪! 某些 ...

  8. python 模拟键盘输入

    备忘录 import win32api import win32con win32api.keybd_event(17,0,0,0) #ctrl键位码是17 win32api.keybd_event( ...

  9. python3-常用模块之random

    random 1.取随机小数 : 数学计算# print(random.random()) # 取0-1之间的小数# print(random.uniform(1,2)) # 取1-2之间的小数 2. ...

  10. ES6之主要知识点(一)

    引自:http://es6.ruanyifeng.com let 块级作用域 const 1.let let声明的变量只在它所在的代码块有效. for循环的计数器,就很合适使用let命令. var a ...