1、短信网关model
1 # -*- coding: utf-8 -*- 2 from __future__ import unicode_literals 3 4 from django.db import models 5 from django.template import Context 6 from django.template import Template as DjangoTemplate 7 from django.utils.safestring import mark_safe 8 from django.utils.translation import ugettext_lazy as _ 9 import json 10 import requests 11 12 # Create your models here. 13 class SmsSendingProfile(models.Model): 14 TYPE_CHOICES = ( 15 (\'common\', \'管理\'), 16 (\'phish\', \'钓鱼\') 17 ) 18 """短信网关:包括以下属性(短信网关名称,网关URL,请求参数,用途)""" 19 name = models.CharField(max_length=100, verbose_name=\'名称\', help_text=\'短信网关名称,必填,最多100个字符\') 20 url = models.CharField(max_length=2083, verbose_name=\'网关URL\', help_text=\'网关URL,必填,最多2083个字符\') # IE limit URL length to 2083 21 params = models.TextField(max_length=5000, verbose_name=\'请求参数\', help_text=\'请求参数,必填,最多5000个字符\') 22 23 type = models.CharField(_(\'用途\'), choices=TYPE_CHOICES, max_length=15, default=\'common\', help_text=\'请选择用途\') 24 25 def test(self, send_to, content): 26 \'\'\' 27 测试 28 :param send_to: 发送至 29 :param content: 邮件内容 30 :return: 无返回值 31 \'\'\' 32 if not send_to: 33 raise Exception(\'未指定手机号码\') 34 if content.strip() == \'\': 35 content = \'【红山瑞达】这是一条测试短信,发送自意识测评系统。退订回N\' 36 context = Context({ 37 \'to\': send_to, 38 \'content\': mark_safe(content) 39 }) 40 41 resp = requests.post(self.url, data=json.loads(DjangoTemplate(self.params).render(context))) 42 if resp.json()[\'status\'] != \'success\': 43 raise Exception(\'发送测试短信失败\') 44 45 def __unicode__(self): 46 return self.name 47 48 class Meta: 49 verbose_name = \'短信网关\' 50 verbose_name_plural = \'短信网关\'
2、初始化短信网关数据
1 smssendingprofile1.user = user 2 smssendingprofile1.name = \'短信网关(管理)\' 3 smssendingprofile1.type = \'common\' 4 smssendingprofile1.url = \'https://api.mysubmail.com/message/send.json\' 5 smssendingprofile1.params = \'{"appid":"25524","to":"{{to}}","content":"{{content}}","signature":"7342ec5109e8e734de84730b746e4e18"}\' 6 smssendingprofile1.save()
3、发送手机验证码接口
1 # -*- coding: utf-8 -*- 2 from __future__ import unicode_literals 3 4 from django.shortcuts import render, HttpResponse 5 from django.template import Template as DjangoTemplate 6 from django.template import Context 7 from django.views.decorators.csrf import csrf_exempt 8 from interfance.models import SmsSendingProfile 9 from django.utils.safestring import mark_safe 10 import requests 11 import random 12 import json 13 import demjson 14 15 16 def index(request): 17 return render(request, \'index.html\') 18 19 def verification_code(): 20 """ 21 生成手机验证码 22 """ 23 num = \'\' 24 for x in xrange(6): 25 num += str(random.randint(0, 9)) 26 return num 27 28 @csrf_exempt 29 def sms_verification(request): 30 phone = request.POST.get(\'phone\', \'\') 31 code = verification_code() 32 33 if not phone: 34 return HttpResponse(json.dumps({\'code\': 403, \'status\': \'failed\', \'data\': \'手机号码为空\'})) 35 36 sms_profile = SmsSendingProfile.objects.filter(type=\'common\').first() # 短信网关对象 37 text = \'【红瑞教育培训系统】 尊敬的用户,您的验证码为:{},两分钟内有效,请勿将验证码告知他人。退订回N\'.format(code) 38 context = Context({ 39 \'to\': phone, 40 \'content\': mark_safe(text) 41 }) 42 print context,\'3333\' 43 resp = requests.post(sms_profile.url,data=json.loads(DjangoTemplate(sms_profile.params).render(context))) 44 #requests模块发送post请求去请求短信网关url,参数等:{"appid":"25524","to":"{{to}}","content":"{{content}}","signature":"7342ec5109e8e734de84730b746e4e18"},然后用 ontext 来传递数据给它 45 print resp.json() 46 if resp.json()[\'status\'] != \'success\': 47 return HttpResponse(json.dumps({\'code\': 403, \'status\': {\'status\': \'failed\'}})) 48 49 return HttpResponse(json.dumps({\'code\': 200, \'status\': demjson.decode(resp.text), \'data\': code}))
4、前端获取验证码
1 {% load static %} 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7 <link rel="stylesheet" href="{% static \'tips/css/sweet-alert.css\' %}"> 8 9 </head> 10 <body> 11 <form action="#" method="post"> 12 {% csrf_token %} 13 <input type="text" id="tel" name="tel" class="tel" placeholder="手机"> 14 <div class="clearfix" style="padding-top: 25px;"> 15 <input type="text" id="sms" name="sms" class="sms" placeholder="请输入验证码"> 16 <button id="send_sms">发送验证码</button> 17 </div> 18 </form> 19 <script src="{% static \'tips/js/sweet-alert.min.js\' %}"></script> 20 <script src="{% static \'js/jquery-1.8.2.min.js\' %}"></script> 21 <script> 22 var sms_number 23 var duration = 120 24 var send = 60 25 var timer_send = null 26 var timer_duration = null 27 var duration_left 28 29 function initCountdown(timer, count, type) { 30 timer = setInterval(function () { 31 if (type === \'send\') { 32 count-- 33 34 if ($(\'#send_sms\').length) { 35 $(\'#send_sms\').html(\'重发(\' + count + \'秒)\') 36 } else if ($(\'#send_sms_forget\').length) { 37 $(\'#send_sms_forget\').html(\'重发(\' + count + \'秒)\') 38 } 39 } else if (type === \'duration\') { 40 count-- 41 } 42 43 if (count < 0 && type === \'send\') { 44 send = 60 45 if ($(\'#send_sms\').length) { 46 $(\'#send_sms\').html(\'发送验证码\') 47 } else if ($(\'#send_sms_forget\').length) { 48 $(\'#send_sms_forget\').html(\'发送验证码\') 49 } 50 clearInterval(timer) 51 } 52 53 if (count < 0 && type === \'duration\') { 54 duration_left = count 55 clearInterval(timer) 56 } 57 }, 1000) 58 } 59 60 $(\'#send_sms\').on(\'click\', function (e) { 61 var event = window.event || event 62 event.preventDefault() 63 if ($(this).html() === \'发送验证码\') { 64 $.ajax({ 65 url: \'/sms_verification/\', 66 type: \'post\', 67 data: { 68 phone: $(\'#tel\').val() 69 }, 70 dataType: \'json\', 71 success: function (data, status) { 72 if (data.status.status === \'success\') { 73 sms_number = data.data 74 duration = 120 75 initCountdown(timer_send, send, \'send\') 76 initCountdown(timer_duration, duration, \'duration\') 77 } else { 78 swal("发送失败", \'验证码发送失败,请检查个人信息的手机号是否正确\', "error"); 79 } 80 } 81 }) 82 } 83 }) 84 85 $(\'#send_sms_forget\').on(\'click\', function (e) { 86 var event = window.event || event 87 event.preventDefault() 88 var _this = $(this) 89 $.ajax({ 90 url: \'/verify_user/\', 91 type: \'post\', 92 dataType: \'json\', 93 data: { 94 phone: $(\'#tel\').val() 95 }, 96 success: function (data, status) { 97 console.log(data.data == true) 98 if (data.data == true) { 99 if (_this.html() === \'发送验证码\') { 100 $.ajax({ 101 url: \'/sms_verification/\', 102 type: \'post\', 103 data: { 104 phone: $(\'#tel\').val() 105 }, 106 dataType: \'json\', 107 success: function (data, status) { 108 if (data.status.status === \'success\') { 109 sms_number = data.data 110 duration = 120 111 initCountdown(timer_send, send, \'send\') 112 initCountdown(timer_duration, duration, \'duration\') 113 } else { 114 swal("发送失败", \'验证码发送失败,请检查个人信息的手机号是否正确\', "error"); 115 } 116 } 117 }) 118 } 119 } 120 } 121 }) 122 }) 123 124 125 126 </script> 127 </body> 128 </html>
###########################
可直接用的函数
1、判断访问来源是pc端还是手机端
1 def judge_pc_or_mobile(ua): 2 """ 3 判断访问来源是pc端还是手机端 4 :param ua: 访问来源头信息中的User-Agent字段内容 5 :return: 6 """ 7 factor = ua 8 is_mobile = False 9 _long_matches = r\'googlebot-mobile|android|avantgo|blackberry|blazer|elaine|hiptop|ip(hone|od)|kindle|midp|mmp\' \ 10 r\'|mobile|o2|opera mini|palm( os)?|pda|plucker|pocket|psp|smartphone|symbian|treo|up\.(browser|link)\' \ 11 r\'|vodafone|wap|windows ce; (iemobile|ppc)|xiino|maemo|fennec\' 12 _long_matches = re.compile(_long_matches, re.IGNORECASE) 13 _short_matches = r\'1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)\' \ 14 r\'|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)\' \ 15 r\'|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw\' \ 16 r\'|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8\' \ 17 r\'|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit\' \ 18 r\'|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)\' \ 19 r\'|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji\' \ 20 r\'|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx\' \ 21 r\'|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi\' \ 22 r\'|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)\' \ 23 r\'|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg\' \ 24 r\'|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21\' \ 25 r\'|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-\' \ 26 r\'|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it\' \ 27 r\'|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)\' \ 28 r\'|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)\' \ 29 r\'|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit\' \ 30 r\'|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-\' 31 32 _short_matches = re.compile(_short_matches, re.IGNORECASE) 33 34 if _long_matches.search(factor): 35 is_mobile = True 36 user_agent = factor[0:4] 37 if _short_matches.search(user_agent): 38 is_mobile = True 39 40 return is_mobile
2、生成手机验证码
1 def verification_code(): 2 """ 3 生成手机验证码 4 """ 5 num = \'\' 6 for x in xrange(6): 7 num += str(random.randint(0, 9)) 8 return num
3、验证文件大小
1 def formatsize(byte): 2 """ 3 验证文件大小 4 :param byte: 5 :return: 6 """ 7 try: 8 byte = float(byte) 9 KB = round(byte / 1024, 2) 10 except: 11 print("传入的字节格式不对") 12 return "Error" 13 14 if KB >= 1024: 15 MB = round(KB / 1024, 2) 16 if MB >= 1024: 17 G = round(MB / 1024, 2) 18 return "%sG" % (G) 19 else: 20 return "%sMB" % (MB) 21 else: 22 return "%sKB" % (KB)
4、时间统计
1 def changetime(alltime): 2 day = 24 * 60 * 60 3 hour = 60 * 60 4 min = 60 5 if alltime < 60: 6 return "%d 秒" % math.ceil(alltime) 7 elif alltime > day: 8 days = divmod(alltime, day) 9 return "%d 天 %s" % (int(days[0]), changetime(days[1])) 10 elif alltime > hour: 11 hours = divmod(alltime, hour) 12 return \'%d 小时 %s\' % (int(hours[0]), changetime(hours[1])) 13 else: 14 mins = divmod(alltime, min) 15 return "%d 分钟 %d 秒" % (int(mins[0]), math.ceil(mins[1]))
5、计算视频时长
1 # coding: utf-8 2 import os 3 import datetime 4 from moviepy.editor import VideoFileClip 5 6 7 class FileCheck(object): 8 def __init__(self, filename): 9 self.filename = filename 10 11 def time_convert(self, size): # 单位换算 12 m, h = 60, 60 ** 2 13 if size < m: 14 return datetime.timedelta(hours=00, minutes=00, seconds=int(size)) 15 if size < h: 16 return datetime.timedelta(hours=00, minutes=int(size / m), seconds=int(size % m)) 17 else: 18 return datetime.timedelta(hours=int(size / h), minutes=int(size % h / m), seconds=int(size % h % m)) 19 20 def get_file_times(self): 21 u""" 22 获取视频时长(s:秒) 23 """ 24 clip = VideoFileClip(self.filename) 25 file_time = self.time_convert(clip.duration) 26 return file_time 27 28 def get_filesize(self): 29 u""" 30 获取文件大小(M: 兆) 31 """ 32 file_byte = os.path.getsize(self.filename) 33 return self.size_convert(file_byte) 34 35 def size_convert(self, size): # 单位换算 36 K, M, G = 1024, 1024 ** 2, 1024 ** 3 37 if size >= G: 38 return str(size / G) + \'GB\' 39 elif size >= M: 40 return str(size / M) + \'MB\' 41 elif size >= K: 42 return str(size / K) + \'KB\' 43 else: 44 return str(size) + \'B\'