• 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>

    邮箱认证

    短信认证

    生如逆旅 一苇以航
  • 相关阅读:
    罗振宇 知识就是力量之怎样做一个不冲动的人
    C++中stl的map
    stl中顺序性容器,关联容器两者粗略解释
    stl之容器、迭代器、算法几者之间的关系
    mysql技术内幕之常规使用
    essential c++ 第一章 array及vector相关使用
    由函数clock想到的
    编程获得CPU的主频
    Markdown 基本语法
    Future FutrueTask Callable类源码说明以及原理使用
  • 原文地址:https://www.cnblogs.com/TMMM/p/11824549.html
Copyright © 2020-2023  润新知