问题记录

问题1:信号没有按预期触发

描述

编写了信号函数后,并没有如预期一般在必要时候触发,函数如下:

@receiver(signals.post_save, sender=Prometheus)
def monitor_prometheus_update(instance, **kwargs):
# 当发生修改时,更新控制台url
web_url = "http://{ip}:{port}/{route}".format(ip=instance.ip, port=instance.port, route=instance.url)
Prometheus.objects.filter(ip=instance.ip).update(web_url=web_url)
print("触发", web_url, instance)

解决

理论上应该在每次信息修改时触发,print出触发信息,但是并没生效,我是在apps.py中定义ready方法:

from django.apps import AppConfig

class ServicesConfig(AppConfig):
name = 'apps.services'
default_auto_field = 'django.db.models.BigAutoField' def ready(self):
import apps.services.signals

问题2:startapp报错包名冲突

描述

使用startapp创建一个新的应用到指定目录时,报错:

CommandError: 'apps' conflicts with the name of an existing Python module and cannot be used as an app directory. Please try another directory.

使用的命令是startapp services .apps

解决

在项目目录下新建apps目录,然后在其中新建空目录services,此时使用命令startapp services ./apps/services就可以在指定的目录下创建新的应用了。

问题3:Get请求获取query_params

描述

编写了Get请求后,需要支持用户在请求时携带部分参数,方便查询

解决

使用rest_framework.request.Request的query_params能够方便拿到请求参数:

class PrometheusList(APIView):

    def get(self,request: Request):
"""
:param request:
:return:
"""
param=request.query_params
if param and 'group' in param.keys():
# 支持通过group来进行查询
queryset = Prometheus.objects.filter(group=param['group'])
else:
queryset = Prometheus.objects.all() s = PrometheusSerializer(instance=queryset, many=True)
return Response(s.data, status = status.HTTP_200_OK)

随后创建三条记录,分组不同,进行测试:

执行GET请求如下:

GET /api/v1/services/prometheus?group=default

返回结果

HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept [
{
"ip": "1.1.1.1",
"port": 9090,
"url": "",
"web_url": "http://1.1.1.1:9090/",
"group": "default",
"create_by": "2022-08-23 18:06:19",
"update_by": "2022-08-23 18:06:19"
},
{
"ip": "1.1.1.2",
"port": 9090,
"url": "",
"web_url": "http://1.1.1.2:9090/",
"group": "default",
"create_by": "2022-08-23 18:06:25",
"update_by": "2022-08-23 18:06:25"
}
]

问题4:Model字段依赖于其他字段

描述

在我的模型类中,web_url字段需要依赖于ip、port以及url字段生成,格式如下:

web_url = "http://{ip}:{port}/{url}"

原先使用信号机制实现这种,当任意一个字段变化时也会触发web_url变化,但是发现这样实现并不好;

解决

新的实现方法如下,在模型类中实现save方法:


class Prometheus(models.Model): STATUS = (
("UP", "运行中"),
("DOWN", "已停止")
) # Prometheus服务的模型
ip = models.GenericIPAddressField(protocol="IPV4",help_text="指定了Prometheus服务所在服务器IP", verbose_name="服务IP", blank=False,
primary_key=True)
port = models.IntegerField(help_text="指定了Prometheus服务的端口号,不正确会导致服务状态获取异常", verbose_name="服务端口",
default=9090)
url = models.CharField(max_length=50, help_text="该值对应了Prometheus的启动参数web.external-url", verbose_name="访问路由",
blank=True)
web_url = models.URLField(help_text="可以通过此URL跳转到Prometheus的Web", verbose_name="控制台", default="")
group = models.CharField(max_length=50, help_text="用户定义的Prometheus服务所属的组", verbose_name="分组", default="default")
status = models.CharField(max_length=50,choices=STATUS, help_text="Prometheus节点的状态,已停止时无法进行部分操作",verbose_name="状态", default="DOWN")
create_by = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
update_by = models.DateTimeField(verbose_name="更新时间", auto_now=True) def save(self, *args, **kwargs):
"""
重写save方法,自动生成web_url
:param args:
:param kwargs:
:return:
"""
self.web_url = "http://{ip}:{port}/{route}".format(ip=self.ip, port=self.port, route=self.url)
super(Prometheus, self).save(*args, **kwargs)

问题5:自定义分页的格式

描述

在通用类视图中,使用默认分页类的默认的返回结构是这样的:

字段并不是我要的,所以对其最新一定的自定义;

解决

自定义分页类继承自PageNumberPagination,然后实现get_paginated_response方法,原本的改方法返回的是OrderDict类型的结果,不过我看python3.6以后的dict也是默认有序了,所以我觉得返回dict是没问题的:

