烧瓶模板,包括不正确的文件 - python

我在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应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…