Django项目:CRM(客户关系管理系统)--48--39PerfectCRM实现登录+验证码+过期时间+页面保留账号

 1 # gbacc_urls.py
 2 # ————————38PerfectCRM实现全局账号登录注销————————
 3 from django.conf.urls import url
 4 from gbacc import gbacc_views
 5 urlpatterns = [
 6     url(r'^gbacc_login/', gbacc_views.gbacc_login, name='gbacc_login'),  # 全局登录
 7     # LOGIN_URL = '/gbacc/gbacc_login/'# login_url 配置,默认'/accounts/login/' #注意 / (斜杠,绝对路径)#settings.py
 8 
 9     url(r'^gbacc_logout/', gbacc_views.gbacc_logout, name='gbacc_logout'),  # 全局注销,默认跳转到accounts/login
10 
11     # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
12     url(r'^check_code.html/$', gbacc_views.check_code, name='check_code'),  # 验证码 校对
13     # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
14 ]
15 # ————————38PerfectCRM实现全局账号登密码密码录注销————————
# gbacc_urls.py

 1 # check_code.py
 2 # ————————41PerfectCRM实现全局账号注册带验证码————————
 3 import random
 4 from PIL import Image, ImageDraw, ImageFont, ImageFilter
 5 _letter_cases = "abcdefghjkmnpqrstuvwxy"  # 小写字母,去除可能干扰的i,l,o,z
 6 _upper_cases = _letter_cases.upper()  # 大写字母
 7 _numbers = ''.join(map(str, range(3, 10)))  # 数字
 8 init_chars = ''.join((_letter_cases, _upper_cases, _numbers))
 9 def create_validate_code(size=(120, 30),
10                          chars=init_chars,
11                          img_type="GIF",
12                          mode="RGB",
13                          bg_color=(255, 255, 255),
14                          fg_color=(0, 0, 255),
15                          font_size=18,
16                          font_type="check.ttf",    #必须有字体
17                          length=4,
18                          draw_lines=True,
19                          n_line=(1, 2),
20                          draw_points=True,
21                          point_chance=2):
22     """
23     @todo: 生成验证码图片
24     @param size: 图片的大小,格式(宽,高),默认为(120, 30)
25     @param chars: 允许的字符集合,格式字符串
26     @param img_type: 图片保存的格式,默认为GIF,可选的为GIF,JPEG,TIFF,PNG
27     @param mode: 图片模式,默认为RGB
28     @param bg_color: 背景颜色,默认为白色
29     @param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000FF
30     @param font_size: 验证码字体大小
31     @param font_type: 验证码字体,默认为 ae_AlArabiya.ttf
32     @param length: 验证码字符个数
33     @param draw_lines: 是否划干扰线
34     @param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
35     @param draw_points: 是否画干扰点
36     @param point_chance: 干扰点出现的概率,大小范围[0, 100]
37     @return: [0]: PIL Image实例
38     @return: [1]: 验证码图片中的字符串
39     """
40     width, height = size  # 宽高
41     # 创建图形
42     img = Image.new(mode, size, bg_color)
43     draw = ImageDraw.Draw(img)  # 创建画笔
44     def get_chars():
45         """生成给定长度的字符串,返回列表格式"""
46         return random.sample(chars, length)
47     def create_lines():
48         """绘制干扰线"""
49         line_num = random.randint(*n_line)  # 干扰线条数
50         for i in range(line_num):
51             # 起始点
52             begin = (random.randint(0, size[0]), random.randint(0, size[1]))
53             # 结束点
54             end = (random.randint(0, size[0]), random.randint(0, size[1]))
55             draw.line([begin, end], fill=(0, 0, 0))
56     def create_points():
57         """绘制干扰点"""
58         chance = min(100, max(0, int(point_chance)))  # 大小限制在[0, 100]
59         for w in range(width):
60             for h in range(height):
61                 tmp = random.randint(0, 100)
62                 if tmp > 100 - chance:
63                     draw.point((w, h), fill=(0, 0, 0))
64     def create_strs():
65         """绘制验证码字符"""
66         c_chars = get_chars()
67         strs = ' %s ' % ' '.join(c_chars)  # 每个字符前后以空格隔开
68         font = ImageFont.truetype(font_type, font_size)
69         font_width, font_height = font.getsize(strs)
70         draw.text(((width - font_width) / 3, (height - font_height) / 3),
71                   strs, font=font, fill=fg_color)
72         return ''.join(c_chars)
73     if draw_lines:
74         create_lines()
75     if draw_points:
76         create_points()
77     strs = create_strs()
78     # 图形扭曲参数
79     params = [1 - float(random.randint(1, 2)) / 100,
80               0,
81               0,
82               0,
83               1 - float(random.randint(1, 10)) / 100,
84               float(random.randint(1, 2)) / 500,
85               0.001,
86               float(random.randint(1, 2)) / 500
87               ]
88     img = img.transform(size, Image.PERSPECTIVE, params)  # 创建扭曲
89     img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)  # 滤镜,边界加强(阈值更大)
90     return img, strs
91 # ————————41PerfectCRM实现全局账号注册带验证码————————
# check_code.py

 

控制面板所有控制面板项字体

