惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Spread Privacy
Spread Privacy
Engineering at Meta
Engineering at Meta
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
D
DataBreaches.Net
N
Netflix TechBlog - Medium
T
The Blog of Author Tim Ferriss
L
LangChain Blog
Jina AI
Jina AI
MongoDB | Blog
MongoDB | Blog
B
Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tailwind CSS Blog
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
T
Threatpost
V
V2EX
Security Archives - TechRepublic
Security Archives - TechRepublic
GbyAI
GbyAI
Scott Helme
Scott Helme
Cyberwarzone
Cyberwarzone
H
Help Net Security
大猫的无限游戏
大猫的无限游戏
Security Latest
Security Latest
T
The Exploit Database - CXSecurity.com
T
Tenable Blog
S
Schneier on Security
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
F
Full Disclosure
腾讯CDC
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Security @ Cisco Blogs
A
Arctic Wolf
S
Securelist
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Tor Project blog
The Register - Security
The Register - Security
L
LINUX DO - 最新话题
Blog — PlanetScale
Blog — PlanetScale
U
Unit 42
V
Vulnerabilities – Threatpost
Google Online Security Blog
Google Online Security Blog
L
LINUX DO - 热门话题
TaoSecurity Blog
TaoSecurity Blog
Y
Y Combinator Blog
博客园 - 三生石上(FineUI控件)
C
CERT Recently Published Vulnerability Notes

Django

请教下 哪款 vscode 插件可以通过点击跳转 urls 定义 - V2EX Django 一文告诉你 all 懒加载的机制 - V2EX 大家学习编程做项目的时候一开始会容易卡壳吗?比如我今天一个下午才弄出来了博客当中的文章评论加回复功能,有时候会因为一个小点卡壳,稍微复杂点的逻辑就感觉脑子不够用,甚至是给 html 的 div 取变量名的时候脑子也会不够 - V2EX 请教在 ubuntu23 中如何 让 Django runserver 开机自启动 - V2EX 请教 Django runserver 开机自启动的问题 - V2EX 不知道开发的流媒体合租平台有没有意义… - V2EX 公司自主招聘(远程)后端 Go 开发,想要远程岗位抓紧啦 - V2EX [求助] Mediacms 接入 Keycloak - V2EX 有没有好的 drf 项目可以学习下的? - V2EX django 快速开发明明 drf 更好,为啥还是很多人更推荐 fast.api 和忍者 - V2EX django 的同步机制有性能瓶颈为什么还是有很多人用? - V2EX 大家怎么处理开发时 Migration 一大堆,修修改改啰啰嗦嗦,同步到生产之前还得检查合并下这个问题的? - V2EX Django 模型自定义 Manager 自定义 filter 如何支持链式调用? - V2EX python3 manage.py build_index 这条 Django 命令到底啥意思啊?官方文档找不到说明,谢谢 - V2EX 前后端分离项目, Django 良好的项目结构是怎么样的 - V2EX Django get_max_test_processes - V2EX Django makemigrations 生成的 migrations 文件,如何放在代码当前目录的文件夹中? - V2EX 请教下大家,Django 的 tests 测试模块,如何不创建新从测试数据库,而是直接操作生产环境数据库谢谢! - V2EX django 好像对于 ios 打不开 admin page - V2EX Django 模板中变量的嵌套 - V2EX 早起把网站的友链网页和自主添加友链功能撸出来了,过来收集一波友链 - V2EX 用 django 调用长时间执行的脚本,如何返还输出呢? - V2EX Django 中递归分类 model 用什么组件显示比较合适? - V2EX django 一开始没用 restfulapi 开发, 还能自动生成文档吗? - V2EX 求推 django 数据可视化插件 - V2EX django 用 docker 部署,要不要每次部署到服务器的时候改改 image 的 settings 配置 - V2EX 有没有使用 django 国际化模块的,针对 django.po 国际化文件写了一个 vscode 的插件 - V2EX Django 访问 relation 时,如何得知是谁访问的? - V2EX django admin 部分自带的 css 文件 collectstatic,生成的文件大小为 0? - V2EX Django 怎么做同一个 url,对应不同的 view 函数? - V2EX 请教 drf 全局封装 response 的优雅实现 - V2EX django 里面的原生的 sql 查询,会一直占用数据库连接吗 - V2EX Django ORM 如何才能在 save_model 插入数据库完成后,再次更新数据库? - V2EX django 定时触发任务 - V2EX 请问 django 怎么高效的获取范围内一条随机数据 - V2EX 请问 Django ORM 如何实现 left join? - V2EX [求助] Django 图片路径的问题 - V2EX 为什么 django ORM 的更新时间字段选择在程序内部生成(auto_now),而不使用 MYSQL 的 on update? - V2EX 有基于 django 的开源博客系统吗? - V2EX Django admin 当中动态显示外键的相关属性 - V2EX Django 如何获取 apscheduler 的 scheduler 实例? - V2EX django3 的 i18n 汉化求救 - V2EX 你们公司的 django 项目如何 - V2EX Django 的 ORM 的 exclude 和 filter 的区别到底是啥? - V2EX 关于如何根据 Accept 的 media_type 返回不同类型序列化数据的想法 - V2EX 推荐一本 django 源码解析的书《深入理解 Django 框架内幕与实现原理》 - V2EX 请问 Django 的 JSONField 字段有没有必要进行索引? - V2EX 分享一个在 Django 的 model 里,使用元类动态添加相似的带自定义中间表的多对多关系字段的方法 - V2EX 咨询个 django 处理耗时任务的问题,顺便找个兼职完成个 demo - V2EX
请问 Django 在启动的时,如何执行一次性业务代码? - V2EX
Phishion · 2021-11-10 · via Django

