我在Flask中使用jinja2.ChoiceLoader
遇到了一个非常奇怪的问题(也尝试了使用FileSystemLoader
的多个路径,没有喜悦)。
我有几个“主题”目录,就像这样。
/templates/
themes/
default/
layout.html
menu.html
blue/
layout.html
grey/
menu.html
...
而且,如果所选主题没有所需的模板,我想回退到default/
,所以我像这样使用ChoiceLoader。
@app.before_request
def setup_request():
current_theme = get_theme()
logging.info('Using theme %s'%(current_theme))
app.jinja_loader = jinja2.ChoiceLoader([
jinja2.FileSystemLoader('/templates/themes/%s/'%(current_theme)),
jinja2.FileSystemLoader('/templates/themes/default/')
])
很好,但是如果我更改<current_theme>
,它仍然会从旧文件夹加载主题,直到我重新加载Apache或重新启动Flask开发服务器为止。
它应该使用新主题。 Logging表示它正在使用更改后的主题,但显然app.jinja_loader
有点像蜜badge ...在我重新加载Apache之前,它完全忽略了它。
编辑:这似乎与Flask有关,因为相同名称的所有文件都属于同一文件。我可以使用内置服务器(DEBUG = True),Cherry和mod_wsgi进行复制。这个人似乎有一个类似的问题,但没有简单的解决方案:flask blueprint template folder在我需要为单个应用程序级联模板的意义上,我的情况有所不同。他的问题与蓝图之间的级联模板有关,但实际上可能是同一问题。
这是“ get_theme()”调用中的代码:
def get_theme():
# I know this is unsafe, testing only
return request.args.get('theme','default')
编辑2:我需要更改主题之间的HTML和JavaScript,而不仅仅是CSS。这就是为什么我不只是加载不同的CSS文件。此外,其中一些主题是针对移动设备的,与其他主题几乎没有共通之处。
编辑3:两种解决方案。解决方案1:唯一命名文件,例如“ blue.layout.html”和“ default.layout.html”。这可以完美地工作,但是不能按要求级联。解决方案2:使用相对路径,所以使用include 'file.html'
代替include 'theme/blue/file.html
。我通过创建一个get_theme_file()
函数来实现级联,该函数检查活动主题,检查文件是否存在(如果不存在,回退到“默认”主题),并返回相对路径。我只需要确保包含的所有内容都看起来像{% include get_theme_file('file.html') %}
。这并不优雅,但是我发现与Flask的低级摆弄使用here更为优雅。
参考方案
顺便说一句,您可以将多个位置传递到FileSystemLoader
,这是加载模板的推荐方法
这是Apache中带有mod_wsgi
的预期行为(我假设您正在使用)。文件系统更改不会触发所有进程的重新加载。请参阅讨论此内容的Flask文档中的this entry,并提供一种解决方法,该方法可以添加:
WSGIScriptReloading On
转到应用程序的配置部分,然后touch
编写wsgi
文件以触发子进程的重新加载。
您确定这是您的打算吗?大多数主题切换技巧都依靠级联样式表(CSS)的级联部分来控制主题。
在返回'Response'(Python)中传递多个参数 - python我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…
Python exchangelib在子文件夹中读取邮件 - python我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…
python JSON对象必须是str,bytes或bytearray,而不是'dict - python在Python 3中,要加载以前保存的json,如下所示:json.dumps(dictionary)输出是这样的{"('Hello',)": 6, "('Hi',)": 5}当我使用json.loads({"('Hello',)": 6,…
R'relaimpo'软件包的Python端口 - python我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。
Python GPU资源利用 - python我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…