由于无法上传字体 ,请自己复制一个字体到项目下

 1 # gbacc_views.py
 2 # ————————38PerfectCRM实现全局账号登录注销————————
 3 from django.contrib.auth import login #记录登录 #Django在数据库创建一条记录 #记住密码,免登录
 4 from django.contrib.auth import authenticate #调用用户认证模块
 5 from django.contrib.auth import logout #注销功能
 6 from django.shortcuts import render  #页面返回
 7 from django.shortcuts import redirect  #页面返回
 8 
 9 # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
10 #验证码函数 #处理注册的内容
11 from io import BytesIO #创建内存空间
12 from django.shortcuts import HttpResponse #页面返回
13 from gbacc.gbacc_auxiliary.check_code import create_validate_code #验证图片
14 def check_code(request):
15     stream = BytesIO()#创建内存空间
16     img, code = create_validate_code()#调用验证码图片生成函数 返回图片 和 对应的验证码
17     img.save(stream, 'PNG')#保存为PNG格式
18     request.session['CheckCode'] = code#保存在session中
19     return HttpResponse(stream.getvalue())
20 # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
21 
22 #全局账号登录
23 def gbacc_login(request):
24 
25     # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
26     email={} #变字典#传前端#页面获取值
27     _email = request.POST.get('email')  #关键语句 #获取前端输入的值
28     request.session['email'] = _email  #保存到 session 里
29     email=request.session.get('email')   #保存到变量#变字典#传前端
30     import datetime
31     today_str = datetime.date.today().strftime("%Y%m%d")   #获取时间#登陆过期
32     # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
33     
34     errors={}
35     if request.method =="POST":
36         _email=request.POST.get('email')
37         _password=request.POST.get('password')
38         # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
39         #后台生成的验证码#调用上面def check_code(request):        #页面输入的验证码
40         if request.session.get('CheckCode').upper() == request.POST.get('check_code').upper():#验证码
41         # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
42             user =authenticate(username=_email,password=_password)#调用用户认证模块
43             print('认证账号密码',user)
44             if user:
45                 login(request,user)#记录登录 #Django在数据库创建一条记录 #记住密码,免登录
46                 # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
47                 request.session.set_expiry(60*60)  #登陆过期时间
48                 # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
49                 next_url =request.GET.get('next','/')#跳转的页面,默认为首页
50                 return redirect(next_url)
51             else:
52                 errors['error']='认证失败!'
53         # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
54         else:
55             errors['error']= "验证码错误!"
56         # ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————
57     return render(request,'gbacc_specific/gbacc_login.html',locals())
58 
59 #全局账号注销
60 def gbacc_logout(request):
61     logout(request)  #调用Djangao 注销功能
62     return redirect('/gbacc/gbacc_login/')
63 
64 # ————————38PerfectCRM实现全局账号登录注销————————
# gbacc_views.py

 1 {#gbacc_login.html#}
 2 {## ————————38PerfectCRM实现全局账号登录注销————————#}
 3 {% extends "gbacc_master/gbacc_sample.html" %}
 4 {% block right-container-content %}
 5 
 6     <div class="container col-lg-offset-3">
 7       <form class="form-signin col-lg-3 pu" method="post">{% csrf_token %}
 8         <h2 class="form-signin-heading">CRM 登陆</h2>
 9         <label for="inputEmail" class="sr-only col-sm-2">邮箱账号</label>
10 
11 
12         {## ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————#}
13 {#        <input type="email" name="email" id="inputEmail" class="form-control" placeholder="邮箱账号" required="" autofocus=""  >#}
14         <input type="email" name="email" id="inputEmail" class="form-control" placeholder="邮箱账号"
15                required="" autofocus="" value ={% if email %}{{ email }}{% else %}{{ '' }}{% endif %} >
16         {## ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————#}
17       
18 
19         <label for="inputPassword" class="sr-only col-sm-2">密码</label>
20         <input type="password" name="password" id="inputPassword" class="form-control" placeholder="密码" required="">
21 
22 
23         {## ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————#}
24         <div class="form-group">
25             <div class="row">
26                 <div class="col-xs-7">
27                     <input type="text" class="form-control" id="check_code" name="check_code" placeholder="请输入验证码">{{ obj.errors.pwds }}
28                 </div>
29                 <div class="col-xs-5">
30                     <img id="check_code_img" src="/gbacc/check_code.html/" onclick="changeCheckCode(this);"> {## 配置URL绝对路径#}{## 绑定JS刷新验证码图片#}
31                 </div>
32             </div>
33         </div>
34         {## ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————#}
35 
36 
37         {% if errors %}
38             <span style="color: #761c19">{{ errors.error }}</span>
39         {% endif %}
40           <div class="checkbox">
41           <label><input type="checkbox" value="remember-me"> 记住账号 </label>
42         </div>
43 
44         <button class="btn btn-lg btn-primary btn-block" type="submit">登陆</button>
45       </form>
46     </div>
47 
48 
49 {## ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————#}
50 <script>
51      //刷新验证码
52      function changeCheckCode(ths){
53             ths.src = ths.src +  '?';
54      }
55 </script>
56 {## ————————39PerfectCRM实现登录+验证码+过期时间+页面保留账号————————#}
57 
58 
59 {% endblock %}
60 {## ————————38PerfectCRM实现全局账号登录注销————————#}
{#gbacc_login.html#}

原文地址:https://www.cnblogs.com/ujq3/p/8796730.html