def wrapper(request): try: return func(request) except Ratelimited: return process_response(request, ResponseStatus.FORBIDDEN) except Exception: return process_response(request, ResponseStatus.UNEXPECTED_ERROR)
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)
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)
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)
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)
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)
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)
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)
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])
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)
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)
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)
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)
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)
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 格式解析错误'})
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)
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': '修改成功'})
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': '登陆成功' })
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)
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)
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)
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)
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)
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': '上传成功'})
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)