CheckUserData.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. # -*- coding: utf-8 -*-
  2. from random import Random # 用于生成随机码
  3. from wsgiref.util import FileWrapper
  4. from django.utils.timezone import utc
  5. from django.views.decorators.csrf import csrf_exempt
  6. from django.views.generic import TemplateView
  7. from django.utils.decorators import method_decorator
  8. from django.contrib.auth.hashers import make_password
  9. from itsdangerous import URLSafeTimedSerializer as utsr # itsdangerous序列化
  10. import re, base64, json, traceback, random, string
  11. from qcloudsms_py.httpclient import HTTPError
  12. from qcloudsms_py import SmsSingleSender
  13. from qcloudsms_py import SmsVoiceVerifyCodeSender, SmsVoicePromptSender
  14. from Model.models import Auth_Captcha,Device_User
  15. from Ansjer.settings import BASE_DIR
  16. from Object.ResponseObject import ResponseObject
  17. import datetime,os
  18. from Ansjer.config import TX_PHONE_APP_KEY,TX_PHONE_APP_ID
  19. from django.http import HttpResponse
  20. #生成随机字符串
  21. def RandomStr(randomlength = 8, number = False):
  22. str = ''
  23. if number == False:
  24. characterSet = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsT' \
  25. 'tUuVvWwXxYyZz0123456789'
  26. else:
  27. characterSet = '0123456789'
  28. length = len(characterSet) - 1
  29. random = Random()
  30. for index in range(randomlength):
  31. str += characterSet[random.randint(0, length)]
  32. return str
  33. class MobiletoResetPwdView(TemplateView):
  34. @method_decorator(csrf_exempt)
  35. def dispatch(self, *args, **kwargs):
  36. return super(MobiletoResetPwdView, self).dispatch(*args, **kwargs)
  37. def get(self, request, *args, **kwargs):
  38. request.encoding = 'gb2312'
  39. userName = request.POST.get('userName', None)
  40. authCode = request.POST.get('identifyingCode', None)
  41. newPwd = request.POST.get('newPwd', None)
  42. return self.ValidationError(userName, newPwd, authCode)
  43. def post(self, request, *args, **kwargs):
  44. request.encoding = 'utf-8'
  45. userName = request.GET.get('userName', None)
  46. authCode = request.GET.get('identifyingCode', None)
  47. newPwd = request.GET.get('newPwd', None)
  48. return self.ValidationError(userName, newPwd, authCode)
  49. def ValidationError(self, userName, newPwd, authCode):
  50. response = ResponseObject()
  51. if userName != None and authCode != None and newPwd != None:
  52. return self.MobiletoResetPwd(userName, authCode, newPwd, response)
  53. else:
  54. return response.json(800)
  55. def MobiletoResetPwd(self, userName, authCode, newPwd,response):
  56. UserValid = Device_User.objects.filter(username = userName).order_by('-data_joined')
  57. if UserValid:
  58. Users = Auth_Captcha.objects.filter(username = userName).order_by('-sendtime')
  59. if Users:
  60. for User in Users:
  61. if User.authcaptca == authCode and User.sendtype == 'forget':
  62. now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
  63. timeValid = (now_time - User.sendtime).total_seconds()
  64. if timeValid < 300:
  65. is_flag = UserValid.update(password=make_password(newPwd))
  66. if is_flag:
  67. return (0)
  68. else:
  69. return response.json(405)
  70. else:
  71. return response.json(120)
  72. else:
  73. return response.json(102)
  74. def date_handler(obj):
  75. return obj.isoformat()
  76. class TokenLink:
  77. '''
  78. 1. security_key就是settings.py中设置的SECRET_KEY
  79. 2. generate_validate_token函数通过URLSafeTimedSerializer
  80. 在用户注册时生成一个令牌。用户名在令牌中被编了码。生成令牌之后,
  81. 会将带有token的验证链接发送到注册邮箱。
  82. 3.在confirm_validate_token函数中,只要令牌没过期,
  83. 那它就会返回一个用户名,过期时间为3600秒
  84. '''
  85. def __init__(self, security_key):
  86. self.security_key = security_key
  87. self.salt = base64.encodestring(security_key.encode())
  88. def generate_validate_token(self, token):
  89. serializer = utsr(self.security_key)
  90. return serializer.dumps(token, self.salt)
  91. def confirm_validate_token(self, token, expiration=3600):
  92. serializer = utsr(self.security_key)
  93. return serializer.loads(token, salt=self.salt, max_age=expiration)
  94. def remove_validate_token(self, token):
  95. serializer = utsr(self.security_key)
  96. return serializer.loads(token, salt=self.salt)
  97. class getRandom:
  98. def __init__(self):
  99. self.__seed = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGH' \
  100. 'IJKLMNOPQRSTUVWXYZ!@#$%^&*()_+=-'
  101. def getSalt (self, strlen = 8):
  102. sa = []
  103. for index in range (strlen):
  104. sa.append(random.choice(self.__seed))
  105. salt = ''.join(sa)
  106. return salt
  107. def getSaltStr(self, strlen = 8):
  108. salt = ''.join(random.sample(string.ascii_letters + string.digits, strlen))
  109. return salt
  110. class ModifyPwdView(TemplateView):
  111. @method_decorator(csrf_exempt)
  112. def dispatch(self, *args, **kwargs):
  113. return super(ModifyPwdView, self).dispatch(*args, **kwargs)
  114. def post(self, request, *args, **kwargs):
  115. request.encoding = 'utf-8'
  116. userEmail = request.POST.get('userEmail', None)
  117. oldPwd = request.POST.get('oldPwd', None)
  118. newPwd = request.POST.get('newPwd', None)
  119. return self.ValidationError(userEmail, oldPwd, newPwd)
  120. def get(self, request, *args, **kwargs):
  121. request.encoding = 'gb2312'
  122. userEmail = request.GET.get('userEmail', None)
  123. oldPwd = request.GET.get('oldPwd', None)
  124. newPwd = request.GET.get('newPwd', None)
  125. return self.ValidationError(userEmail, oldPwd, newPwd)
  126. def ValidationError(self, userEmail, oldPwd, newPwd):
  127. response = ResponseObject()
  128. dataValid = DataValid()
  129. if dataValid.password_validate(newPwd):
  130. if oldPwd != newPwd:
  131. return response.json(118)
  132. try:
  133. User = Device_User.objects.get(userEmail = userEmail)
  134. User.userPwd = make_password(newPwd)
  135. User.save()
  136. except Exception as e:
  137. errorInfo = traceback.format_exc()
  138. print('更新密码到数据库: %s' % errorInfo)
  139. return response.json(501,{'msg':repr(e)})
  140. else:
  141. return response.json(0)
  142. else:
  143. return response.json(109)
  144. class DataValid:
  145. def __init__(self):
  146. # 用户名正则
  147. # self.re_name = re.compile(r'^[A-Za-z0-9\u4e00-\u9fa5\.\_]{1,16}$')
  148. self.re_name = re.compile(r'^[A-Za-z0-9\u4e00-\u9fa5\.\_\-\@]{4,40}$')
  149. # 密码强度正则
  150. self.re_password = re.compile(r'^\w{1,16}$')
  151. # 手机号码正则
  152. self.re_mobile = re.compile(r'^\d{1,16}$')
  153. # 邮箱地址正则
  154. self.re_email = re.compile(r'^[A-Za-z0-9\u4e00-\u9fa5\.\_\-]+@[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)+$')
  155. def name_validate(self, value):
  156. if self.re_name.match(value):
  157. return True
  158. else:
  159. return False
  160. def password_validate(self, value):
  161. if self.re_password.match(value):
  162. return True
  163. else:
  164. return False
  165. def email_validate(self, value):
  166. if self.re_email.match(value):
  167. return True
  168. else:
  169. return False
  170. def mobile_validate(self, value):
  171. if self.re_mobile.match(value):
  172. return True
  173. else:
  174. return False
  175. def sms(phoneNumbers, sendModel, msg, sendType = 'register', template_id = 7839):
  176. appid = TX_PHONE_APP_ID
  177. appkey = TX_PHONE_APP_KEY
  178. print(phoneNumbers, msg, sendModel, template_id)
  179. ssender = SmsSingleSender(appid, appkey)
  180. response = ResponseObject()
  181. try:
  182. if sendType == 'register':
  183. result = ssender.send(0, "86", phoneNumbers, u"{authCode}为您的注册验证码,请于2分钟内填写。"
  184. u"如非本人操作,请忽略本短信。".format(authCode=msg), "", "")
  185. elif sendType == 'forget':
  186. result = ssender.send(0, "86", phoneNumbers, u"{userPwd}为您的账号新密码,请登录账号后,修改为"
  187. u"用户自定义密码.".format(userPwd=msg), "", "")
  188. except HTTPError as e:
  189. errorInfo = traceback.format_exc()
  190. print('发送手机验证码出现网络错误: %s' % errorInfo)
  191. return response.json(1022,{'msg':repr(e)})
  192. except Exception as e:
  193. errorInfo = traceback.format_exc()
  194. print('发送手机短信验证码错误: %s' % errorInfo)
  195. return response.json(1021)
  196. else:
  197. resultCode = result.get('result', None)
  198. if resultCode == 0:
  199. JSON = json.dumps(result, ensure_ascii=False)
  200. return JSON
  201. else:
  202. errorJSON = json.dumps(result, ensure_ascii=False)
  203. return errorJSON
  204. class QCloudSms(object):
  205. def __init__(self, nationcode, msg, template_id):
  206. self.appid = TX_PHONE_APP_ID
  207. self.appkey = TX_PHONE_APP_KEY
  208. self.msg = msg # 验证码msg
  209. self.nationcode = nationcode # 国家码
  210. self.template_id = template_id # 模板ID
  211. def sms(self, mobiles, model, type = 'register'):
  212. response = ResponseObject()
  213. ssender = SmsSingleSender(self.appid, self.appkey)
  214. try:
  215. if type == 'register':
  216. result = ssender.send(0, "86", mobiles, u"{authCode}为您的注册验证码,请于2分钟内填写。"
  217. u"如非本人操作,请忽略本短信。".format(authCode= self.msg), "", "")
  218. elif type == 'forget':
  219. result = ssender.send(0, "86", mobiles, u"{userPwd}为您的账号新密码,请登录账号后,修改为"
  220. u"用户自定义密码.".format(userPwd = self.msg), "", "")
  221. except HTTPError as e:
  222. errorInfo = traceback.format_exc()
  223. print('发送手机短信验证码出现网络错误: %s' % errorInfo)
  224. return response.json(1022,repr(e))
  225. except Exception as e:
  226. errorInfo = traceback.format_exc()
  227. print('发送手机验证码错误: %s' % errorInfo)
  228. return response.formal(1021,repr(e))
  229. else:
  230. resultCode = result.get('result', None)
  231. if resultCode == 0:
  232. JSON = json.dumps(result, ensure_ascii=False)
  233. return JSON
  234. else:
  235. errorJSON = json.dumps(result, ensure_ascii=False)
  236. return errorJSON
  237. def voice(self, mobiles, model, type = 'register'):
  238. # 语音验证码请求
  239. response = ResponseObject()
  240. vvcsender = SmsVoiceVerifyCodeSender(appid = self.appid, appkey = self.appkey)
  241. try:
  242. result = vvcsender.send(nation_code=self.nationcode, phone_number = \
  243. mobiles, playtimes = 2, msg = self.msg, ext = '')
  244. except HTTPError as e:
  245. errorInfo = traceback.format_exc()
  246. print('发送手机验证码出现网络错误: %s' % errorInfo)
  247. return response.formal(1022,repr(e))
  248. except Exception as e:
  249. errorInfo = traceback.format_exc()
  250. print('发送手机语音验证码错误: %s' % errorInfo)
  251. return response.formal(1023,repr(e))
  252. else:
  253. resultCode = result.get('result', None)
  254. if resultCode == 0:
  255. JSON = json.dumps(result, ensure_ascii=False)
  256. return JSON
  257. else:
  258. errorJSON = json.dumps(result, ensure_ascii=False)
  259. return errorJSON
  260. # 发送语音通知
  261. vpsender = SmsVoicePromptSender(appid=self.appid, appkey=self.appkey)
  262. # note: msg内容,首先需要申请内容模板,通过后才可以发送
  263. try:
  264. result = vpsender.send(nation_code=self.nationcode, phone_number = \
  265. mobiles, playtimes = 2, msg = self.msg, ext= '')
  266. except HTTPError as e:
  267. errorInfo = traceback.format_exc()
  268. print('发送手机验证码出现网络错误: %s' % errorInfo)
  269. return ResponseFormal(1022,repr(e))
  270. except Exception as e:
  271. errorInfo = traceback.format_exc()
  272. print('发送手机语音验证码错误: %s' % errorInfo)
  273. return ResponseFormal(1023,repr(e))
  274. else:
  275. resultCode = result.get('result', None)
  276. if resultCode == 0:
  277. JSON = json.dumps(result, ensure_ascii=False)
  278. return JSON
  279. else:
  280. errorJSON = json.dumps(result, ensure_ascii=False)
  281. return errorJSON
  282. @csrf_exempt
  283. def download_file(request, Upgradename, *callback_args, **callback_kwargs):
  284. """
  285. 下载单个文件
  286. :param request:
  287. :param Upgradename:
  288. :param callback_args:
  289. :param callback_kwargs:
  290. :return:
  291. """
  292. print(Upgradename)
  293. print(callback_args, callback_kwargs)
  294. for value in callback_args:
  295. print("other args:", value)
  296. # 打印dict类型的不定长参数 args
  297. for key in callback_kwargs:
  298. print("dictargs:" + key + ":" + bytes(callback_kwargs[key]))
  299. print(request.body)
  300. file_name = os.path.join(BASE_DIR, "static/Upgrade/DVR/").replace('\\', '/') + Upgradename
  301. response = ResponseObject()
  302. if os.path.isfile(file_name):
  303. try:
  304. print(file_name)
  305. JSON = response.formal(0)
  306. wrapper = FileWrapper(open(file_name, 'rb'))
  307. response = HttpResponse(wrapper, content_type="application/octet-stream")
  308. response['Content-Length'] = os.path.getsize(file_name)
  309. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(file_name)
  310. response['Content-Error'] = JSON
  311. return response
  312. except Exception as e:
  313. errorJSON = response.formal(10,'Wrong reason:' + repr(e))
  314. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  315. response['Content-Error'] = errorJSON
  316. return response
  317. else:
  318. errorJSON = response.formal(907)
  319. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  320. response['Content-Error'] = errorJSON
  321. return response