def change_user_tel(request): """修改密码""" username = request.data.get('username') tel = request.data.get('tel') # 从请求头取得用户口令 token = request.META.get('HTTP_TOKEN') # 取得该用户 user = User.objects.filter(userid=caches['default'].get(token)).first() # 判断用户名是否存在 user1 = User.objects.filter(username=username).only('username').first() user2 = User.objects.filter(tel=tel).only('tel').first() print(user) print(user1) print(user2) if (user1 and user1 != user) or (user2 and user2 != user): return DefaultResponse(*INFO_EXISTS) tel_code = request.data.get('tel_code') if tel_code == caches['default'].get(f'{tel}_time'): # 验证码失效 caches['default'].delete_pattern(f'{tel}_time') with atomic(): user.username = username user.tel = tel user.save() return DefaultResponse(*INFO_SUCCESS) return DefaultResponse(*CACHE_ERROR)
def user_login(request): """用户登录""" # 取得数据 username = request.data.get('username') password = request.data.get('password') # 序列化 if check_username( username) or check_tel(username) and check_password(password): password = to_md5_hex(password) q = Q(username=username, password=password) | \ Q(tel=username, password=password) user = User.objects.filter(q).first() if user: user_token = uuid.uuid4() caches['default'].set(user_token, user.userid, 3600 * 24) loginlog = LoginLog() loginlog.user = user.userid loginlog.logdate = current_time # 获取设备的IP地址 loginlog.ipaddr = get_ip_address(request) # 获取登录设备硬件信息 loginlog.devcode = get_dev_info(request) loginlog.save() image_path = BeforPath + user.user_image return DefaultResponse(*LOGIN_SUCCESS, { 'results': { 'token': user_token, 'user_image_path': image_path } }) else: return DefaultResponse(*PASSWORD_ERROR) else: return DefaultResponse(*LOGIN_ERROR)
def new_image(request): """用户更新当前头像""" token = request.META.get('HTTP_TOKEN') # 取得图片数据流 file = request.FILES.get('image_files') if file and len(file) <= MAX_PHOTO_SIZE: user = User.objects.filter( userid=caches['default'].get(token)).only('user_image').first() # 自定义的图片处理函数 file_path = upload_image_to_local(user, file) # 拼接地址 image_path = BeforPath + file_path return DefaultResponse(*UPLOAD_IMAGE_SUCCESS, {'results': image_path}) return DefaultResponse(*UPLOAD_IMAGE_FAIL)
def change_password(request): """修改密码""" password = request.data.get('password') password1 = request.data.get('password1') # 从请求头取得用户口令 token = request.META.get('HTTP_TOKEN') if check_password(password) and check_password(password1): user = User.objects.filter(userid=caches['default'].get(token)).first() if user.password == to_md5_hex(password): user.password = to_md5_hex(password1) user.save() return DefaultResponse(*PASSWORD_SUCCESS) return DefaultResponse(*OLD_PASSWORD_ERROR) return DefaultResponse(*PASSWORD_ILLEGAL)
def map_info(request): """给定市区,返回地图数据""" county = request.query_params.get('county') if county == '全部': houses = HouseInfo.objects.only('comm_name', 'longitude', 'latitude').all() else: houses = HouseInfo.objects.filter(county=county).only( 'comm_name', 'longitude', 'latitude').all() data1 = [] data2 = {} # 小区名字列表 comm_list = [] for item in houses: # 找出每个小区对应的房源个数 comm_list.append(item.comm_name) data2[item.comm_name] = [item.longitude, item.latitude] if data2: local = data2[random.choice(list(data2))] else: local = [104.043035, 30.653754] # 去掉重复房源 only_comm = set(comm_list) for comm_n in only_comm: # 组装房屋个数数据 data1.append({'name': comm_n, 'value': comm_list.count(comm_n)}) return DefaultResponse( *(200, '请求成功'), {'results': { 'data1': data1, 'data2': data2, 'local': local }})
def my_test2(request): """计算各区的平均价格""" data1 = [ '锦江', '青羊', '武侯', '高新', '成华', '金牛', '天府新区', '双流', '温江', '郫都', '龙泉驿', '新都', '彭州', '简阳', '青白江', '都江堰' ] return DefaultResponse()
def get_image(request): """用户获取当前头像""" token = request.META.get('HTTP_TOKEN') user = User.objects.filter( userid=caches['default'].get(token)).only('user_image').first() # 拼接路径 image_path = BeforPath + user.user_image return DefaultResponse(*GET_IMAGE_SUCCESS, {'results': image_path})
def find_password(request): """找回密码""" data = request.data serialzer = FindPasswordSerializer(data=data) serialzer.is_valid(raise_exception=True) # 获取验证码 tel_code = data.get('tel_code') tel = serialzer.validated_data['tel'] if tel_code == caches['default'].get(f'{tel}_time'): # 验证码失效 caches['default'].delete_pattern(f'{tel}_time') # 找到对应用户 user = User.objects.filter(tel=serialzer.validated_data['tel']).first() user.password = to_md5_hex(serialzer.validated_data['password']) user.save() return DefaultResponse(*FIND_PASSWORD_SUCCESS) return DefaultResponse(*CACHE_ERROR)
def get_county(request): """动态获取地区""" city = request.query_params.get('city', '成都市') print(city) city = CITY_DICT[city] url = 'https://%s.lianjia.com/zufang/rs/' % city content = get_county_helper(url) # return JsonResponse(content, safe=False) return DefaultResponse(*(10002, '请求成功'), {'results': content})
def get_street(request): """动态获取街道""" city = request.query_params.get('city', '成都市') city = CITY_DICT[city] county = request.query_params.get('county', '十陵') # 将区域转为拼音 county = 'gaoxin7' if county == '高新' else pinyin(county) url = 'https://%s.lianjia.com/zufang/%s' % (city, county) content = get_street_helper(url) # return JsonResponse(content, safe=False) return DefaultResponse(*(10002, '请求成功'), {'results': content})
def user_register(request): """用户注册""" data = request.data print(data) serializer = RegisterSerializer(data=data) serializer.is_valid(raise_exception=True) # 获取验证码 tel = serializer.validated_data['tel'] tel_code = request.data.get('tel_code') if tel_code == caches['default'].get(f'{tel}_time'): # 验证码失效 caches['default'].delete_pattern(f'{tel}_time') with atomic(): user = User() user.password = to_md5_hex(serializer.validated_data['password']) user.tel = serializer.validated_data['tel'] user.username = serializer.validated_data['username'] user.user_image = DefaultImagePath user.save() return DefaultResponse(*REGISTER_SUCCESS) return DefaultResponse(*CACHE_ERROR)
def get_tel_code(request): tel = request.query_params.get('tel') if not check_tel(tel): res = {'code': 40002, 'message': '手机号不合法', 'results': {}} raise ParamsException(res) # 检查120s内是否发送 if not caches['default'].get(f'{tel}_limit'): # 随机6位数字验证码 nums = ''.join([str(random.randint(0, 9)) for i in range(6)]) # 提前缓存,防止双击频繁请求 caches['default'].set(f'{tel}_limit', nums, timeout=120) # 异步发送短信 aliyu_message.apply_async( (nums, tel), queue='tel_code_queue', countdown=10, # retry_policy={}, # expires=60, # compression='zlib', ) return DefaultResponse(*(200, '发送短信成功')) return DefaultResponse(*(50002, '发送短信失败,操作过于频繁'))
def every_county_count(request): """各区总套数""" data1 = [ '锦江', '青羊', '武侯', '高新', '成华', '金牛', '天府新区', '双流', '温江', '郫都', '龙泉驿', '新都', '彭州', '简阳', '青白江', '都江堰' ] data2 = [] for item in data1: data2.append(HouseInfo.objects.filter(county=item).count()) return DefaultResponse(*(200, '请求成功'), {'results': { 'data1': data1, 'data2': data2 }})
def my_test3(request): """计算各个面积段的租房数量""" data1 = [ '0-20', '20-50', '50-80', '80-110', '110-140', '140-170', '170-200' ] data2 = [] for i in data1: data2.append({ 'value': HouseInfo.objects.filter( Q(area__gt=int(i.split('-')[0])) & Q(area__lte=int(i.split('-')[1]))).count(), 'name': i }) return DefaultResponse(*(200, '成功'), {'data': data2})
def get_log(request): """用户获取登录记录""" token = request.META.get('HTTP_TOKEN') user = User.objects.filter( userid=caches['default'].get(token)).only('user_image').first() logs = LoginLog.objects.filter(user=user.userid).order_by('-logdate').all() # 以下注释内容为分页显示 # # 创建一个分页对象,此对象为自己编写的分页类,或者也可以是默认的 # paginator = CustomPagePagination() # # 传入已有的记录 # logs = paginator.paginate_queryset(logs, request) serializer = LoginLogSerializer(data=logs, many=True) # 注意这儿不要写 raise_exception=True serializer.is_valid() datas = serializer.data # datas = paginator.get_paginated_response(serializer.data).data return DefaultResponse(*GET_LOG_SUCCESS, {'results': datas})
def get_user_info(request): """用户获取当前个人信息""" token = request.META.get('HTTP_TOKEN') user = User.objects.filter( userid=caches['default'].get(token)).only('user_image').first() # 拼接路径 image_path = BeforPath + user.user_image # 用户名 username = user.username # 手机号 tel = user.tel return DefaultResponse(*GET_IMAGE_SUCCESS, { 'results': { 'image_path': image_path, 'username': username, 'tel': tel } })
def price_county_count(request): """各区各价格段总套数""" data1 = [ '锦江', '青羊', '武侯', '高新', '成华', '金牛', '天府新区', '双流', '温江', '郫都', '龙泉驿', '新都', '彭州', '简阳', '青白江', '都江堰' ] price_list = [ '0-1000', '1000-2000', '2000-3000', '3000-4000', '4000-5000', '5000-10000' ] price_dict = {} for pri in price_list: data2 = [] for item in data1: data2.append( HouseInfo.objects.filter( Q(county=item) & Q(price__lte=pri.split('-')[1]) & Q(price__gte=pri.split('-')[0])).count()) price_dict[pri] = data2 return DefaultResponse(*(200, '请求成功'), {'results': {'data2': price_dict}})
def check_login(request): """检查登录是否合法""" token = request.META.get('HTTP_TOKEN') results = 'success' if caches['default'].get(token) else 'false' return DefaultResponse(*(200, '请求成功'), {'results': results})
def login_img(request): results = [ '/static/images/log1.jpg', '/static/images/log2.jpg', '/static/images/log3.jpg' ] return DefaultResponse(*(10002, '请求成功'), {'results': results})
def user_logout(request): """用户退出登录""" token = request.META.get('HTTP_TOKEN') caches['default'].delete_pattern(token) return DefaultResponse(*LOGOUT_SUCCESS)
def spider_info(request): results = [ '/static/images/1.jpg', '/static/images/2.jpg', '/static/images/3.jpg', '/static/images/4.jpg' ] return DefaultResponse(*(10002, '请求成功'), {'results': results})
def list(self, request, *args, **kwargs): result = super().list(request, *args, **kwargs) return DefaultResponse(*(10003, '请求成功'), result.data)