访问JavaScript文件时出现"jinja2.exceptions.TemplateNotFound"错误
我正在尝试把一个数组传到一个JavaScript文件(taskTableDip.js)里,之后在一个HTML文件(supportDash.html)中创建一个表格。但是不知道为什么,Flask总是报错:jinja2.exceptions.TemplateNotFound: {{ url_for('js', filename='taskTableDip.js') }}
。奇怪的是,我发现这行代码似乎和我写的不太一样,我不确定这是不是和jinja有关,或者我是不是把文件命名错了。
WebManager_main.py
from flask import Flask, render_template, url_for
#this is the library responsible for the hosting of the Web app
from werkzeug.middleware.proxy_fix import ProxyFix
import DataBaseHandler_Main as DBHM
app = Flask(__name__)
app.config["SECRET_KEY"] = "thisistotallysecret"
app.wsgi_app = ProxyFix(app.wsgi_app)
@app.route("/")
def login():
return render_template("login.html")
#this is the login site where the user will initiall be diurected to
@app.route("/supportdash")
def supportDash():
tasks = DBHM.fetch("1.0", None)
return render_template("supportDash.html", tableData = tasks)
#if __name__ == "WebManager_main":
# app.run(port=8080, debug = True)
templates/base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/main.css') }}" />
{% block head %}{% endblock %}
</head>
<body>
{% block main %}{% endblock %}
</body>
</html>
<!-- this is th basic template for the different html files -->
templates/supportDash.html
{% extends "base.html" %}
<!--{% include "{{ url_for('js', filename='taskTableDip.js') }}" %}-->
<!-- This is to fix the issue with passing values to the js file -->
{% block head %}
<title>Siteswift - Support Team DashBoard</title>
<!--script type = "text/javascript" src = ""></script-->
<script type="text/javascript" src="{{ url_for('static', filename='js/taskTableDip.js') }}"></script>
<script type="text/javascript">
var taskData = dataReturn({{tableData|tojson}})
</script>
{% endblock %}
{% block main %}
<table>
<h1>Support Team Portal</h1>
<tr>
<th>Task</th>
<th>User</th>
<th>Priority</th>
<th>Deadline</th>
<th colspan = 3>Actions</th>
</tr>
<tbody id="taskTable"></tbody>
</table>
{% endblock %}
static/js/taskTableDip.js
var tableData = {}
function dataReturn(vars) {
return vars
}
function createTable() {
var table =
for (var i in tableData){
var row = `<tr>
<td>${tablData[i][0]}.Task</td>
<td>${tablData[i][1]}.User</td>
<td>${tablData[i][3]}.Priority</td>
<td>${tablData[i][4]}.Deadline</td>
<td><a href="{{ url_for('templates',filename='editTask.html')}}">Edit</a>.Actions</td>
<td>.Actions</td>
<td>.Actions</td>
</tr>`
}
}
文件结构:
我试着把文件移出静态文件夹,还关闭并重新运行代码,甚至删除了打包文件来重新安装Flask,希望能更新正在运行的文件,免得它卡在旧文件上。(我有点无从下手,因为我不知道为什么错误代码看起来不一样)
我非常感谢任何帮助!
1 个回答
你用 <!-- ... -->
把错误信息中提到的那行代码注释掉了。但是,这样做并不能阻止 jinja 尝试渲染这一行,因为 jinja 需要用 {# ... #}
来标记注释。
include
命令只是用来引入外部模板,而不是用来引用 JavaScript 文件。
而且,你在 JavaScript 文件中使用了 jinja 表达式。
与 JavaScript 不同,jinja 是在服务器端运行的。因为你在环境外使用了 url_for
命令,它不会被渲染,结果会直接出现在 href 属性里。jinja 命令只能在模板文件和相应的端点中有效。
不幸的是,在 url_for
命令中指定模板也是不行的。你只能通过它们的标识符来引用已经存在的端点。