zoukankan      html  css  js  c++  java
  • 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>

    邮箱认证

    短信认证

    生如逆旅 一苇以航
  • 相关阅读:
    leetcode 190 Reverse Bits
    vs2010 单文档MFC 通过加载位图文件作为客户区背景
    leetcode 198 House Robber
    记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
    逆序数2 HDOJ 1394 Minimum Inversion Number
    矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
    递推DP URAL 1586 Threeprime Numbers
    递推DP URAL 1167 Bicolored Horses
    递推DP URAL 1017 Staircases
    01背包 URAL 1073 Square Country
  • 原文地址:https://www.cnblogs.com/TMMM/p/11824549.html
Copyright © 2011-2022 走看看