这是一个创建于 1677 天前的主题,其中的信息可能已经有所发展或是发生改变。

我尝试过各大网站转载的“放在 urls 文件里执行”的办法,但是很不幸,我发现会执行多次。

具体业务就是设计了一个 Redis Set 队列控制并发,任务正常运行的时候是可以加入、弹出的,但是如果任务在运行过程中发生死机,或者其它未知的 Django 整体崩溃,虽然概率很小,但是一旦发生这个队列就会产生脏数据,我现在是考虑启动 Django 的时候,自动清空这个队列,但是就要求这个函数仅运行一次,如果实现不了,我就只能考虑其他办法。

请问有什么其他方法能让我的业务代码在启动的时候就运行一次么?

第 1 条附言  ·  2021 年 11 月 11 日

通过各个方案对比最终结论如下:

  • 在 apps 中定义 def ready() 因为多线程的问题,不能保证执行一次,且各个线程执行的时间十分不固定
  • 在 urls 中定义与上述问题一致,且实现不优雅
  • 在中间件中定义看起来就很复杂,而且我觉得会影响性能,也没必要
  • 自定义启动命令,绝对保证只执行一次,可维护性较好(胜出)

操作如下:

1 . 新建一个文件,例如:yourapp/management/commands/startup.py

2 . 在文件中定义启动程序

from django.core.management.base import BaseCommand, CommandError


class Command(BaseCommand):

    def handle(self, *args, **kwargs):
        try:
             pass  # your code
        except Exception as e:
            raise CommandError('Initialization failed: {}'.format(e))

3 . 在外部通过 python3 manage.py startup 执行

参见: https://pythonin1minute.com/where-to-put-django-startup-code/

希望能帮助到检索到这个帖子的伙伴。

关键词 Django 首次启动 运行 代码 一次

rationa1cuzz

1

rationa1cuzz      2021 年 11 月 10 日   ❤️ 1

Django 启动执行任务吗?中间件了解一下

SmiteChow

2

SmiteChow      2021 年 11 月 10 日   ❤️ 1

1. 判断是否“产生脏数据”
2. 再重置数据

逻辑应该是这样的,而不是次数问题

676529483

3

676529483      2021 年 11 月 10 日   ❤️ 1

