如何在模板更改时重新加载pserve?

2 投票
3 回答
2034 浏览
提问于 2025-04-18 07:25

我在使用 pserve --reload 时,任何 Python 代码的修改都能自动重载,但每次我更改模板时,还是需要手动重载。

我写了一个小脚本,可以监控我的模板文件夹,看有没有变化,但我想知道怎么才能重载 pserve?如果我需要在我的 Pyramids 项目里,比如在 init.py 里,调用一个 pserve 的方法来重载,那我应该调用哪个方法呢?

#!/usr/bin/env python
import sys
import pyinotify
from subprocess import call
import time

wm = pyinotify.WatchManager()
mask = pyinotify.IN_DELETE | pyinotify.IN_CREATE | pyinotify.IN_MODIFY

class EventHandler(pyinotify.ProcessEvent):
    def process_IN_MODIFY(self, event):
        print "Modified: ", event.pathname

        # This is where my reload call would go...            
        # call(["pserve", "reload"])

handler = EventHandler()
notifier = pyinotify.Notifier(wm, handler)
wdd = wm.add_watch("/path/to/my/pyramid/templates/", mask, rec=True, auto_add=True)

notifier.loop()

3 个回答

1

确保你把配置对象设置成可以从development.ini文件中获取设置。可以这样写:config = Configurator(settings = settings)

1

顺便说一下,这个解决方案脚本挺不错的。Steve说得对,pyramid本身就提供了这个功能。不过,pyramid自带的监控功能还得看你的配置。把pyramid_jinja2加到你的pyramid项目里,会触发很多pyramid内部的东西,并且对模板文件的扩展名(*.jinja2)也有一些假设。

pyramid_jinja提供了模板重新加载的配置选项——你可以选择开启或关闭这个功能。从pyramid 1.5版本开始(你用的是这个版本吗?),你还可以使用设置`pyramid.reload_templates`。

不过,最好的办法是试试使用jinja2模板的pyramid脚手架。设置起来只需要5分钟,然后你可以修改一个jinja2模板,看看pyramid是否会重新加载。如果pyramid真的在重新加载,那就说明你可以继续调试你当前应用中的问题了。

6

Pyramid已经提供了一种方法,可以在不重启pserve的情况下重新加载模板。你只需要把相关的配置放在一个叫做PasteDeploy的development.ini文件里,或者使用环境变量就可以了。具体可以参考这个链接:环境变量和.ini文件设置。不过要注意,千万不要在生产环境中启用模板重新加载,因为这会让你的应用变得很慢。

撰写回答