Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
144 views
in Technique[技术] by (71.8m points)

python - How to load a javascript or css file into a BottlePy template?

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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 the static directory in small web apps, so your layout should look like this:

  app.py
- static/
    main.js
- views/
    index.tpl

By no means this exact naming and layout is required, only often used.

Next, you should supply a handler for the static files:

from bottle import static_file

# ...

@route('/static/:path#.+#', name='static')
def static(path):
    return static_file(path, root='static')

This will actuall serve your files under static/ to the browser.

Now, to the last thing. You specified your JavaScript as:

<script type="text/javascript" src="js/main.js" charset="utf-8"></script>

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:

from Bottle import get_url

# ...

@route('/')
@view('index')
def index():
    return { 'get_url': get_url } 

And in index.tpl, .js should be referenced as:

<script type="text/javascript" src="{{ get_url('static', path='main.js') }}" charset="utf-8"></script>

get_url finds a handler with name='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:

  • You won't be able to mount your app anywhere but under root in production; i.e., when you upload it onto the porduction server, it can be placed under http://example.com/ (root), but not under http://example.com/myapp/.
  • If you change the /static/ dir location, you'll have to search it all over your templates and modify it in every single template.

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...