def delete(self, request, menu_id): menu = Menu.objects.filter(id=menu_id).only('name') if menu: menu = menu[0] if menu.children.filter(is_delete=False).exists(): return json_response(errorno=Code.DATAERR, errmsg='父菜单不能删除!') menu.permission.delete() return json_response(errmsg='删除菜单:%s成功' % menu.name) else: return json_response(errorno=Code.NODATA, errmsg='菜单不存在!')
def post(self, request): """ - 发送短信验证码 - 发送短信 - 保存短信验证码 - 保存发送记录 :param request: :return: """ form = CheckImageForm(request.POST, request=request) if form.is_valid(): # 获取手机号 mobile = form.cleaned_data.get('mobile') # 生成短信验证码 sms_code = ''.join([str(random.choice([i for i in range(10)])) for _ in range(constants.SMS_CODE_LENGTH)]) # 发送短信验证码 # ccp = CCP() # # 注意: 测试的短信模板编号为1 # result = None # for i in range(3): # result = ccp.send_template_sms('{}'.format(mobile), ['{}'.format(sms_code), 5], "1") # if result == 0: # print('短信验证码发送成功!') # break result = huyisms(smscode=sms_code, mobile=mobile) logger.info('{},发送验证码{}成功'.format(mobile, sms_code)) # 保存验证码 redis # 创建发送验证码记录的key sms_flag_key = 'sms_flag_{}'.format(mobile) sms_text_key = 'sms_text_{}'.format(mobile) redis_conn = get_redis_connection(alias='verify_code', ) # 让管道通知redis pl = redis_conn.pipeline() try: # 设置生存时间与value pl.setex(sms_flag_key, constants.SMS_CODE_INTERVAL, 1) pl.setex(sms_text_key, constants.SMS_CODE_EXPIRES*60, sms_code) # 让管道通知 redis 执行 pl.execute() return json_response(errmsg='短信验证码发送成功') except Exception as e: logger.error('redis 执行异常{}'.format(e)) return json_response(errorno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR]) else: # 将表单错误信息进行拼接 err_msg_str = '/'.join([item[0] for item in form.errors.values()]) return json_response(errorno=Code.PARAMERR, errmsg=err_msg_str)
def handle_no_permission(self): """ 覆盖父类方法,解决ajax返回json数据的问题 :return: """ if self.request.is_ajax(): if self.request.user.is_authenticated: return json_response(errorno=Code.ROLEERR, errmsg='您没有权限!') else: return json_response(errorno=Code.SESSIONERR, errmsg= '您未登录,请登录!', data={'url': reverse(self.get_login_url())}) else: return super().handle_no_permission()
def get_logger(request, d_id): """ 快速查看 logs 接口 :param request: :param d_id: :return: """ if str(d_id) == datetime.datetime.today().strftime('%d'): logs = linecache.getlines('logs/logs.log')[-20:-1] or None linecache.clearcache() if logs: data = {'logs': logs} return json_response(data=data) else: return json_response(errorno=Code.NODATA, errmsg='出错了')
def get(self, request): # 获取数据 try: tag_id = int(request.GET.get('tag_id', 0)) except Exception as e: logger.error("标签错误:\n{}".format(e)) tag_id = 0 try: page = int(request.GET.get('page', 1)) except Exception as e: logger.error("当前页数错误:\n{}".format(e)) page = 1 # 获取查询集 news_queryset = News.objects.values( 'id', 'title', 'digest', 'image_url', 'update_time').annotate(tag_name=F('tag__name'), author=F('author__username')) # news_queryset = News.objects.select_related('tag', 'author'). \ # only('title', 'digest', 'image_url', 'update_time', 'tag__name', 'author__username') news = news_queryset.filter( is_delete=False, tag_id=tag_id) or news_queryset.filter(is_delete=False) # 分页 paginator = Paginator(news, PER_PAGE_NEWS_COUNT) # 获取当前页数据 news_info = paginator.get_page(page) # 返回数据 data = {'total_pages': paginator.num_pages, 'news': list(news_info)} return json_response(data=data)
def post(self, request): try: file = request.FILES['upload'] filename = get_filename(file.name) file_path = os.path.join(settings.MEDIA_ROOT, filename) with open(file_path, 'wb') as f: for chunk in file.chunks(): f.write(chunk) return json_response(data={ 'url': settings.MEDIA_URL + filename, 'name': filename, 'uploaded': '1' }) except Exception as e: return json_response(data={'uploaded': '0'})
def get(self, request): # 访问redis,查看是否存在,存在返回皮卡丘 ip = get_ip(request) redis_conn = get_redis_connection(alias='request_interval') if redis_conn.get('req_flag_{}'.format(ip)): return HttpResponse(MIGUAN, status=418) # 对请求进行鉴别 req_filter = ReqFilter() if req_filter.combine_api_filter(request): return HttpResponse(BLOG_URL + PIKAQIU + MIGUAN, status=418) try: page = int(request.GET.get('page') or 1) except ValueError: return HttpResponse(PIKAQIU, status=418) # 获取查询集 spider_data = SpiderData.objects.values( 'false_data', 'data_index', 'image_url', 'order', ).annotate(encrypt_data=F('spider__encrypt_data')).order_by('id') # 分页 paginator = Paginator(spider_data, 5) # 当前页数据 spider_info = paginator.get_page(page) # 送入redis req_flag_key = 'req_flag_{}'.format(ip) # 让管道通知redis pl = redis_conn.pipeline() try: # 设置生存时间与value pl.setex(req_flag_key, REQUEST_INTERVAL, 1) # 让管道通知 redis 执行 pl.execute() except Exception as e: logger2.error('redis 执行异常{}'.format(e)) return json_response(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR]) data = { 'total_pages': paginator.num_pages, 'spider': list(spider_info) } return json_response(data=data)
def post(self, request): email = request.POST.get('email') data = { 'email': email, 'count': User.objects.filter(email=email).count() } return json_response(data=data)
def post(self, request): form = NewsModelForm(request.POST) if form.is_valid(): instance = form.save(commit=False) instance.author = request.user instance.save() return json_response(errmsg='添加新闻成功!') else: return render(request, 'admin/news/news_detail.html', context={'form': form})
def post(self, request): # 1.校验数据 form = RegisterForm(request.POST, request=request) if form.is_valid(): # 新建数据 nickname = form.cleaned_data.get('nickname') password = form.cleaned_data.get('password') email = form.cleaned_data.get('email') # 新建用户 User.objects.create_user(username=nickname, password=password, email=email) # 注册成功记录 IP name 邮箱 # logger.info('{} {} {}'.format()) return json_response(errmsg='注册成功') else: # 将表单错误信息进行拼接 err_msg_str = '/'.join([item[0] for item in form.errors.values()]) return json_response(errno=Code.PARAMERR, errmsg=err_msg_str)
def get(self, request, news_id): # 1. 拿到对应的新闻对象 news = News.objects.filter(id=news_id).first() if news: # 2. 生成表单对象 form = NewsModelForm(instance=news) else: return json_response(errorno=Code.NODATA, errmsg='没有此新闻!') # 3. 渲染并返回 return render(request, 'admin/news/news_detail.html', context={'form': form})
def post(self, request): # 1.校验数据 form = RegisterForm(request.POST, request=request) if form.is_valid(): # 新建数据 username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') mobile = form.cleaned_data.get('mobile') # 新建用户 user = User.objects.create_user(username=username, password=password, mobile=mobile) user.groups.add(5) return json_response(errmsg='注册成功') else: # 将表单错误信息进行拼接 err_msg_str = '/'.join([item[0] for item in form.errors.values()]) return json_response(errorno=Code.PARAMERR, errmsg=err_msg_str)
def put(self, request, user_id): user = User.objects.filter(id=user_id).first() put = QueryDict(request.body) if user: form = UserModelForm(put, instance=user) else: form = UserModelForm() if form.is_valid(): form.save() return json_response() else: return render(request, 'admin/user/user_detail.html', context={'form': form})
def post(self, request): # 1. 获取post参数,创建一个模型表单对象 self.form_class = self.get_form_class() form = self.form_class(request.POST) # 2.校验 if form.is_valid(): # 3. 返回校验结果 self.save(form) return json_response(errmsg='添加数据成功!') else: context = self.get_context_data(form=form) return render(request, self.get_template_name(), context=context)
def post(self, request): form = MenuModelForm(request.POST) if form.is_valid(): new_menu = form.save() content_type = ContentType.objects.filter(app_label='admin2', model='menu').first() permission = Permission.objects.create(name=new_menu.name, content_type=content_type, codename=new_menu.codename) new_menu.permission = permission new_menu.save(update_fields=['permission']) return json_response(errmsg='菜单添加成功!') else: return render(request, 'admin/menu/add_menu.html', context={'form': form})
def check_mobile_view(request, mobile): """ 查询手机号是否存在 url: /veri/mobile=(?P\<mobile>1[3456789]\d{9}/ :param request: :param mobile: :return: """ data = { 'mobile': mobile, 'count': User.objects.filter(mobile=mobile).count() } return json_response(data=data)
def check_username_view(request, username): """ 查询用户名是否存在 url: /user/check=(?P<username>\w{5,20}) :param request: :param username: :return: """ data = { "username": username, # 查询用户名 "count": User.objects.filter(username=username).count() # 查询用户数量 } return json_response(data=data)
def check_nickname_view(request, nickname): """ 查询用户名是否存在 url: /veri/check=(?P<nickname>.*?{5,20}) :param request: :param nickname: :return: """ data = { "nickname": nickname, # 查询用户名 "count": User.objects.filter(username=nickname).count() # 查询用户数量 } return json_response(data=data)
def put(self, request, **kwargs): # 1. 获取模型对象 self.obj = self.get_obj(**kwargs) # 2. 获取参数,创建模型表单对象 self.form_class = self.get_form_class() form = self.form_class(QueryDict(request.body), instance=self.obj) # 3. 校验 if form.is_valid(): self.save(form) return json_response(errmsg='修改数据成功!') else: # 4. 返回结果 context = self.get_context_data(form=form) return render(request, self.get_template_name(), context=context)
def post(self, request): # 1.根据post的数据,创建模型表单对象 form = GroupModeForm(request.POST) # 2.校验 if form.is_valid(): # 3.如果成功,保存,返回ok form.save() return json_response(errmsg='添加分组成功!') else: # 4.如果失败,返回渲染了错误信息的表单html menus = Menu.objects.only('name', 'permission_id').select_related('permission').filter(is_delete=False, parent=None) return render(request, 'admin/group/group_detail.html', context={ 'form': form, 'menus': menus })
def put(self, request, menu_id): menu = Menu.objects.filter(id=menu_id).first() put_data = QueryDict(request.body) form = MenuModelForm(put_data, instance=menu) if form.is_valid(): obj = form.save() flag = False if 'name' in form.changed_data: obj.permission.name = obj.name flag = True if 'codename' in form.changed_data: obj.permission.codename = obj.name flag = True if flag: obj.permission.save() return json_response(errmsg='菜单修改成功!') else: return render(request, 'admin/menu/update_menu.html', context={'form': form})
def get(self, request, group_id): # 1. 拿到要修改的分组 group = Group.objects.filter(id=group_id).first() # 1.1 判断是否存不存在 if not group: return json_response(errorno=Code.NODATA, errmsg='没有此分组!') # 2.创建表单 form = GroupModeForm(instance=group) # 3.拿到所有的可用一集菜单 menus = Menu.objects.only('name', 'permission_id').select_related('permission').filter(is_delete=False, parent=None) # 4.拿到当前组的可用权限 permissions = group.permissions.only('id').all() # 3.返回渲染html return render(request, 'admin/group/group_detail.html', context={ 'form': form, 'menus': menus, 'permissions': permissions })
def post(self, request, news_id): # 是否登录 if not request.user.is_authenticated: return json_response(errorno=Code.SESSIONERR, errmsg=error_map[Code.SESSIONERR]) # 新闻是否存在 if not News.objects.only('id').filter(is_delete=False, id=news_id).exists(): return json_response(errorno=Code.PARAMERR, errmsg="新闻不存在!") # 判断内容 json_data = request.body if not json_data: return json_response(errorno=Code.PARAMERR, errmsg=error_map[Code.PARAMERR]) # 将json_data 转换成json json_data = json.loads(json_data.decode('utf8')) # 判断内容是否为空 content = json_data.get('content') if not content: return json_response(errorno=Code.PARAMERR, errmsg='评论内容不能为空') # 判断父id是否正常 parent_id = json_data.get('parent_id') try: if parent_id: parent_id = int(parent_id) if not Comments.objects.only('id'). \ filter(is_delete=False, id=parent_id, news_id=news_id).exists(): return json_response(errorno=Code.PARAMERR, errmsg=error_map[Code.PARAMERR]) except Exception as e: logger.info("前端传过来的parent_id异常:\n{}".format(e)) return json_response(errorno=Code.PARAMERR, errmsg="未知异常") # 保存到数据库 new_comment = Comments() new_comment.content = content new_comment.news_id = news_id new_comment.author = request.user new_comment.parent_id = parent_id if parent_id else None new_comment.save() # 序列化一个评论数据 return json_response(data=new_comment.to_dict_data())
def put(self, request, news_id): news = News.objects.filter(id=news_id).first() put = QueryDict(request.body) if news: form = NewsModelForm(put, instance=news) else: form = NewsModelForm() if form.is_valid(): # 优化 # form.save() if form.has_changed(): instance = form.save(commit=False) instance.save(update_fields=form.changed_data) return json_response(errmsg='修改新闻成功!') else: return render(request, 'admin/news/news_detail.html', context={ 'form': form, })
def get(self, request): banners = Banner.objects.values('news_id')\ .annotate(news_title=F('news__title'), image_url=F('news__image_url'))\ .filter(is_delete=False)[:SHOW_BANNER_COUNT] data = {'banners': list(banners)} return json_response(data=data)