Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
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)
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
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)
Ejemplo n.º 6
0
 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']
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
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
Ejemplo n.º 9
0
    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,
        }
Ejemplo n.º 10
0
 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)
Ejemplo n.º 11
0
 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)
Ejemplo n.º 12
0
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)
Ejemplo n.º 13
0
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)
Ejemplo n.º 14
0
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)
Ejemplo n.º 15
0
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)
Ejemplo n.º 16
0
 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)
Ejemplo n.º 17
0
 def has_permission(self, request, view):
     if request.user.is_anonymous:
         raise ClientError('未登录', code=401)
     return True