问题记录

问题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. [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用

    ​使用Docker容器方案可以快速安全地将项目部署到客户的服务器上,作为公司项目,需要解决两个问题: 1. 需要搭建一个私有的Docker仓库,以便安全的存储镜像 2. 需要一套自动化发布方案,实现代 ...

  2. MathType7安装使用及please restart word to load mathtype addin properly的问题

    MathType7安装使用及please restart word to load mathtype addin properly的问题.最近在自己的电脑上安装Mathtype7,把遇到的问题和解决办 ...

  3. 【摸鱼神器】UI库秒变LowCode工具——列表篇(二)维护json的小工具

    上一篇介绍了一下如何实现一个可以依赖 json 渲染的列表控件,既然需要 json 文件,那么要如何维护这个 json 文件就成了重点,如果没有好的维护方案的话,那么还不如直接用UI库. 所以需要我们 ...

  4. Arraylist集合、对象数组

    Arraylist集合 ArrayList是List接口的一个实现类,它是程序中最常见的一种集合. 他的特点:在增加或删除指定位置的元素时,会创建新的数组,效率比较低,因此不适合做大量的增删操作,Ar ...

  5. hadoop MapReduce运营商案例关于用户基站停留数据统计

    注 如果需要文件和代码的话可评论区留言邮箱,我给你发源代码 本文来自博客园,作者:Arway,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/hadoop-mapR ...

  6. Leetcode----<Re-Space LCCI>

    题解如下: /** * 动态规划解法: * dp[i] 表示 0-i的最小不能被识别的字母个数 * 求 dp[k] 如果第K个字母 不能和前面的字母[0-{k-1}]合在一起被识别 那么dp[k] = ...

  7. java请求登录接口代码示例

    前言 近期研究如何利用java代码如何获取其他系统中所需的数据,自己总结的方法如下: 1.工具类代码 /** * <pre> * 方法体说明:向远程接口发起请求,返回字符串类型结果 * @ ...

  8. nginx启动失败/报错(bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket...permissions) nginx启动失败

    出现这个问题是因为80端口被占用了 1.cmd输入命令netstat -aon|findstr "80" 2..查看80端口 16356对应的任务 输入命令 tasklist|fi ...

  9. NC24017 [USACO 2016 Jan S]Angry Cows

    NC24017 [USACO 2016 Jan S]Angry Cows 题目 题目描述 Bessie the cow has designed what she thinks will be the ...

  10. Tapdata 等40余家行业知名企业,应邀参与共建 NextArch Foundation

      日前,Linux 基金会执行董事 Jim Zemlin 于 Linux 基金会会员峰会(The Linux Foundation Member Summit)上宣布,Linux 基金会正式成立 N ...