I am trying to return a html template with BottlePy. And this works fine. But if I insert a javascript file like this in my tpl-file:
<script type="text/javascript" src="js/main.js" charset="utf-8"></script>
I get an 404 error. (Failed to load resource: the server responded with a status of 404 (Not Found))
Does anyone know how to fix this problem?
Here is my script file:
from bottle import route, run, view
@route('/')
@view('index')
def index():
return dict()
run(host='localhost', port=8080)
And that is the template file, located in "./views" subfolder.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8" />
<script type="text/javascript" src="js/main.js" charset="utf-8"></script>
</head>
<body>
</body>
</html>
Maybe it is the "rootPath/js/main.js" from the development server where it looks for my js-file?
The structure of the files is:
app.py
-js
main.js
-views
index.tpl
Thanks.
Here is a working approach of adding static files like CSS/JS in Bottle web project. I am using Bootstrap and Python 3.6.
Project structure
app.py
index.tpl
Output
Well, first, you need your dev server to actually serve
main.js
, otherwise it won't be available for the browser.It's customary to put all
.js
and.css
files under thestatic
directory in small web apps, so your layout should look like this:By no means this exact naming and layout is required, only often used.
Next, you should supply a handler for the static files:
This will actuall serve your files under
static/
to the browser.Now, to the last thing. You specified your JavaScript as:
That means the path to
.js
is relative to the current page. On you development server, the index page (/
) will look for.js
in/js/main.js
, and another page (say,/post/12
) will look for it in/post/12/js/main.js
, and will sure fail.Instead, you need to use the
get_url
function to properly reference static files. Your handler should look like this:And in
index.tpl
,.js
should be referenced as:get_url
finds a handler withname='static'
, and calculates the proper path to it. For dev server, this will always be/static/
. You can probably even hard-code it in the template, but I don't recommend it for two reasons:/static/
dir location, you'll have to search it all over your templates and modify it in every single template.I think you are putting the file
main.js
in the wrong location.Note that this file path must be relative to the requested url, not relative to the path to your template. So putting it in a folder like
template/js/main.js
will not work.