Flask:如何提供静态HTML?

7rfyedvj  于 2023-04-18  发布在  其他
关注(0)|答案(4)|浏览(219)

我试图提供一个静态的html文件,但返回一个500错误(editor.html的副本在.py和templates目录)这是我所尝试的:

from flask import Flask
app = Flask(__name__, static_url_path='/templates')
@app.route('/')
def hello_world():
    #return 'Hello World1!' #this works correctly!
    #return render_template('editor.html')
    #return render_template('/editor.html')
    #return render_template(url_for('templates', filename='editor.html'))
    #return app.send_static_file('editor.html') #404 error (Not Found)
    return send_from_directory('templates', 'editor.html')

这就是答案:

Title: 500 Internal Server Srror

Internal Server Error

The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
r9f1avp5

r9f1avp51#

将其简化为最简单的方法:
1.将静态资源放入static子文件夹。
1.将Flask设置为默认值,也不要给予它一个static_url_path
1.通过预配置的/static/访问静态内容,以验证文件是否正常工作
如果您仍然希望重用静态文件,请使用current_app.send_static_file(),并且不要使用前导/斜杠:

from flask import Flask, current_app
app = Flask(__name__)

@app.route('/')
def hello_world():
    return current_app.send_static_file('editor.html')

这将在static文件夹中 * 直接 * 查找文件editor.html
这假定您将上述文件保存在一个包含static子文件夹的文件夹中,该子文件夹中包含一个文件editor.html
一些进一步说明:

  • static_url_path更改了静态文件可用的 URL,而不是文件系统上用于加载数据的位置。
  • render_template()假定您的文件是Jinja 2模板;如果它实际上只是一个静态文件,那么如果文件中实际可执行语法有错误或缺少上下文,那么这就太过分了,而且 * 可能 * 导致错误。
u91tlkcl

u91tlkcl2#

所有的答案都很好,但对我来说很好的是使用Flask的简单函数send_file。当你只需要发送一个html文件作为响应时,这个函数很好用,***host:port/ApiName***将在浏览器中显示文件的输出

@app.route('/ApiName')
def ApiFunc():
    try:
        #return send_file('relAdmin/login.html')
        return send_file('some-other-directory-than-root/your-file.extension')
    except Exception as e:
        logging.info(e.args[0])```
uemypmqf

uemypmqf3#

send_from_directorysend_file需要从flask变为import
如果您执行以下操作,您的代码示例将正常工作:

from flask import Flask, send_from_directory
app = Flask(__name__, static_url_path='/templates')

@app.route('/')
def hello_world():
    return send_from_directory('templates', 'editor.html')

但是,请记住,如果此文件加载其他文件,例如javascript,css等,您也必须为它们定义路由。
此外,据我所知,这不是推荐的生产方法,因为它很慢。

yeotifhr

yeotifhr4#

from flask import Flask, render_template
app = Flask(__name__, template_folder='templates')

@app.route('/')
def hello_world():
    return render_template('editor.html')

相关问题