放在 url 里确实执行一次,但是是一个进程执行一次。用 uwsgi 或者 gunicorn 启动多个进程会发生这个问题。
从只执行一次的角度,需要别的进程来做,比如 celery 、job 平台等。
但我感觉你说的业务场景,可以适当修改下更好,比如执行队列数据时,发现历史脏数据就清除掉

huazhaozhe

5

huazhaozhe      2021 年 11 月 10 日 via Android   ❤️ 1

redis 本身不就可以做嘛
另外这个很奇怪啊,如果要清空队列那不是任务就没了,那我崩溃了几次就清除几次和一次启动清除了几次有啥区别,脏数据嘛用其他方式解决,保证重复任务也没问题这样子?

Phishion

6

Phishion      2021 年 11 月 10 日

@SmiteChow 判断是否有脏数据就要查表,我可以接受启动的时候查询一次是否有脏数据,但是我不能隔段时间就轮询一次数据库,所以还是要解决如何让它只启动一次的问题。

Phishion

7

Phishion      2021 年 11 月 10 日

@huazhaozhe 崩溃其实是极端条件,我外面全部 try 包来了,可以保证任务是否成功都能安全退出队列,另外请问 redis 本身怎么做?我任务队列要持久化的,对应的 Key 肯定不能设置超时

Phishion

9

Phishion      2021 年 11 月 10 日

@676529483 感谢回复,你这个方法是最稳的,但是这块儿代码我想让它 15 秒轮询一次,因为除非是极端条件,否则根本不会出现这样的事情,所以想尽量不查表完成,当然也不是必须,如果我没找到好的方法就按常规的解决。

vicalloy

11

vicalloy      2021 年 11 月 10 日   ❤️ 1

写个 django 从 command ,在 crontab 里定时调用。

chuanqirenwu

12

chuanqirenwu      2021 年 11 月 10 日   ❤️ 1

重写 get_asig_application 或者 get_wsgi_application 方法,在 django.setup 后执行校验逻辑,另外可以看下 django 的 system check 系统,应该有相应的 hook 。

kidblg

14

kidblg      2021 年 11 月 10 日   ❤️ 1

面向可维护的开发吧,得考虑后来接手人的感受。

wuwukai007

15

wuwukai007      2021 年 11 月 10 日   ❤️ 1

放在 wsgi 然后 gunicorn 启动的时候指定 --preload

adoal

18

adoal      2021 年 11 月 10 日 via iPhone   ❤️ 1

没有运维知识的纯程序员往往会把什么乱七八糟的需求都用项目的主编程语言写到主程序里面去。其实呢,你的程序在生产环境运行时,可以外面包一个 sh 脚本来启动,把清理数据的操作单独写一个几行的 py 在 django 之前运行不就可以了嘛。

naijoag

19

naijoag      2021 年 11 月 10 日   ❤️ 1

def ready

Phishion

20

Phishion      2021 年 11 月 10 日

感谢各位回复,我来想一个优雅的方法解决这个问题

ericls

21

ericls      2021 年 11 月 11 日 via iPhone

ready

littlezzll

22

littlezzll      2021 年 11 月 11 日 via Android

celery ?

asmoker

23

asmoker      2021 年 11 月 11 日 via Android

可以参考下 migrate 的逻辑

yufpga

24

yufpga      2021 年 11 月 11 日

方法挺多的, 简单点在 settings.py 中做, 标准点就是楼上说的 ready, 可以翻一下你自己项目下面的 wsgi.py ,django.setup(), apps.populate(settings.INSTALLED_APPS)的源码. 楼上说多进程启动的问题, 在做这部分操作的时候,用 redis 做个分布式锁就好了

Rebely

25

Rebely      2021 年 11 月 11 日

写 command, 用 cli 调用

gaogang

27

gaogang      2022 年 5 月 29 日

@steptodream
这种方式下,如果用的 gunicorn 多进程模式启动 而且没有开启 preload_app 的话 还是会执行多次的