禁用Apache对Python文件的缓存

4
我正在使用Django并进行Facebook集成,需要一个测试服务器。我在Apache和其缓存.pyc文件方面遇到了很多问题,我甚至在这里在stackoverflow上询问过。
那个解决方案有效,但我想知道是否有禁用Apache缓存此类文件的选项。服务器重启可能对我造成麻烦。
编辑:
这是django.wsgi代码:
path = '/not/actual/path'
if path not in sys.path:
    sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'notactualproj.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

你在使用Git还是Hg进行源代码管理? - arulmr
1个回答

8

如何解决“字节码问题”

您应该弄清楚为什么首先会有这些不需要的 .pyc 文件(它们是否在您的存储库中?它们应该被忽略)。

如评论所述,如果存在导致问题的悬空的 .pyc 文件,则在部署更新的代码到服务器时,您可以将删除所有 .pyc 文件作为拉取过程的一部分。运行应用程序时,导入模块将重新创建所需的文件。


现在,如果您真的不想生成字节码,您可以使用 PYTHONDONTWRITEBYTECODE 环境变量,但我不建议这样做,因为它似乎是一个相当过度的解决方案。

如何解决Apache似乎调用旧版本的代码的问题。

现在,您必须区分这里涉及的两个问题。

  • 由Python生成的旧字节码文件(例如 .pyc 文件),可能会在特定情况下引起问题,例如将文件替换为模块,但通常不是引起关注的原因。
  • Mod WSGI未重新加载上传的新代码。这取决于您运行Mod WSGi的模式,通常症状是点击页面似乎会随机拉出较新或较旧版本的代码。

解决第一个问题,您只需删除未使用的字节码文件即可。但是,再次强调,这可能不是导致问题的原因。

要解决第二个问题,您有两种解决方案:

  • 上传新代码时重新启动Apache。使用 apache2ctl -k graceful,对用户透明,除非您在共享主机上。
  • 使用代码重新加载,您可能需要查看 mod_wsgi 文档。

我认为字节码不是您的问题,代码重新加载可能是问题所在。


我的意思是那些.pyc文件不应该在代码库本身中。当代码从.py文件运行时,它们将会在运行时动态生成。然而,一个不需要的.pyc文件可能会留在你的代码树中,即使它所对应的.py文件已经被删除了,这可能会导致问题(比如你正在将一个文件转换为模块)。你可以在拉取更改后添加清理你的代码树的步骤 - 必要的.pyc文件将会自动重新创建。 - Thomas Orozco
是的,我正在使用mod_wsgi设置。 - prototype
我在上面的问题中插入了django.wsgi代码。在评论区里看起来非常糟糕。 - prototype
我认为.pyc文件不会引起你的问题。此外,.pyc文件与缓存或Apache无关。它们是由Python本身生成的,是您的.py文件的字节码编译版本。请参见我的编辑答案,以获取有关如何解决实际问题的更详细说明。 - Thomas Orozco
@dark4p,你真的读过被引用到的mod_wsgi网站上有关源代码重新加载的文章吗?当你推送代码更改时,你需要做一些事情来强制现有运行的进程重新加载代码。它不能像PHP那样自动重新加载任何代码更改。 - Graham Dumpleton
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接