Flask在使用Twisted运行时无法找到模板目录

19 投票
2 回答
23358 浏览
提问于 2025-04-17 08:13

根据我在这里找到的一些建议,我正在尝试使用Flask作为一个与twisted一起运行的应用程序的网页接口。

按照Flask文档的建议,我创建了一个“templates”目录,这个目录和我的脚本在同一级别。但是当我启动服务器时,出现了以下错误:

内部服务器错误

服务器遇到了内部错误,无法完成你的请求。可能是服务器负载过重,或者应用程序中有错误。

当我不尝试加载模板,而是直接在请求中写一个字符串时,一切正常。这让我觉得问题可能和加载模板有关。

from twisted.internet import reactor
from twisted.web.resource import Resource
from twisted.web.wsgi import WSGIResource
from twisted.internet.threads import deferToThread
from twisted.web.server import Site, NOT_DONE_YET

from flask import Flask, request, session, redirect, url_for, abort, \ 
render_template, flash

app= Flask(__name__)
app.config.from_object(__name__)

@app.route('/login', methods= ['GET', 'POST'])
def login():
    return render_template('login.html', error= error)

if __name__ == '__main__':
    root = WSGIResource(reactor, reactor.getThreadPool(), app)
    factory = Site(root)
    reactor.listenTCP(8880, factory)
    reactor.run()

2 个回答

6

你可以给Jinja2提供一个默认的templates目录(具体写法可以参考这里),方法如下:

import jinja2

app = Flask(__name__)
app.jinja_loader = jinja2.FileSystemLoader('path/to/templates/directory')
41

有些框架在以守护进程模式运行时,会改变你当前的工作目录,这可能就是这里发生的情况。

从0.7版本开始,Flask支持在调用Flask时传递一个叫做template_folder的参数,所以你可以试试:

import os
tmpl_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')

下面这个是一个更简短的版本,也能正常工作:

tmpl_dir = os.path.join(os.path.dirname(__file__), 'templates)
# ...
app = Flask('myapp', template_folder=tmpl_dir)

撰写回答