在一个django项目中用python manange.py runserver启动一个内置server以后,
当修改了这个项目的某个python文件,内置的server会自动重启以加载新的文件,这个功能看上去很cool,
大大节省了开发调试过程中手动重启server的时间。 今天抽空看了一下其实现的代码,
发现原来这个autoreload的功能是可以完全独立于django的一个模块。
runserver是django management的一个command, 源文件位置在 django目录/core/management/commands/runserver.py, 在文件的最后可以看到这样几行代码:
from
django.utils
import
autoreload
|
autoreload.main(inner_run)
|
不难看出, 真正干活的其实是inner_run, 而负责自动重启server的是django.utils里面的autoreload.
是否reload的判断条件都是检查sys.modules中各个模块文件的最后修改时间是否有所变化,
但是由于python和jython的线程机制的不同,autoreload.py针对python和jython做了不同的处理, jython
reloade的实现:
def
jython_reloader(main_func, args, kwargs):
|
from
_systemrestart
import
SystemRestart
|
thread.start_new_thread(main_func, args)
|
相比较python环境下的实现要稍微发杂些, python_reloader
设置一个环境变量RUN_MAIN,然后复制一个当前进程的子进程(不是线程哦),
然后在这个新进程中启动一个线程去真正干活儿,一个线程检查文件是否修改,当有文件修改的时候, 退出新启动的进程( sys.exit(3) ),
这时父进程会判断是否是因为修改文件导致(返回码为 3), 是则再启动一个新进程去干活儿, 否则整个程序退出。
具体细节还是看代码更清晰一些, 整个autoreload的代码跟django没有耦合, 可以单独使用。
如是做了如下尝试:
from
django.utils
import
autoreload
|
保存,然后在命令行运行之,期间修改源码,将print ‘aaa…’改成print ‘bbb…’, 保存, 可以看到之前运行的程序输出为:
可见在调试一个daemon程序的时候,通过autoreload加入自动加载功能是多么easy的事情了
补充:之后又看了以下webpy的内置server的reload功能的实现,在webpy的application.py中能找到reload的时间, 大致原理是每个request都做一下是否reload的检查, 耦合度比较紧。
相关推荐
Django的`runserver`命令包含了autoreload功能,该功能基于Python的标准库`watchdog`和`multiprocessing`等模块实现。当开发者运行`python manage.py runserver`时,Django会根据设置自动检测项目中的文件变化,并在...
* contrib:由 Django 的开发者贡献的功能模块,但既然都已经随版本发布,就表示是官方的。 * core:Django 的核心处理库,包括 url 分析、处理请求、缓存等,其中处理请求是核心了,比如处理 fastcgi 就是由 wsgi....
在本文中,我们将深入探讨如何使用Django框架来实现用户登录和注册功能,这对于任何Web应用程序来说都是核心组件。Django是一个用Python编写的高级Web框架,它鼓励快速开发和简洁实用的设计理念。 首先,我们需要...
基于Python+Django的多功能 Web 应用渗透测试系统实现源码+说明教程(高分项目)含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单...
在Django项目开发过程中,autoreload(自动重载)功能为开发者提供了极大的便利。通过该功能,当开发者修改了代码之后,服务器能够自动检测到这些变化并重新加载应用程序,从而避免了频繁的手动重启服务器过程。这种...
使用Django实现的文件分享系统,实现搜索功能,分享功能,用户分享文件查询,写该项目的目的主要是用于保存一些电子书籍和学习资料,方便自己和其他人查找资料,所以对文件大小进行限制最大为5M。 使用Django...
cd django-spider python manager.py runserver 打开127.0.0.1:8000 具有登录执行,爬取html页面的功能。登录用户root密码root 具有登录执行,爬取html页面的功能具有登录执行,爬取html页面的功能具有登录执行,...
在本资源中,"Python开发工程师学会用 Django 框架实现功能Django 网站02.zip",我们聚焦于Python后端开发中的Django框架,这是一款强大且高效的Web开发工具,广泛用于构建复杂的网站应用。Django以其“ batteries ...
本资料包"Python开发工程师学会用 Django 框架实现功能方法实现.zip"显然是针对希望深入理解和掌握Django框架的Python开发者设计的。下面我们将详细探讨Django框架及其主要功能,以及如何利用它来实现Web应用的各种...
基于 Pythgo的 Django 框架,编程实现一个 WEB 程序,为用户提供 城市信息查询功能。用户可输入一个城市名,输出其所在省份名称和邮编 等信息。例如,输入“桂林市”,输出“广西壮族自治区”和“541000”等 城市...
python基于django 实现的物资管理系统,有二维码生成和扫码功能。 此作品为作者学习Python后的第一个作品,所有的视图处理都放在了VIEW视图里,而且鄙人比较懒,并不想在model加函数了,程序结构很臃肿,对于一些...
Django Web框架还提供高级功能,例如ORM,数据库迁移,用户身份验证,管理面板和表单。 Django程序员喜欢该框架,因为它具有简化数据库工作的功能。它加快了开发过程,并使开发人员能够构建可伸缩的应用程序。 ...
Python开发Django 框架实现功能01. 理解 Django 的 MTV 模式01.mp4
Python开发Django 框架实现功能02. 理解 Django 的 MTV 模式02.mp4
Python开发Django 框架实现功能08. 用 Post 方法实现 django 表单.mp4
Python开发Django 框架实现功能10. 用Django分页器实现文章分页.mp4
Python开发Django 框架实现功能04. 实现第一个 Django 网站02.mp4