Exemplo n.º 1
0
 def wrapper(request):
     try:
         return func(request)
     except Ratelimited:
         return process_response(request, ResponseStatus.FORBIDDEN)
     except Exception:
         return process_response(request, ResponseStatus.UNEXPECTED_ERROR)
Exemplo n.º 2
0
def get_my_gallery(request):
    num = request.GET.get('num')
    if not num:
        num = 1
    else:
        status = ValueErrorStatus.check_value_type({'num': num})
        if status is not None:
            return process_response(request, status)
        num = int(num)

    user = account_models.User.objects.filter(
        username=request.session.get('username')).first()
    photos = gallery_models.Photo.objects.filter(user=user).order_by('-id')

    paginator = Paginator(photos, settings.PHOTOS_PER_PAGE)
    total = paginator.num_pages

    if not 1 <= num <= total:
        return process_response(request, ResponseStatus.NUM_OUT_OF_RANGE_ERROR)

    page = paginator.page(num)

    photos_path = []
    for one in page.object_list:
        photos_path.append(one.path)

    request.data = {
        'photo': photos_path,
        'count': len(photos_path),
        'num': num,
        'has_next': page.has_next()
    }

    return process_response(request, ResponseStatus.OK)
Exemplo n.º 3
0
def change_password(request):
    json_data = request.json_data

    status = ValueErrorStatus.check_value_type(json_data)
    if status is not None:
        return process_response(request, status)

    # 新密码 new_password 格式验证
    new_password = json_data['new_password']
    status = validate_password(new_password)
    if status is not None:
        return process_response(request, status)

    # 用户 user 存在性验证
    username = json_data['username']
    user = account_models.User.objects.filter(
        Q(username=username) | Q(userinfo__email=username)).first()
    if not user:
        return process_response(request,
                                ResponseStatus.USERNAME_NOT_EXISTED_ERROR)

    # 密码 password 验证
    password = json_data['password']
    if check_password(password, user.password) is False:
        return process_response(request,
                                ResponseStatus.PASSWORD_NOT_MATCH_ERROR)

    # 修改密码 password
    user.password = make_password(new_password)
    user.save()

    return process_response(request, ResponseStatus.OK)
Exemplo n.º 4
0
def send_password_verify_code(request):
    json_data = request.json_data

    status = ValueErrorStatus.check_value_type(json_data)
    if status is not None:
        return process_response(request, status)

    # 用户 user 存在性验证
    username = json_data['username']
    user = account_models.User.objects.filter(
        Q(username=username) | Q(userinfo__email=username)).first()
    if not user:
        return process_response(request,
                                ResponseStatus.USERNAME_NOT_EXISTED_ERROR)

    # 生成随机数字验证码
    verify_code = generate_string(5, Pattern.Digits)

    # 填充邮件内容
    message = settings.VERIFY_CODE_MAIL_MESSAGE.format(code=verify_code,
                                                       username=username)

    email = user.info.email
    send(email, message)

    # 将验证码存入缓存 10 min 过期
    cache = get_redis_connection()
    cache.set('verify_code_' + email, verify_code, 10 * settings.MINUTE)

    return process_response(request, ResponseStatus.OK)
Exemplo n.º 5
0
def login(request):
    # 经过处理的 JSON 数据
    json_data = request.json_data

    status = ValueErrorStatus.check_value_type(json_data)
    if status is not None:
        return process_response(request, status)

    username = json_data['username']
    password = json_data['password']

    if request.session.get('username', '') == username:
        return process_response(request, ResponseStatus.OK)

    # 用户 user 存在性验证
    user = account_models.User.objects.filter(
        Q(username=username) | Q(userinfo__email=username)).first()
    if not user:
        return process_response(request,
                                ResponseStatus.USERNAME_NOT_EXISTED_ERROR)

    # 密码 password 验证
    if check_password(password, user.password) is False:
        return process_response(request,
                                ResponseStatus.PASSWORD_NOT_MATCH_ERROR)

    # 设置登陆状态
    request.session['username'] = user.username

    return process_response(request, ResponseStatus.OK)
