Django+uWSGI+Nginx部署下修改view需重启uwsgi才生效问题咨询
Django + Uwsgi + Nginx 部署后修改视图代码需重启才生效的解决方案
不需要每次修改视图代码都手动重启uWSGI,你遇到的问题是uWSGI生产环境默认的代码加载机制导致的,和你观察到的时间动态刷新现象并不冲突。
现象原因说明
- 时间能随页面刷新动态变化:
timezone.now()是每次请求命中home视图时才会执行的动态计算逻辑,属于进程运行时的实时计算,只要uWSGI工作进程正常运行,每次请求都会重新执行这行代码取最新时间,不需要重启就能更新。 - 修改视图代码后不生效:uWSGI启动工作进程时,会把所有项目代码(包括视图函数、路由配置、依赖模块等)全部加载到进程内存中,后续处理请求时直接调用内存中已加载的逻辑,默认不会主动读取磁盘上修改过的py文件。你修改磁盘上的视图代码时,内存中运行的还是启动时加载的旧版本代码,自然不会同步展示修改效果。
你当前的测试代码参考如下:
视图代码(views.py):
from django.shortcuts import render from django.http import HttpResponse from django.utils import timezone def home(request): return HttpResponse('This is the home page. 101' + str(timezone.now()))
路由代码(urls.py):
from django.contrib import admin from django.urls import path from godentiapp import views urlpatterns = [ path('', views.home, name='home'), path('admin/', admin.site.urls), ]
不同场景的解决方法
开发环境
开发阶段需要频繁修改代码调试,直接开启uWSGI的自动重载功能即可,不需要每次改完手动重启:
- 打开你的uWSGI配置文件(通常为
.ini格式,比如uwsgi.ini) - 在配置中添加参数:
py-autoreload = 1 - 手动重启一次uWSGI让配置生效,之后只要你修改了项目下的py文件,uWSGI会自动监控文件变化,重载工作进程加载新代码,刷新页面就能看到修改效果,和Django自带
runserver命令的自动热更体验一致。
注意:
py-autoreload参数仅适合开发环境使用,生产环境开启会带来额外的性能开销,还可能出现请求处理中途重载导致的异常,不建议线上开启。
生产环境
生产环境不建议频繁修改代码,每次版本更新完成后,不需要硬重启uWSGI中断用户访问,执行平滑重载命令即可:
uwsgi --reload 你的uWSGI pid文件路径
一般pid文件路径会在uWSGI配置里通过pidfile参数指定,常见路径比如/tmp/uwsgi.pid。平滑重载会等当前正在处理的请求完成后,再重启工作进程加载新代码,对正在访问的用户几乎无感知。
内容的提问来源于stack exchange,提问作者ivbtar
相关产品推荐
相关产品推荐

