访问JavaScript文件时出现"jinja2.exceptions.TemplateNotFound"错误

0 投票
1 回答
31 浏览
提问于 2025-04-12 23:47

我正在尝试把一个数组传到一个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 个回答

1

你用 <!-- ... --> 把错误信息中提到的那行代码注释掉了。但是,这样做并不能阻止 jinja 尝试渲染这一行,因为 jinja 需要用 {# ... #} 来标记注释。

include 命令只是用来引入外部模板,而不是用来引用 JavaScript 文件。

而且,你在 JavaScript 文件中使用了 jinja 表达式。
与 JavaScript 不同,jinja 是在服务器端运行的。因为你在环境外使用了 url_for 命令,它不会被渲染,结果会直接出现在 href 属性里。jinja 命令只能在模板文件和相应的端点中有效。

不幸的是,在 url_for 命令中指定模板也是不行的。你只能通过它们的标识符来引用已经存在的端点。

撰写回答