from rest_framework.pagination import PageNumberPagination

class ServicePageNumberPagination(PageNumberPagination):
page_size_query_param = 'page_size'
page_query_param = "page"
max_page_size = 100 def get_paginated_response(self, data):
return Response(dict([
('total', self.page.paginator.count),
('results', data),
('success', True)
]))

这里如果想要在返回的结构中打印出当前的url连接,可以通过get_html_context()方法实现:

【Django】DRF开发中的一些技巧记录的更多相关文章

  1. ios开发中的小技巧

    在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...

  2. iOS开发中调试小技巧

    对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的 ...

  3. react + antiDesign开发中遇到的问题记录

    react + antiDesign开发中遇到的问题记录 一:页面中子路由失效: antiDesign的官方实例中,会把路由重复的地方给去重,而且路由匹配模式不是严格模式.所以我们需要在util.js ...

  4. iOS - 开发中调试小技巧

    对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的 ...

  5. Android开发中的小技巧

    转自:http://blog.csdn.net/guxiao1201/article/details/40655661 简单介绍: startActivities (Intent[] intents) ...

  6. django drf框架中的user验证以及JWT拓展的介绍

    登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个 ...

  7. Linux以及Android开发中的小技巧和长繁命令记录收集

    不断更新收集中.... 201407161654 ssh以nx_guest的身份登录到172.24.221.137,然后在172.24.221.137与172.24.61.252的8080port建立 ...

  8. 分享几个asp.net开发中的小技巧

    下面这几个,是在实际开发或阅读中发现的一些问题,有些甚至是有很多年开发人员写出的代码,也是很多人经常犯的错误.各位可以看看,你有没有躺着中枪. 第一个,对整型变量进行非null判断. // a 是in ...

  9. 个人理解---在开发中何时加入日志记录功能[java]

    是这样的:俩个月前做的一个小功能,今天经理突然问我这个'清除复投记录'功能是不是我做的,我说是,很久以前了.他说昨天一个客户找过来了,后台把人家的复投记录清除掉了,不知道何时清除的,我记得当时做的时候 ...

随机推荐

  1. 前端2CSS2

    内容概要 伪元素选择器 选择器优先级 字体样式 文字属性 背景属性 display属性 边框属性 盒子模型 浮动(重要) 解决浮动造成的影响 内容详情 伪元素选择器 """ ...

  2. 阶段性总结 GDOI 2022 PJ

    阶段性总结 GDOI 2022 PJ 比赛经过 Day ? ~ Day -1 半停课集训,补了很多东西,但是之前漏得太多了,结果是还有很多题没改 打了若干场 AtCoder ,承认自己思维的不足,训练 ...

  3. 【Java面试】数据库连接池有什么用?它有哪些关键参数?

    一个工作5年的粉丝找到我,他说参加美团面试,遇到一个基础题没回答上来. 这个问题是:"数据库连接池有什么用?以及它有哪些关键参数"? 我说,这个问题都不知道,那你项目里面的连接池配 ...

  4. [安洵杯 2019]easy_web-1

    1.首先打开题目如下: 2.观察访问的地址信息,发现img信息应该是加密字符串,进行尝试解密,最终得到img名称:555.png,如下: 3.获得文件名称之后,应该想到此处会存在文件包含漏洞,因为传输 ...

  5. 经典漏洞-后台备份数据库getshell

    由于接触安全时间不多,一些老的getshell方法不是很清楚.这次碰到了个老站,正好学习了一下. 首先这边是用户名可以猜测出来的,因为输入错误的用户名显示用户名不存在,如果存在的话会显示密码错误. 爆 ...

  6. BUUCTF-爱因斯坦

    爱因斯坦 16进制打开可以看到存在压缩包,使用binwalk分离出来 提示需要解压密码,按照常理爆破四位数纯数字没有出来,查看图片属性发现密码 得到flag

  7. ABAP CDS - Annotations 注解

    Syntax ... annotation[.annotation1[.annotation2]][:value]  ... Effect Annotation that can be specifi ...

  8. React技巧之表单提交获取input值

    正文从这开始~ 总览 在React中,通过表单提交获得input的值: 在state变量中存储输入控件的值. 在form表单上设置onSubmit属性. 在handleSubmit函数中访问输入控件的 ...

  9. Consider defining a bean of type 'redis.clients.jedis.JedisPool' in your configuration.

    报错信息 原因是没有Jedispool没有注入 import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml ...

  10. 数据访问 - EntityFramework集成

    前言 Masa提供了基于EntityFramework的数据集成,并提供了数据过滤与软删除的功能,下面我们将介绍如何使用它? MasaDbContext入门 安装.Net 6.0 新建ASP.NET ...