验证码
在用户登录,注册以及一些敏感操作的时候,我们为了防止服务器被暴力请求,或爬虫爬取,我们可以使用验证码进行过滤,减轻服务器的压力。
原生实现:
- 库名: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>