【问题标题】:Unable to render template with flask wsgi [duplicate]无法使用烧瓶 wsgi 渲染模板 [重复]
【发布时间】:2020-08-14 08:42:20
【问题描述】:

我已经部署了一个烧瓶应用程序,使用 mod_wsgi 和 apache2

现在,检查一切是否按预期工作,看起来我渲染模板的端点引发了大约 500 个状态代码错误。

这是我项目的近似树:

main_folder
  requirements.txt
  mainfile.wsgi
  app_folder
    controllers
      views.py
    models
    repository
    services
    static
    templates
      terms
        en
          terms.html
        fr
          terms.html
    uploads
    __init__.py
    config.cfg
    webapp.py

我正在调用一个应该呈现 templates/terms/en/terms.html 的端点,我在日志中得到以下信息:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/dist-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.7/dist-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.7/dist-packages/flask/app.py", line 1820, in handle_user_exception
     reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.7/dist-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib/python3.7/dist-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.7/dist-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/var/www/main_folder/app_folder/controllers/views.py", line 33, in gts
    return render_template('terms/' + lang + '/terms.html')
  File "/usr/local/lib/python3.7/dist-packages/flask/templating.py", line 138, in render_template     
    ctx.app.jinja_env.get_or_select_template(template_name_or_list),
  File "/usr/local/lib/python3.7/dist-packages/jinja2/environment.py", line 869, in get_or_select_template
    return self.get_template(template_name_or_list, parent, globals)
  File "/usr/local/lib/python3.7/dist-packages/jinja2/environment.py", line 830, in get_template
    return self._load_template(name, self.make_globals(globals))
  File "/usr/local/lib/python3.7/dist-packages/jinja2/environment.py", line 804, in _load_template
    template = self.loader.load(self, name, globals)
  File "/usr/local/lib/python3.7/dist-packages/jinja2/loaders.py", line 113, in load
    source, filename, uptodate = self.get_source(environment, name)
  File "/usr/local/lib/python3.7/dist-packages/flask/templating.py", line 60, in get_source
    return self._get_source_fast(environment, template)
  File "/usr/local/lib/python3.7/dist-packages/flask/templating.py", line 89, in _get_source_fast
    raise TemplateNotFound(template)
jinja2.exceptions.TemplateNotFound: terms/en/terms.html

这是我尝试在app_folder/controllers/views.py 中呈现模板的代码摘录:

from flask import render_template, request, send_file

from app_folder.controllers import Controllers as controllers

def gts(lang='fr'):
    return render_template('terms/' + lang + '/terms.html')

controllers().register(
    '/cgu/<string:lang>',
    'cgu_lang',
    gts
)

我想指定具有 JSON 正文结果的端点正在运行,上传资源也正常工作,并且正在获取上传的资源。

只有应该呈现模板的端点不起作用,这也让我担心应该使用电子邮件模板发送电子邮件的端点

在使用 wsgi 为应用程序提供服务时,我应该应用什么修复程序吗?

编辑:仅供参考,这是控制器文件夹中的__init__.py

import pkgutil


METHODS = set([
    'GET',
    'POST',
    'PUT',
    'PATCH',
    'DELETE',
    'COPY',
    'HEAD',
    'OPTIONS',
    'LINK',
    'UNLINK',
    'PURGE',
    'LOCK',
    'UNLOCK',
    'PROPFIND',
    'VIEW'
])


class Controllers:

    class __OnlyOne:

        # ======================================================
        #           the code goes here
        # =======================================================

        def __init__(self):
            self.val = None
            self.rules = []

        def __str__(self):
            return 'self' + self.val

        def register(self, rule, view_name, view_func):
            r = {}
            r["rule"] = rule
            r["view_name"] = view_name
            r["view_func"] = view_func

            self.rules.append(r)

        def register_methods(self, rule, view_name, view_func, methods=METHODS):
            r = {}
            r["rule"] = rule
            r["view_name"] = view_name
            r["view_func"] = view_func
            r["methods"] = methods

            self.rules.append(r)

        def grab(self, app):
            for r in self.rules:
                if "methods" not in r.keys():
                    app.add_url_rule(r["rule"], r["view_name"], r["view_func"])
                else:
                    app.add_url_rule(r["rule"], r["view_name"],
                                     r["view_func"], methods=r["methods"])

        # =================================================================
        #           the code goes up there
        # ==================================================================

    instance = None

    def __new__(cls):  # __new__ always a classmethod
        if not Controllers.instance:
            Controllers.instance = Controllers.__OnlyOne()
        return Controllers.instance

    def __getattr__(self, name):
        return getattr(self.instance, name)

    def __setattr__(self, name):
        return setattr(self.instance, name)


# import all the modules in folder
__all__ = []
for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
    __all__.append(module_name)
    _module = loader.find_module(module_name).load_module(module_name)
    globals()[module_name] = _module

【问题讨论】:

  • 对于lang='fr',我在文件夹中看不到模板
  • @Codenewbie 有,但我没有在问题中将它添加到我的树中
  • 很高兴你找到了解决方案 --- 永远记住错误 raise TemplateNotFound(template) 这意味着模板实际上不存在或在相对路径中找不到...
  • 问题是,我无法像在远程服务器上那样调试它,当然,当我使用flask run 启动开发服务器时它可以工作,因为它并不真正需要wsgi 层,所以它从app_folder 运行,其中templates 文件夹是

标签: python-3.x flask jinja2 mod-wsgi


【解决方案1】:

我将我的app_folder/templates 符号链接到我的main_folder,它现在可以工作了

【讨论】:

    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2018-06-09
    • 2014-07-17
    • 1970-01-01
    相关资源
    最近更新 更多