123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 |
- # -*- coding: utf-8 -*-
- from random import Random # 用于生成随机码
- from wsgiref.util import FileWrapper
- from django.utils.timezone import utc
- from django.views.decorators.csrf import csrf_exempt
- from django.views.generic import TemplateView, View
- from django.utils.decorators import method_decorator
- from django.contrib.auth.hashers import make_password
- from django.shortcuts import HttpResponseRedirect
- from itsdangerous import URLSafeTimedSerializer as utsr # itsdangerous序列化
- import re, base64, json, traceback, random, string
- from qcloudsms_py.httpclient import HTTPError
- from qcloudsms_py import SmsSingleSender
- from qcloudsms_py import SmsVoiceVerifyCodeSender, SmsVoicePromptSender
- from Ansjer.settings import *
- from Model.models import Email_Captcha, Device_User, Auth_Captcha
- from Service.ResponseService import *
- #生成随机字符串
- def RandomStr(randomlength = 8, number = False):
- str = ''
- if number == False:
- characterSet = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsT' \
- 'tUuVvWwXxYyZz0123456789'
- else:
- characterSet = '0123456789'
- length = len(characterSet) - 1
- random = Random()
- for index in range(randomlength):
- str += characterSet[random.randint(0, length)]
- return str
- def Active_User(request, token):
- tokenConfirm = TokenLink(SECRET_KEY)
- try:
- username = tokenConfirm.confirm_validate_token(token)
- except:
- return ResponseJSON(1000)
- try:
- UserValid = Device_User.objects.get(userName=username)
- except Device_User.DoesNotExist:
- return ResponseJSON(113)
- UserValid = Device_User.objects.get(username=username)
- UserValid.is_active = True
- UserValid.user_isValid = True
- UserValid.save()
- return ResponseJSON(0)
- class MobiletoResetPwdView(TemplateView):
- @method_decorator(csrf_exempt)
- def dispatch(self, *args, **kwargs):
- return super(MobiletoResetPwdView, self).dispatch(*args, **kwargs)
- def get(self, request, *args, **kwargs):
- request.encoding = 'gb2312'
- userName = request.POST.get('userName', None)
- authCode = request.POST.get('identifyingCode', None)
- newPwd = request.POST.get('newPwd', None)
- return self.ValidationError(userName, newPwd, authCode)
- def post(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- userName = request.GET.get('userName', None)
- authCode = request.GET.get('identifyingCode', None)
- newPwd = request.GET.get('newPwd', None)
- return self.ValidationError(userName, newPwd, authCode)
- def ValidationError(self, userName, newPwd, authCode):
- if userName != None and authCode != None and newPwd != None:
- return self.MobiletoResetPwd(userName, authCode, newPwd)
- else:
- return ResponseJSON(800)
- def MobiletoResetPwd(self, userName, authCode, newPwd):
- UserValid = Device_User.objects.filter(username = userName).order_by('-data_joined')
- if UserValid:
- Users = Auth_Captcha.objects.filter(username = userName).order_by('-sendtime')
- if Users:
- for User in Users:
- if User.authcaptca == authCode and User.sendtype == 'forget':
- now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
- timeValid = (now_time - User.sendtime).total_seconds()
- if timeValid < 300:
- is_flag = UserValid.update(password=make_password(newPwd))
- if is_flag:
- return ResponseJSON(0)
- else:
- return ResponseJSON(405)
- else:
- return ResponseJSON(120)
- else:
- return ResponseJSON(102)
- def date_handler(obj):
- return obj.isoformat()
- class ActiveUserView(View):
- """账户激活的View"""
- @method_decorator(csrf_exempt)
- def dispatch(self, *args, **kwargs):
- return super(ActiveUserView, self).dispatch(*args, **kwargs)
- def get(self, request, active_code):
- # 用code在数据库中过滤处信息
- all_records = Email_Captcha.objects.filter(userCaptcha = active_code)
- if all_records:
- for record in all_records:
- # 通过邮箱查找到对应的用户
- userEmail = record.userEmail
- user = Device_User.objects.get(userEmail = userEmail)
- Device_User.objects.filter(userEmail = userEmail).update(user_isValid=True, is_active = True)
- response = HttpResponseRedirect('/login/')
- return response
- class TokenLink:
- '''
- 1. security_key就是settings.py中设置的SECRET_KEY
- 2. generate_validate_token函数通过URLSafeTimedSerializer
- 在用户注册时生成一个令牌。用户名在令牌中被编了码。生成令牌之后,
- 会将带有token的验证链接发送到注册邮箱。
- 3.在confirm_validate_token函数中,只要令牌没过期,
- 那它就会返回一个用户名,过期时间为3600秒
- '''
- def __init__(self, security_key):
- self.security_key = security_key
- self.salt = base64.encodestring(security_key.encode())
- def generate_validate_token(self, token):
- serializer = utsr(self.security_key)
- return serializer.dumps(token, self.salt)
- def confirm_validate_token(self, token, expiration=3600):
- serializer = utsr(self.security_key)
- return serializer.loads(token, salt=self.salt, max_age=expiration)
- def remove_validate_token(self, token):
- serializer = utsr(self.security_key)
- return serializer.loads(token, salt=self.salt)
- class getRandom:
- def __init__(self):
- self.__seed = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGH' \
- 'IJKLMNOPQRSTUVWXYZ!@#$%^&*()_+=-'
- def getSalt (self, strlen = 8):
- sa = []
- for index in range (strlen):
- sa.append(random.choice(self.__seed))
- salt = ''.join(sa)
- return salt
- def getSaltStr(self, strlen = 8):
- salt = ''.join(random.sample(string.ascii_letters + string.digits, strlen))
- return salt
- class ModifyPwdView(TemplateView):
- @method_decorator(csrf_exempt)
- def dispatch(self, *args, **kwargs):
- return super(ModifyPwdView, self).dispatch(*args, **kwargs)
- def post(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- userEmail = request.POST.get('userEmail', None)
- oldPwd = request.POST.get('oldPwd', None)
- newPwd = request.POST.get('newPwd', None)
- return self.ValidationError(userEmail, oldPwd, newPwd)
- def get(self, request, *args, **kwargs):
- request.encoding = 'gb2312'
- userEmail = request.GET.get('userEmail', None)
- oldPwd = request.GET.get('oldPwd', None)
- newPwd = request.GET.get('newPwd', None)
- return self.ValidationError(userEmail, oldPwd, newPwd)
- def ValidationError(self, userEmail, oldPwd, newPwd):
- dataValid = DataValid()
- if dataValid.password_validate(newPwd):
- if oldPwd != newPwd:
- return ResponseJSON(118)
- try:
- User = Device_User.objects.get(userEmail = userEmail)
- User.userPwd = make_password(newPwd)
- User.save()
- except Exception as e:
- errorInfo = traceback.format_exc()
- print('更新密码到数据库: %s' % errorInfo)
- return ResponseJSON(501,{'msg':repr(e)})
- else:
- return ResponseJSON(0)
- else:
- return ResponseJSON(109)
- class DataValid:
- def __init__(self):
- # 用户名正则
- # self.re_name = re.compile(r'^[A-Za-z0-9\u4e00-\u9fa5\.\_]{1,16}$')
- self.re_name = re.compile(r'^[A-Za-z0-9\u4e00-\u9fa5\.\_\-\@]{4,40}$')
- # 密码强度正则
- self.re_password = re.compile(r'^\w{1,16}$')
- # 手机号码正则
- self.re_mobile = re.compile(r'^\d{1,16}$')
- # 邮箱地址正则
- self.re_email = re.compile(r'^[A-Za-z0-9\u4e00-\u9fa5\.\_\-]+@[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)+$')
- def name_validate(self, value):
- if self.re_name.match(value):
- return True
- else:
- return False
- def password_validate(self, value):
- if self.re_password.match(value):
- return True
- else:
- return False
- def email_validate(self, value):
- if self.re_email.match(value):
- return True
- else:
- return False
- def mobile_validate(self, value):
- if self.re_mobile.match(value):
- return True
- else:
- return False
- def sms(phoneNumbers, sendModel, msg, sendType = 'register', template_id = 7839):
- appid = SDK_AppID
- appkey = App_Key
- print(phoneNumbers, msg, sendModel, template_id)
- ssender = SmsSingleSender(appid, appkey)
- try:
- if sendType == 'register':
- result = ssender.send(0, "86", phoneNumbers, u"{authCode}为您的注册验证码,请于2分钟内填写。"
- u"如非本人操作,请忽略本短信。".format(authCode=msg), "", "")
- elif sendType == 'forget':
- result = ssender.send(0, "86", phoneNumbers, u"{userPwd}为您的账号新密码,请登录账号后,修改为"
- u"用户自定义密码.".format(userPwd=msg), "", "")
- except HTTPError as e:
- errorInfo = traceback.format_exc()
- print('发送手机验证码出现网络错误: %s' % errorInfo)
- return ResponseFormal(1022,{'msg':repr(e)})
- except Exception as e:
- errorInfo = traceback.format_exc()
- print('发送手机短信验证码错误: %s' % errorInfo)
- return ResponseFormal(1021)
- else:
- resultCode = result.get('result', None)
- if resultCode == 0:
- JSON = json.dumps(result, ensure_ascii=False)
- return JSON
- else:
- errorJSON = json.dumps(result, ensure_ascii=False)
- return errorJSON
- class QCloudSms(object):
- def __init__(self, nationcode, msg, template_id):
- self.appid = SDK_AppID
- self.appkey = App_Key
- self.msg = msg # 验证码msg
- self.nationcode = nationcode # 国家码
- self.template_id = template_id # 模板ID
- def sms(self, mobiles, model, type = 'register'):
- ssender = SmsSingleSender(self.appid, self.appkey)
- try:
- if type == 'register':
- result = ssender.send(0, "86", mobiles, u"{authCode}为您的注册验证码,请于2分钟内填写。"
- u"如非本人操作,请忽略本短信。".format(authCode= self.msg), "", "")
- elif type == 'forget':
- result = ssender.send(0, "86", mobiles, u"{userPwd}为您的账号新密码,请登录账号后,修改为"
- u"用户自定义密码.".format(userPwd = self.msg), "", "")
- except HTTPError as e:
- errorInfo = traceback.format_exc()
- print('发送手机短信验证码出现网络错误: %s' % errorInfo)
- return ResponseFormal(1022,repr(e))
- except Exception as e:
- errorInfo = traceback.format_exc()
- print('发送手机验证码错误: %s' % errorInfo)
- return ResponseFormal(1021,repr(e))
- else:
- resultCode = result.get('result', None)
- if resultCode == 0:
- JSON = json.dumps(result, ensure_ascii=False)
- return JSON
- else:
- errorJSON = json.dumps(result, ensure_ascii=False)
- return errorJSON
- def voice(self, mobiles, model, type = 'register'):
- # 语音验证码请求
- vvcsender = SmsVoiceVerifyCodeSender(appid = self.appid, appkey = self.appkey)
- try:
- result = vvcsender.send(nation_code=self.nationcode, phone_number = \
- mobiles, playtimes = 2, msg = self.msg, ext = '')
- except HTTPError as e:
- errorInfo = traceback.format_exc()
- print('发送手机验证码出现网络错误: %s' % errorInfo)
- return ResponseFormal(1022,repr(e))
- except Exception as e:
- errorInfo = traceback.format_exc()
- print('发送手机语音验证码错误: %s' % errorInfo)
- return ResponseFormal(1023,repr(e))
- else:
- resultCode = result.get('result', None)
- if resultCode == 0:
- JSON = json.dumps(result, ensure_ascii=False)
- return JSON
- else:
- errorJSON = json.dumps(result, ensure_ascii=False)
- return errorJSON
- # 发送语音通知
- vpsender = SmsVoicePromptSender(appid=self.appid, appkey=self.appkey)
- # note: msg内容,首先需要申请内容模板,通过后才可以发送
- try:
- result = vpsender.send(nation_code=self.nationcode, phone_number = \
- mobiles, playtimes = 2, msg = self.msg, ext= '')
- except HTTPError as e:
- errorInfo = traceback.format_exc()
- print('发送手机验证码出现网络错误: %s' % errorInfo)
- return ResponseFormal(1022,repr(e))
- except Exception as e:
- errorInfo = traceback.format_exc()
- print('发送手机语音验证码错误: %s' % errorInfo)
- return ResponseFormal(1023,repr(e))
- else:
- resultCode = result.get('result', None)
- if resultCode == 0:
- JSON = json.dumps(result, ensure_ascii=False)
- return JSON
- else:
- errorJSON = json.dumps(result, ensure_ascii=False)
- return errorJSON
- def upload_file(request):
- """
- 文件接收
- :param request: 请求
- :return:
- """
- if request.method == "POST": # 请求方法为POST时,进行处理
- upFile =request.FILES.get("upfile", None) # 获取上传的文件,如果没有文件,则默认为None
- if not upFile:
- return HttpResponse("no files for upload!")
- else:
- upgradePath = os.path.join(MEDIA_URL, '/Upgrade/IPC/')
- destination = open(os.path.join(upgradePath, upFile.name), 'wb+') # 打开特定的文件进行二进制的写操作
- for chunk in upFile.chunks(): # 分块写入文件
- destination.write(chunk)
- destination.close()
- return HttpResponse("upload over!")
- @csrf_exempt
- def download_file(request, Upgradename, *callback_args, **callback_kwargs):
- """
- 下载单个文件
- :param request:
- :param Upgradename:
- :param callback_args:
- :param callback_kwargs:
- :return:
- """
- print(Upgradename)
- print(callback_args, callback_kwargs)
- for value in callback_args:
- print("other args:", value)
- # 打印dict类型的不定长参数 args
- for key in callback_kwargs:
- print("dictargs:" + key + ":" + bytes(callback_kwargs[key]))
- #received_json_data = json.loads(request.body)
- print(request.body)
- file_name = os.path.join(BASE_DIR, "static/Upgrade/DVR/").replace('\\', '/') + Upgradename
- if os.path.isfile(file_name):
- try:
- print(file_name)
- JSON = ResponseFormal(0)
- wrapper = FileWrapper(open(file_name, 'rb'))
- response = HttpResponse(wrapper, content_type="application/octet-stream")
- response['Content-Length'] = os.path.getsize(file_name)
- response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(file_name)
- response['Content-Error'] = JSON
- return response
- except Exception as e:
- errorJSON = ResponseFormal(10,'Wrong reason:' + repr(e))
- response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
- response['Content-Error'] = errorJSON
- return response
- else:
- errorJSON = ResponseFormal(907)
- response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
- response['Content-Error'] = errorJSON
- return response
|