def post(self, request, *args, **kwargs): """ 注册新用户 """ # 验证码校验 code = request.POST.get('code') mobile = request.POST.get('mobile') if (not code) or (not mobile): raise ClientError('手机或验证码未填写', code=400) if not tencent_sms_service.check_sms('register', mobile, code): raise ClientError('短信验证码错误', code=401) # 创建用户 return self.create(request, *args, **kwargs)
def check_captcha(request): """ 验证验证码正确性,单独调用可能会通过修改 html 跳过这个步骤 应该放在 login 内,如果验证码错误就不返回 access_token """ sign = request.post.get('sign') code = request.post.get('code').lower() right_code = cache.get(f'captcha:{sign}') if right_code is None: raise ClientError('验证码超时,请刷新重试') if right_code != code: cache.delete(f'captcha:{sign}') raise ClientError('验证码错误') return Response(request, 0)
def show_streams(request): """ 查看多媒体文件的流信息(list) index 序号 codec_name 编码名 codec_long_name profile level width 视频画面大小 height 视频画面大小 has_b_frame r_frame_rate 能够准确表示所有时间戳的最低帧速率, 整个视频帧率的最小公倍数 例如 第一秒为 2帧/秒 第三秒为 3帧/秒, 该值为 6(6帧/秒 才可以表示所有帧的时间戳) avg_frame_rate 平均帧率(帧/s) bit_rate 码率(bps) codec_type video/audio/subtitle time_base 时间戳计算基础单位 duration_ts duration_ts * time_base = duration 视频时间长度 codec_time_base 编码的时间戳计算基础单位 """ try: data = ffmpeg.probe(request.post.get('url'), show_streams=None).get('streams') except ffmpeg.Error: raise ClientError('多媒体文件错误') return Response(request, 0, data=data)
def reset_password(request): username = request.post.get('username') mobile = request.post.get('mobile') new_password = request.post.get('new_password') code = request.post.get('code') try: user = UserModel.objects.get(username=username, mobile=mobile, is_active=1) except UserModel.DoesNotExist: raise ClientError('账号不存在或手机错误', code=401) if not tencent_sms_service.check_sms('reset_password', mobile, code): raise ClientError('验证码错误', code=401) user.set_password(new_password) user.save(update_fields=['password']) return Response(request, 0)
def general_recognition(request): url = request.post.get('url') try: result = vision_service.image_detect(url) except KeyError: raise ClientError('图片格式错误') return Response(request, 0, data=result)
def user_list(self, group_id='default'): data = { 'group_id': group_id, } response = self.post('fcgi-bin/face/face_getpersonids', data=data) if response['msg'] != 'ok': raise ClientError(response['msg'], code=1) return response['data']['person_ids']
def modify_password(request): password = request.post.get('password') new_password = request.post.get('new_password') if not request.user.check_password(password): raise ClientError('原密码错误', code=401) request.user.set_password(new_password) request.user.save(update_fields=['password']) return Response(request, 0)
def request(self, interface: str, data: Union[dict, list] = None, headers=None, method=None): url = f'{self.base_url}{interface}' if isinstance(data, list) or isinstance(data, dict): pretty_data = json.dumps(protect_dict_or_list(data), indent=2, sort_keys=True, ensure_ascii=False) else: pretty_data = str(data) logger.info('request_send', extra={ 'uri': url, 'method': 'POST', 'request': pretty_data, }) time_begin = xtime.now() if isinstance(data, list): if method == 'POST': response = requests.post(url, json=data, headers=headers) else: response = requests.get(url, json=data, headers=headers) else: if method == 'POST': response = requests.post(url, data=data, headers=headers) else: response = requests.get(url, data=data, headers=headers) time_cost = xtime.now() - time_begin # 检查返回值 if response.status_code >= 400: raise ClientError('服务器连接错误,请稍后再试') try: result = json.loads(response.text) except AttributeError: result = response if isinstance(result, dict): pretty_result = json.dumps(protect_dict_or_list(result), indent=2, sort_keys=True, ensure_ascii=False) else: pretty_result = str(result) logger.info('request_receive', extra={ 'uri': url, 'duration': str(time_cost.total_seconds()), 'response': pretty_result, }) return response
def user_add(self, url, user_name, group_id='default', user_id=None): # 检测人脸合格 detect_dict = self.face_detect(url) for i in detect_dict: if not detect_dict[i]: raise ClientError(f'{i} 人脸检测不通过') # 检测人脸重复 search = self.user_search(url) for i in search: if isinstance(search[i], dict) and search[i].get('score', 0) > 80: raise ClientError('人脸已经存在', 1) # 录入人脸 user_id = user_id or random_string() image_base64 = base64.b64encode(requests.get(url).content) user_add_list = [] face_token = None for i in self.face_service_list: response = self.face_service_list[i].user_add( image_base64, user_name, group_id, user_id) if not response: for j in user_add_list: self.face_service_list[j].user_remove(user_id) raise ClientError(f'{i} 录入失败', 1) # 百度需要记录 face_token if i == 'baidu': face_token = response['face_token'] user_add_list.append(i) # 写入数据库 FaceUser.objects.create(user_name=user_name, user_id=user_id, face_image=url, group_id=group_id, face_token=face_token) return { 'user_id': user_id, 'group_id': group_id, 'user_name': user_name, }
def get(self, request): """ 获得用户信息 """ # 登录校验 if request.user.is_anonymous: raise ClientError('未登录', code=401) data = { 'username': request.user.username, 'last_login': xtime.to_strtime(request.user.last_login), } return Response(request, 0, data=data)
def post(self, request, *args, **kwargs): try: serializer = self.serializer_class( data=request.data, context=self.get_serializer_context()) serializer.is_valid(raise_exception=True) except exceptions.AuthenticationFailed: raise ClientError('用户名或密码错误', code=401) token = csrf.get_token(request) serializer.validated_data['csrf_token'] = token UserSerializer.login(serializer.user) # 内部调用使用 request.do_request 代替 requests 以保持 rid 一致 # request.do_request.get('http://127.0.0.1:8000/account/user/') return Response(request, 0, **serializer.validated_data)
def score_get(request): dict_kanji = DictKanjiItem.objects.exclude(score__account=request.user).select_related('kana').first() if not dict_kanji: raise ClientError('没有新的项目', code=100) data = { 'kanji_id': dict_kanji.id, 'kana': dict_kanji.kana.kana, 'kanji': dict_kanji.kanji, 'imi': dict_kanji.imi, 'hinnsi': dict_kanji.hinnsi, 'rei': dict_kanji.rei, } return Response(request, 0, data=data)
def general_ocr(request): url = request.post.get('url') lang = request.post.get('lang') try: result = ocr_service.ocr_general(url, lang) except KeyError: raise ClientError('图片格式错误', code=401) # return Response(request, 0, data='图片格式错误') data = '' # for i in result: # data += f'{i["words"]}\n' return Response(request, 0, data=result)
def score_review(request): today = to_date(now()) dict_score = DictScore.objects.filter(account=request.user, next_date=today).select_related('kanji', 'kanji__kana').first() if not dict_score: raise ClientError('没有新的项目', code=100) data = { 'id': dict_score.id, 'kanji_id': dict_score.kanji.id, 'kana': dict_score.kanji.kana.kana, 'kanji': dict_score.kanji.kanji, 'imi': dict_score.kanji.imi, 'hinnsi': dict_score.kanji.hinnsi, 'rei': dict_score.kanji.rei, } return Response(request, 0, data=data)
def show_format(request): """ 查看多媒体的封装格式 nb_stream 包含的流的个数 (show_streams) nb_programs 节目数 format_name 使用的封装模块的名称 format_long_name start_time 媒体文件的起始时间 duration 媒体文件的总时间长度 size 媒体文件的大小 bit_rate 媒体文件的码率 """ try: data = ffmpeg.probe(request.post.get('url'), show_format=None).get('format') except ffmpeg.Error: raise ClientError('多媒体文件错误') return Response(request, 0, data=data)
def _sms_sender(request): mobile = request.POST.get('mobile') if (not mobile) or (action not in ACTION_RANGE): return ClientError('请输入手机号码', code=400) tencent_sms_service.send_sms(action, mobile) return Response(request, 0)
def has_permission(self, request, view): if request.user.is_anonymous: raise ClientError('未登录', code=401) return True