# 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. 简单的UDP服务端和客户端示例

    UDP的理论不再多说,我这里直接给出一个关于UDP的HelloWorld程序,代码明了,希望对刚入门的学生有所帮助! 当然,实际上,在这块我也刚入门! 首先写服务端代码,服务端邦定本地的IP和端口来监 ...

  2. Single Thread Execution 能通过这座桥的只有一个人

    直奔主题, Single Thread Execution也称作Critical Section(临界区),范例如下: public class SingleThreadGate { public s ...

  3. 控制类名(className 属性)设置或返回class属性

    控制类名(className 属性) className 属性设置或返回元素的class 属性. 语法: object.className = classname 作用: 1.获取元素的class 属 ...

  4. 【SDOI2015】约数个数和

    题面 求\(\sum_{i=1}^n\sum_{j=1}^md(ij)\) \(\leq 50000\)组数据,\(1\leq n,m\leq 50000\). 题目分析 首先,你需要知道一个结论: ...

  5. python中使用xlrd、xlwt操作excel

    python 对 excel基本的操作如下: # -*- coding: utf-8 -*- import xlrd import xlwt from datetime import date,dat ...

  6. MySQL其他和备份

    目录 事务 存储引擎 InnoDB存储引擎 数据存储形式 锁的粒度 事务 数据的存储特点 MyISAM存储引擎 数据存储形式 锁的粒度 事务 数据的存储特点 其他 对比与选择 视图 触发器 存储过程 ...

  7. 二分图——多重匹配模板hdu1669

    好像多重匹配一般是用网络流来做的.. 这是匈牙利算法的模板:lim是每个组的上界 思路是每个组都可以匹配lim个点,那么当点x遇到的组匹配的点数还没有超过lim时,直接匹配即可 如果已经等于了lim, ...

  8. iPhone开发关于UDID和UUID的一些理解

    一.UDID(Unique Device Identifier)  UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识.  在很多需要限制一台设备一个账号的应用中 ...

  9. Hibernate(五)之一对多&多对一映射关系

    既然我们讲到了一对多和多对一关系,必然要提到多表设计的问题.在开发中,前期需要进行需求分析,希求分析提供E-R图,根据ER图编写表结构. 我们知道表之间关系存在三种: 一对多&多对一:1表(主 ...

  10. 基于vue-cli的vs code设置

    vue-cli自带eslin校验,vs code采用下可以设置在保存文件时会自动纠正格式 { // vscode默认启用了根据文件类型自动设置tabsize的选项 "editor.detec ...