django 之(五) --- 验证码|富文本|邮箱短信

验证码

 在用户登录,注册以及一些敏感操作的时候,我们为了防止服务器被暴力请求,或爬虫爬取,我们可以使用验证码进行过滤,减轻服务器的压力。

原生实现: 

  • 库名:pip install Pillow    验证码需要使用绘图 Pillow
  • 核心:Image(画布)、ImageDraw(画笔)、ImageFont(画笔修饰)
    • urls.py 和 settings.py
 1 # --------------- urls.py------------------
 2 from django.conf.urls import url
 3 from App import views
 4 
 5 urlpatterns = [
 6     url(r'^getcode/',views.get_code,name='get_code'),
 7 ]
 8 
10 # --------------settings.py-----------------
11 # 注册字体路径
12 FONT_PATH = os.path.join(BASE_DIR, 'static/fonts/ADOBEARABIC-BOLD.OTF')
    •  views.py 
 1 import random
 2 from io import BytesIO
 3 from PIL import Image, ImageFont
 4 from PIL.ImageDraw import ImageDraw
 5 from django.http import HttpResponse
 6 from App.utils import get_color, generate_code
 7 from DjangoCache import settings
 8 
 9 
10 # &&&&&&&&&&&  验证码绘制  &&&&&&&&&
11 def get_code(request):
12     mode = 'RGB'
13     size = [200, 100]
14     red = get_color()
15     green = get_color()
16     blue = get_color()
17     color_bg = (red, green, blue)
18 
19     # 初始化 画布和画笔
20     # 画布(颜色模式rgb,画布尺寸,颜色)
21     image = Image.new(mode, size=size, color=color_bg)
22     # 画笔(画布,模式rgb)
23     imagedraw = ImageDraw(image, mode=mode)
24     # 构造字体样式(路径,默认值)
25     imagefont = ImageFont.truetype(settings.FONT_PATH, 100)
26     verify_code = generate_code()
27     request.session['verify_code'] = verify_code # 将验证码存入存sesssion
28 
29     for i in range(4):
30         fill = (get_color(), get_color(), get_color())
31         # 画图(坐标,画什么,字体,颜色)
32         imagedraw.text(xy=(50 * i, 0), text=verify_code[i], font=imagefont, fill=fill)
33 
34     for i in range(10000):
35         fill = (get_color(), get_color(), get_color())
36         xy = (random.randrange(201), random.randrange(100))
37         # 画干扰点(位置随机,颜色随机)
38         imagedraw.point(xy=xy, fill=fill)
39     # 设置字节内存流IO流
40     fp = BytesIO()
41     # 存入(在内存流,存入格式)
42     image.save(fp, 'png')
43     # fp.getvalue从内存中获取值 传递给前端
44     return HttpResponse(fp.getvalue(), content_type='image/png')
45 
46 
47 # 将以下两个函数 放入工具类中。使用时导入
48 # 设置颜色。每次不同
49 def get_color():
50     return random.randrange(256)
51 
52 # 设置文字,每次不同
53 def generate_code():
54     source = 'qwertyuiopasdfghjklzxcvbnm1234567890'
55     code = ''
56     for i in range(4):
57         code += random.choice(source)
58     return code
 1 @csrf_exempt
 2 def login(request):
 3     if request.method == 'GET':
 4         return render(request, 'login.html')
 5 
 6     elif request.method == 'POST':
 7         receive_code = request.POST.get('verify_code')
 8         store_code = request.session.get('verify_code')
 9 
10         if receive_code != store_code: # 判断验证码是否正确
11             return HttpResponseRedirect(reverse('app:login'))
12         return HttpResponse('登陆成功')
    • login.html
 1 {% load static %}
 2 <!DOCTYPE html>
 3 <html lang="en">
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>用户登陆</title>
 7     <script src="https://cdn.bootcss.com/jquery/1.11.1/jquery.js"></script>
 8     <script type="text/javascript" src="{% static 'js/login.js' %}"></script>
 9 </head>
10 <body>
11 <form action="{% url 'app:login' %}" method="post">
12     <span>用户名:</span><input type="text" name="username" placeholder="精神精神">
13     <br>
14     <spam>验证码</spam><input type="text" name="verify_code" placeholder="请输入下图验证码">
15     <br>
16     <img src="{% url 'app:get_code' %}" >
17     <button>登陆</button>
18 </form>
19 </body>
20 </html>

富文本

 介绍:

  富文本:Rich Text Format(RTF),是有微软开发的跨平台文档格式,大多数的文字处理软件

  都能读取和保存RTF文档,其实就是可以添加样式的文档,和HTML有很多相似的地方

 插件:

  • 名称:tinymce 插件
  • 安装:pip install django-tinymce

 场景:

  • 在后台管理中使用
  • 在页面中使用,通常用来作博客

 使用:

  • 配置,settings.py文件中
 1 INSTALLED_APPS = [
 2     'django.contrib.admin',
 3     'django.contrib.auth',
 4     'django.contrib.contenttypes',
 5     'django.contrib.sessions',
 6     'django.contrib.messages',
 7     'django.contrib.staticfiles',
 8     'App',
 9     'tinymce',    #  注册   
10 ]
11 
12 # 配置
13 TINYMCE_DEFAULT_CONFIG = {
14     'theme': 'advanced',      # 主题样式
15     'width': 800,             # 宽度
16     'height': 600,            # 高度
17 }
  • 应用
    • models.py  配置模型并迁移同步。HTMLfield()继承自models.TextField
1 from django.db import models
2 from tinymce.models import HTMLField
3 
4 class Blog(models.Model):
5     b_content = HTMLField()
    • urls.py 和 views.py 路由和试图
 1 from django.conf.urls import url
 2 from App import views
 3 
 4 urlpatterns = [
 5     url(r'^editblog/',views.edit_blog,name='edit_blog'),
 6 ]
 7 
 8 # =================================
 9 
10 from django.shortcuts import render
11 
12 def edit_blog(request):
13     return render(request,'edit_blog.html')
    • edit_blog.html
 1 {% load static %}
 2 <!DOCTYPE html>
 3 <html lang="en">
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>EditBlog</title>
 7     <script type="text/javascript" src="/static/tiny_mce/tiny_mce.js"></script>
 8     <script type="text/javascript">
 9         tinyMCE.init({
10             "mode": "textareas",
11             "theme": "advanced",
12             "width": 800,
13             "height": 600
14         })
15     </script>
16 </head>
17 
18 <body>
19 <form action="{% url 'app:edit_blog' %}" method="post">
20     {% csrf_token %}
21     <textarea name="content"></textarea>
22     <button>保存</button>
23 </form>
24 </body>
25 </html>

邮箱认证

 

 

 

 

 

 

 

 

 

短信认证

 

 

 

 

posted @ 2019-11-09 10:52  Tom's  阅读(257)  评论(0编辑  收藏  举报