Exemplo n.º 6
0
def get_all_post(request):
    num = request.GET.get('num')
    if not num:
        num = 1
    else:
        status = ValueErrorStatus.check_value_type({'num': num})
        if status is not None:
            return process_response(request, status)
        num = int(num)

    posts = post_models.Post.objects.all().order_by('-id')

    paginator = Paginator(posts, settings.POST_PER_PAGE)
    total = paginator.num_pages

    if not 1 <= num <= total:
        return process_response(request, ResponseStatus.NUM_OUT_OF_RANGE_ERROR)

    page = paginator.page(num)

    user = request.session.get('username', None)
    if user is not None:
        user = account_models.User.objects.filter(username=user).first()

    post_list = []
    for one in page.object_list:
        post_list.append({
            'username':
            one.user.info.nickname
            if one.user.info.nickname else one.user.username,
            'avatar':
            one.user.info.avatar.url,
            'content':
            one.content,
            'path':
            one.photo.path,
            'create_time':
            one.create_time.strftime('%Y-%m-%d %H:%M:%S'),
            'address':
            one.photo.address,
            'like':
            one.like,
            'post_id':
            one.id
        })

        if user:
            post_list[-1][
                'is_liked'] = True if post_models.LikeRecord.objects.filter(
                    user=user, post=one) else False

    request.data = {
        'post': post_list,
        'count': len(post_list),
        'num': num,
        'has_next': page.has_next()
    }

    return process_response(request, ResponseStatus.OK)
Exemplo n.º 7
0
 def wrapper(request):
     if isinstance(method, str):
         if request.method == method:
             return func(request)
         else:
             return process_response(request, ResponseStatus.REQUEST_METHOD_ERROR)
     elif isinstance(method, list):
         if request.method in method:
             return func(request)
         else:
             return process_response(request, ResponseStatus.REQUEST_METHOD_ERROR)
     else:
         return process_response(request, ResponseStatus.UNEXPECTED_ERROR)
Exemplo n.º 8
0
def status(request):
    if 'username' in request.session:
        user = account_models.User.objects.filter(
            username=request.session['username']).first()
        return process_response({
            'username': user.username,
            'avatar': user.info.avatar.url,
            'is_super': user.username == 'Leo',
            'status': True,
            'code': '000',
            'msg': '成功'
        })
    else:
        return process_response({'status': False, 'code': '000', 'msg': '成功'})
def add_comment(request):
    json_data = request.json_data

    content = json_data['content']
    if len(content) > 150:
        return process_response({'code': '142', 'msg': '评论过长'})

    user = account_models.User.objects.filter(
        username=request.session['username']).first()

    comm = comment_models.Comment(user=user, content=content)
    comm.save()

    return process_response({'code': '000', 'msg': '评论成功'})
def comment(request):
    if not request.method == "GET" and not request.method == "POST":
        return process_response({'code': '002', 'msg': '请求方法错误'})
    elif request.method == 'GET':
        return get_comments(request)
    else:
        return add_comment(request)
Exemplo n.º 11
0
    def process_request(self, request):
        if request.method == 'POST' and request.path_info in self.URL_REQUIRED_PARAMETERS:
            parameters = self.URL_REQUIRED_PARAMETERS[request.path_info]

            for param in parameters:
                if param not in request.json_data or not request.json_data[param]:
                    return process_response(parameters[param])
Exemplo n.º 12
0
def user_information(request):
    if not request.method == "GET" and not request.method == "POST":
        return process_response({'code': '002', 'msg': '请求方法错误'})
    elif request.method == 'GET':
        return get_user_info(request)
    else:
        return edit_user_info(request)
