CheckUserData.py 16 KB

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