Bottle 没有正确的静态和错误

Bottle does not statics and errors correctly

我最近从 Flask 切换到 Bottle,我 运行 遇到了一些问题。

  1. 未路由静态文件
  2. 服务错误页面 @error 无法正常工作

我的文件树看起来像:

dev
 |
 |_db
 |  |_dev.db
 |
static
 |
 |_styles
 |
 |_js
 |  |_script.js
 |
 |
views
 |
 |_index.tpl
 |
 |
 |_about.tbl
 |
 |
 |_404.tbl
 |
application.py

这是我的 application.py:

# Main application file
# Created by James Parsons 2/23/15
from bottle import error
from bottle import *
from bottle.ext import sqlite

app = Bottle()
db_plugin = sqlite.Plugin(dbfile="./dev/db/dev.db")
app.install(db_plugin)

@route("/static/<filepath:path>")
def server_static(filepath):
    # FIXME Bottle is not routing statics correctly
    return static_file(filepath, root="/static/")

@error(404)
def error_404():
    # FIXME Bottle is not displaying errors correctly
    return template("404")


@app.route("/")
def index(): 
    return template("index")
    # TODO Work on index page

@app.route("/about")
def about():
    return template("about")
    # TODO Work on about page


# FUTURE Run on CGI server
run(app, host="localhost", port="80")

script.js/static/js/script.js 中不可用,当我转到不存在的路由时,我没有看到我的自定义错误页面,而是默认的 404 错误。我究竟做错了什么?我该如何解决?

在您的代码中,您没有为静态文件中的 app 对象和 404 错误路由使用修饰器方法。所以

@route

应该是

@app.route

error.

也一样

您可能还打算从相对路径获取静态文件的根目录

例如

return static_file(filename, root='./static/')

return static_file(filename, root='static/')

你让 bottle 在顶级目录中查找 /static/

这是对我有用的完整代码

# Main application file

from bottle import error
from bottle import *
from bottle.ext import sqlite

app = Bottle()
#db_plugin = sqlite.Plugin(dbfile="./dev/db/dev.db")
#app.install(db_plugin)

@app.route('/static/<filename:path>')
def send_static(filename):
    return static_file(filename, root='./static/')

@app.error(404)
def error_404(error):
    return template("404")

@app.route("/")
def index(): 
    return template("index")

@app.route("/about")
def about():
    return template("about")

# FUTURE Run on CGI server
run(app, host="localhost", port="8080")

注意:我禁用了 sqlite 东西,因为它不适用于这个问题,我使用端口值 8080 以避免需要超级用户权限来访问该端口。当你准备好时,你应该把它们改回来。

index.tpl 文件中,我引用了 js 脚本,如

<script src="static/js/script.js" ></script>

希望这足以解决您的问题。