Exemplo n.º 13
0
        def wrapper(request):
            # JSON 解析
            if not hasattr(request, 'json_data') or not isinstance(request.json_data, dict):
                try:
                    request.json_data = json.loads(request.body)
                except json.JSONDecodeError:
                    request.json_data = None
                if request.json_data is None:
                    return process_response(request, ResponseStatus.JSON_DECODE_ERROR)

            # 参数存在性判断
            for param in parameters:
                if param not in request.json_data or request.json_data[param] == '':
                    return process_response(request, RequiredErrorStatus.get_required_error_status(param))

            # 正常处理
            return func(request)
Exemplo n.º 14
0
def change_nickname(request):
    json_data = request.json_data

    status = ValueErrorStatus.check_value_type(json_data)
    if status is not None:
        return process_response(request, status)

    nickname = json_data['nickname']
    if len(nickname) > 50:
        return process_response(request,
                                ResponseStatus.NICKNAME_LENGTH_TOO_LARGE_ERROR)

    user_info = account_models.User.objects.filter(
        username=request.session.get('username')).first().info
    user_info.nickname = nickname
    user_info.save()

    return process_response(request, ResponseStatus.OK)
Exemplo n.º 15
0
def test_get(request):
    cache = get_redis_connection('default')
    test_value = cache.get('test')
    if not test_value or len(test_value) > 200:
        test_value = 'Hello World'
        cache.set('test', test_value)

    request.data = {'test_value': test_value}

    return process_response(request, ResponseStatus.OK)
Exemplo n.º 16
0
def save_in_gallery(request):
    json_data = request.json_data

    status = ValueErrorStatus.check_value_type(json_data)
    if status is not None:
        return process_response(request, status)

    path = json_data['path']
    if len(path) > 100 or re.search(r'\.\.', path) or path[:9] != '/' + settings.PICTURE_PATH \
            or not os.path.exists('.' + path):
        return process_response(request,
                                ResponseStatus.IMAGE_PATH_NOT_FOUND_ERROR)

    longitude = json_data['longitude']
    latitude = json_data['latitude']
    address = ''
    if longitude != 0.0 and latitude != 0.0:
        try:
            result = requests.get(
                settings.BAIDU_ADDRESS_API_URL.format(longitude=longitude,
                                                      latitude=latitude))
            if result.status_code == 200:
                address = json.loads(
                    result.text)['result']['formatted_address']
        except Exception:
            address = ''

    user = account_models.User.objects.filter(
        username=request.session.get('username')).first()
    report = prediction_models.Report.objects.filter(path=path).first()

    if gallery_models.Photo.objects.filter(user=user, path=path):
        return process_response(request, ResponseStatus.PHOTO_EXISTED_ERROR)

    photo = gallery_models.Photo(user=user,
                                 path=path,
                                 report=report,
                                 address=address,
                                 latitude=latitude,
                                 longitude=longitude)
    photo.save()

    return process_response(request, ResponseStatus.OK)
Exemplo n.º 17
0
def change_avatar(request):
    json_data = request.json_data

    status = ValueErrorStatus.check_value_type(json_data)
    if status is not None:
        return process_response(request, status)

    avatar = json_data['avatar']
    if len(avatar) > 100 or re.search(r'\.\.', avatar) or avatar[:8] != '/' + settings.AVATAR_PATH \
            or not os.path.exists('.' + avatar):
        return process_response(request,
                                ResponseStatus.IMAGE_PATH_NOT_FOUND_ERROR)

    user_info = account_models.User.objects.filter(
        username=request.session.get('username')).first().info
    user_info.avatar = avatar
    user_info.save()

    return process_response(request, ResponseStatus.OK)
 def process_request(self, request):
     if request.method == 'POST' and request.path_info in self.JSON_USED_URL:
         # JSON 格式检验
         try:
             json_data = json.loads(request.body)
             request.json_data = json_data
         except json.JSONDecodeError:
             json_data = {}
         if not json_data:
             return process_response({'code': '001', 'msg': 'JSON 格式解析错误'})
