【问题标题】:Local development (invoking python <script>, port 8888) serves stale files本地开发(调用 python <script>,端口 8888)提供陈旧文件
【发布时间】:2013-02-12 03:22:42
【问题描述】:

我在运行 fast-cgi 时遇到了类似的问题,我被告知无法修复它:Files being served are stale / cached ; Python as fcgi + web.py + nginx 无需进行自定义工作。我被告知使用 python 方法,它调用本地“Web 服务器”来托管 python 页面。

即使这样做,所提供的文件也是陈旧/缓存的。如果我对文件进行编辑、保存并刷新,python 网络服务器仍在为陈旧/缓存的文件提供服务。

让它为修改后的文件提供服务的唯一方法是杀死 (ctrl+c) 脚本,然后重新启动...每次大约需要 5 秒,严重阻碍了我的开发工作流程。

理想情况下,脚本的任何更改都会在下次从 Web 服务器请求页面时反映出来。

编辑

@Jordan:感谢您的建议。我试过#2,它会产生以下错误:

    app = web.application(urls, globals(), web.reloader)

AttributeError: 'module' object has no attribute 'reloader'

根据此处的文档:http://webpy.org/tutorial2.en

然后我尝试了建议#4,

web.config.debug = True

两者仍然会导致提供“陈旧”文件。

【问题讨论】:

  • 你能提供一些示例代码来重现这个吗? (我构建的几乎所有长时间运行的 python 服务都遇到过这个问题。有几种可能的解决方案,但它们并不都适合所有基于 python 的 Web 框架。)

标签: python fastcgi ubuntu-12.10


【解决方案1】:

可以理解,您想要一个简单的、设置一次就再也不用担心的解决方案。但是你可能会让这个问题变得比它需要的更困难。

我通常为 apache/modwsgi/nginx 堆栈编写应用程序。如果我有缓存问题,我只需重新启动 apache,瞧,我的 python 文件被重新解释。我不记得在我所有不同的机器(mac、ubuntu、centos 等)上重新启动 apache 的命令,我不需要这样做。

这就是命令行别名的用途...

python 应用程序在运行之前被解释,当在网络服务器上运行时,它运行一次并且应该被认为是无状态的。这与在浏览器中运行的 javascript 不同,后者可以被认为是有状态的,因为它是一个持续运行的 VM。您可以在运行时编辑 javascript,这对于该语言的大多数应用程序来说可能没问题。

在 python 中,您通常编写代码并运行它,如果这不起作用,则重新开始。您不会实时编辑代码。这意味着您有意保存源代码并更改上下文以运行它。

我打赌您正在从图形 IDE 编辑源代码,而不是像 vi 或 emacs 这样的命令行编辑器(我可能错了,我并不是说这有什么“错误”)。我只使用 IDE 编写 iOS 应用程序,其他一切我坚持 ViM。为什么?因为那时我总是在命令行上,我不会被任何东西(动画、鼠标指针、通知)分心。我写完代码,我快速输入':wq'(写入并退出),然后快速输入'restartweb'(实际上我通常输入're'然后自动完成)这是我的别名 到任何重启 apache 的命令。瞧,我的 python 被重新解释了。

我的意思是,您可能应该保持简单并使用 别名 之类的东西来解决您的问题。这可能不是你能做的最酷的事情。但这是 Ninja 编码人员在过去 20 年中一直在做的事情,以快速简单地完成工作。

现在显然我只建议了 apache 的解决方案,而我之前从未使用过 web.py。但同样可能的解决方案仍然适用。在项目目录中创建一个 bash 脚本,将其命名为 restart.bash。在里面放一些类似的东西:

rm -r *.pyc

这将递归删除所有已编译的 pyc 文件,从而强制您的应用重新加载。然后在运行该文件的 ~/.bashrc 中创建一个 别名

类似:

alias restartproject="bash /full/path/to/restart.bash"

神奇,现在您有了一个可以在任何地方工作的解决方案,无论您选择从哪种类型的 Web 服务器运行您的应用程序。

编辑: 现在您有了一个适用于任何地方但在 Windows IIS 服务器上的解决方案。如果你想从 Windows 运行 python,你可能应该 Stahp!拥抱

我们使用的是virtualenv 对吗? :) 我们想让我们的 python 保持良好且与系统无关,这样我们就可以把它卖给任何人,对吧? :) 如果你不使用 ViM 和 emacs,你真的应该看看它们……你会用头撞墙一个星期来适应它,然后再也不想碰鼠标了。

【讨论】:

  • 我没有使用 virtualenv,事实上我昨天在 mongo 安装 web 前端时偶然发现了它。否则我会听到你在说什么。我认为这是有道理的,我需要以不同的方式处理这个问题。谢谢。
  • 说真的,使用 virtualenv,你可能认为你不需要它,但它总能让你的生活更轻松。即 -> 在你的 ubuntu 机器上开发一些东西,突然你决定在项目中间购买一台 OSX 机器,你将你的东西移到新机器上,突然你到处都缺少依赖项。使用 virtualenv 调用“pip freeze > requirements.txt”和“pip install requirements.txt”比尝试手动安装依赖项和处理错误要容易得多
  • 然后您只需将 requirements.txt 包含在您的 mercurial 存储库中,现在更好的是,您的依赖项包含在您的源代码控制中! :)
  • 大声笑,现在我说了,如果你不是,你肯定应该使用源代码控制...... :) 有些人会抨击它,但如果你不这样做,你可能应该检查 mercurial不要使用它。水银是我的女朋友。她对我很好。除非我与一个庞大的团队一起工作,否则几乎没有理由使用 git/cvs/tfs(你不想知道这是什么)
【解决方案2】:

没错,所以 Python 在 Web 服务器上运行时是一种编译语言。它正在输出一个 .pyc 文件,它是编译后的版本。您的目标是告诉 Web 服务器 .pyc 文件已过期且不再有效。

你有几个选择:

  1. 删除相关的.pyc文件
  2. 对于 web.py,使用重载中间件
  3. 向它发送 HUP 信号(我很懒,通常会使用 killall -SIGHUP python)。您可以使用 watchdog 之类的文件监视工具自动执行此操作(感谢 barracel)。
  4. web.config.debug = True 应该是您应用程序中的默认值

这些选项都不适合您?

【讨论】:

  • HUP 有效,但这是一个糟糕的工作流程。我只想编辑文件并在浏览器中刷新以查看更改。我会检查 web.config.debug,希望它有效。我今晚会回来报告。
  • 可以使用watchdog监控文件修改并发送HUP信号
  • 在答案中添加了@barracel 的评论。谢谢。
  • 对于开发,我推荐选项 #2,并使用 web.run() 运行您的应用程序。 nginx/fcgi 是一个很好的生产设置,但它缺少自动重新加载代码和调试助手等细节。
  • 我已根据 #2 和 #4 的结果更新了我的原始问题。
猜你喜欢
  • 2021-07-23
  • 2013-01-18
  • 2011-03-23
  • 1970-01-01
  • 2016-10-11
  • 2011-06-29
  • 2020-12-02
  • 1970-01-01
  • 2014-01-09
相关资源
最近更新 更多