Exemplo n.º 19
0
def get_status(request):
    if request.session.get('username') is not None:
        username = request.session.get('username')

        user = account_models.User.objects.filter(username=username).first()
        if not user:
            return process_response(request, ResponseStatus.UNEXPECTED_ERROR)

        request.data = {
            'login': True,
            'username': user.username,
            'nickname': user.info.nickname,
            'avatar': '/' + user.info.avatar.url,
        }

        return process_response(request, ResponseStatus.OK)
    else:
        request.data = {
            'login': False,
        }

        return process_response(request, ResponseStatus.OK)
Exemplo n.º 20
0
def edit_user_info(request):
    if request.session['username'] != 'Leo':
        return process_response({'code': '007', 'msg': '无权限'})

    user = account_models.User.objects.filter(username='******').first()
    info = user.info

    json_data = request.json_data

    # 姓名 name 验证
    name = json_data['name']
    if len(name) > 20:
        return process_response({'code': '201', 'msg': '姓名过长'})

    # 性别 sex 认证
    sex = json_data['sex']
    if sex not in ['M', 'F']:
        return process_response({'code': '202', 'msg': '性别错误'})

    # 邮箱 email 验证
    email = json_data['email']
    result = validate_email(email)
    if result:
        return process_response(result)

    # # 头像 avatar 验证
    # avatar = json_data['avatar']
    # if not os.path.exists(settings.BASE_DIR + '/' + avatar):
    #     return process_response({'code': '203', 'msg': '图片不存在'})

    # 座右铭 quote
    quote = json_data['quote']
    if len(quote) > 100:
        return process_response({'code': '204', 'msg': '座右铭过长'})

    # # 外链 links 验证
    # if 'links' not in json_data:
    #     links = {}
    # else:
    #     links = json_data['links']
    # for one in links:
    #     if one in info.links:
    #         link = account_models.Link.objects.filter(type=one).first()
    #         link.content = links[one]
    #         link.save()
    #     else:
    #         account_models.Link(user=user, type=one, content=links[one]).save()

    info.name = name
    info.sex = sex
    info.email = email
    info.quote = quote
    info.save()

    conn = get_redis_connection('default')
    conn.set('save', '')

    return process_response({'code': '000', 'msg': '修改成功'})
Exemplo n.º 21
0
def login(request):
    if not request.method == 'POST':
        return process_response({'code': '002', 'msg': '请求方法错误'})
    else:
        # 数据经过中间件处理存放在 request.json_data 中
        json_data = request.json_data

        username = json_data['username']
        password = json_data['password']
        captcha = json_data['captcha']

        # 验证码 captcha 检验
        if captcha != 'ssss' and request.session.get(
                'captcha', '').lower() != captcha.lower():
            return process_response({'code': '004', 'msg': '验证码错误'})
        if 'captcha' in request.session:
            del request.session['captcha']

        # 用户 user 存在性验证
        user = account_models.User.objects.filter(username=username).first()
        if not user:
            return process_response({'code': '131', 'msg': '用户名错误'})

        # 密码 password 验证
        if check_password(password, user.password) is False:
            return process_response({'code': '132', 'msg': '密码错误'})

        # 设置登陆状态
        request.session['username'] = username

        return process_response({
            'username': user.username,
            'avatar': user.info.avatar.url,
            'is_super': user.username == 'Leo',
            'code': '000',
            'msg': '登陆成功'
        })
Exemplo n.º 22
0
def like_post(request):
    json_data = request.json_data

    status = ValueErrorStatus.check_value_type(json_data)
    if status is not None:
        return process_response(request, status)

    post_id = json_data['post_id']
    post = post_models.Post.objects.filter(id=post_id).first()
    if not post:
        return process_response(request, ResponseStatus.POST_NOT_FOUND_ERROR)

    user = account_models.User.objects.filter(
        username=request.session.get('username')).first()
    if post_models.LikeRecord.objects.filter(user=user, post=post):
        return process_response(request, ResponseStatus.LIKE_ALREADY_ERROR)

    post.like += 1
    post.save()

    like = post_models.LikeRecord(user=user, post=post)
    like.save()

    return process_response(request, ResponseStatus.OK)
Exemplo n.º 23
0
def give_post(request):
    json_data = request.json_data

    status = ValueErrorStatus.check_value_type(json_data)
    if status is not None:
        return process_response(request, status)

    content = json_data['content']
    if len(content) > 400:
        return process_response(request,
                                ResponseStatus.CONTENT_LENGTH_TOO_LARGE_ERROR)

    user = account_models.User.objects.filter(
        username=request.session.get('username')).first()
    path = json_data['path']
    photo = gallery_models.Photo.objects.filter(user=user, path=path).first()
    if not photo:
        return process_response(request,
                                ResponseStatus.IMAGE_PATH_NOT_FOUND_ERROR)

    post = post_models.Post(user=user, photo=photo, content=content)
    post.save()

    return process_response(request, ResponseStatus.OK)
Exemplo n.º 24
0
def change_forget_password(request):
    json_data = request.json_data

    status = ValueErrorStatus.check_value_type(json_data)
    if status is not None:
        return process_response(request, status)

    # 用户 user 存在性验证
    username = json_data['username']
    user = account_models.User.objects.filter(
        Q(username=username) | Q(userinfo__email=username)).first()
    if not user:
        return process_response(request,
                                ResponseStatus.USERNAME_NOT_EXISTED_ERROR)

    # 新密码 new_password 格式验证
    new_password = json_data['new_password']
    status = validate_password(new_password)
    if status is not None:
        return process_response(request, status)

    # 验证码匹配
    verify_code = json_data['verify_code']

    cache = get_redis_connection()
    cached_code = cache.get('verify_code_' + user.info.email)
    if verify_code != cached_code:
        return process_response(request,
                                ResponseStatus.VERIFY_CODE_NOT_MATCH_ERROR)
    cache.delete('verify_code_' + user.info.email)

    # 修改密码 password
    user.password = make_password(new_password)
    user.save()

    return process_response(request, ResponseStatus.OK)
Exemplo n.º 25
0
def upload(request):
    # 图片
    img = request.FILES.get('img')
    if not img:
        return process_response(request, ResponseStatus.IMAGE_REQUIRED_ERROR)

    # 用途
    usage = request.POST.get('usage')
    if not usage:
        return process_response(request, ResponseStatus.USAGE_REQUIRED_ERROR)
    if usage not in settings.IMAGE_USAGE:
        return process_response(request,
                                ResponseStatus.USAGE_NOT_CORRECT_ERROR)

    # 图片大小
    if img.size > settings.IMAGE_MAX_SIZE:
        return process_response(request,
                                ResponseStatus.IMAGE_SIZE_TOO_LARGE_ERROR)

    # 图片后缀名初步判断图片类型
    extension = img.name.split('.')[-1]
    if extension not in settings.ALLOWED_IMAGE_EXTENSION:
        return process_response(
            request, ResponseStatus.IMAGE_EXTENSION_NOT_ALLOWED_ERROR)

    # 图片名 当前时间 + 随机字符串
    img_name = time.strftime("%Y%m%d%H%M%S",
                             time.localtime()) + generate_string(
                                 10, Pattern.Lowercase_And_Digits)

    # 图片保存路径
    path = settings.IMAGE_USAGE[usage] + img_name + '.' + extension

    # 储存图片
    with open(path, 'wb') as f:
        for chunk in img.chunks():
            f.write(chunk)

    # 精确判断图片类型
    if not re.search(settings.ALLOWED_IMAGE_EXTENSION[extension],
                     magic.from_file(path)):
        if os.path.exists(path):
            os.remove(path)
        return process_response(
            request, ResponseStatus.IMAGE_EXTENSION_NOT_ALLOWED_ERROR)

    request.data = {'path': '/' + path}

    return process_response(request, ResponseStatus.OK)
Exemplo n.º 26
0
def test_patch(request):
    cache = get_redis_connection('default')
    json_data = request.json_data

    test_value = cache.get('test')
    if not test_value or len(test_value) > 200:
        test_value = 'Hello World'
        cache.set('test', test_value)

    cache.set('test', test_value + json_data['username'])

    request.data = {}
    for one in json_data:
        if one != 'username':
            request.data[one] = json_data[one]

    return process_response(request, ResponseStatus.OK)
Exemplo n.º 27
0
def get_points(request):
    posts = post_models.Post.objects.filter(~(Q(photo__address='')
                                              | Q(photo__report=None)))

    point = []
    for one in posts:
        point.append({
            'content': one.content,
            'path': one.photo.path,
            'address': one.photo.address,
            'longitude': one.photo.longitude,
            'latitude': one.photo.latitude
        })

    request.data = {'point': point, 'count': len(point)}

    return process_response(request, ResponseStatus.OK)
def get_comments(request):
    content = {'comments': []}

    comments = comment_models.Comment.objects.all()
    for one in comments:
        content['comments'].append({
            'username':
            one.user.username,
            'avatar':
            one.user.info.avatar.name,
            'content':
            one.content,
            'time':
            one.create_time.strftime('%Y-%m-%d %H:%M:%S')
        })

    content.update({'code': '000', 'msg': '获取成功'})
    return process_response(content)
def upload(request):
    if not request.method == 'POST':
        return process_response({'code': '002', 'msg': '请求方法错误'})
    else:
        # 图片 image 验证
        img = request.FILES.get('img')
        if not img:
            return process_response({'code': '004', 'msg': '缺少图片'})

        # 文件大小
        if img.size > settings.IMAGE_MAX_SIZE:
            return process_response({'code': '005', 'msg': '图片过大'})

        # 文件后缀名初步判断文件类型
        extension = img.name.split('.')[-1]
        if extension not in settings.ALLOWED_IMAGE_EXTENSION:
            return process_response({
                'code': '006',
                'msg': '图片文件仅支持 jpg, png 格式'
            })

        # 附加时间的随机图片名
        name = generate_string(10, Pattern.Letters_And_Digits, True)

        # 图片保存路径
        path = settings.IMAGE_PATH + name + '.' + extension

        # 储存图片
        parser = ImageFile.Parser()
        for chunk in img.chunks():
            parser.feed(chunk)
        f = parser.close()
        f.save(path)

        if not re.search(settings.ALLOWED_IMAGE_EXTENSION[extension],
                         magic.from_file(path)):
            return process_response({
                'code': '006',
                'msg': '图片文件仅支持 jpg, png 格式'
            })

        info = account_models.User.objects.filter(username='******').first().info
        info.avatar = path
        info.save()

        conn = get_redis_connection('default')
        conn.set('save', '')

        return process_response({'path': path, 'code': '000', 'msg': '上传成功'})
Exemplo n.º 30
0
def register(request):
    # 经过处理的 JSON 数据
    json_data = request.json_data

    status = ValueErrorStatus.check_value_type(json_data)
    if status is not None:
        return process_response(request, status)

    # 用户名 username 格式检验
    username = json_data['username']
    status = validate_username(username)
    if status is not None:
        return process_response(request, status)

    # 密码 password 格式验证
    password = json_data['password']
    status = validate_password(password)
    if status is not None:
        return process_response(request, status)

    # 邮箱 email 格式验证
    email = json_data['email']
    status = validate_email(email)
    if status is not None:
        return process_response(request, status)

    # 用户名 username 存在性验证
    if account_models.User.objects.filter(username=username):
        return process_response(request, ResponseStatus.USERNAME_EXISTED_ERROR)

    # 邮箱 email 存在性验证
    if account_models.UserInfo.objects.filter(email=email):
        return process_response(request, ResponseStatus.EMAIL_EXISTED_ERROR)

    # 创建用户 user 和 用户信息 user_info
    user = account_models.User(username=username,
                               password=make_password(password))
    user.save()
    user_info = account_models.UserInfo(user=user, email=email)
    user_info.save()

    return process_response(request, ResponseStatus.OK)