python - Bottle:使用jinja2_view装饰器

标签 python jinja2 bottle python-decorators

如果我直接从 Bottle 导入 post、get 和 jinja2_view,我就可以使用 jinja2_view 作为装饰器:

from bottle import get, post, request, run, jinja2_view

@jinja2_view('index.html')
@get('/')
def index():
    return

run(host='localhost', port=8080, debug=True, reloader=True)

但是如果我导入并使用 Bottle() 构造函数,我就不能再使用 jinja 装饰器了:

from bottle import Bottle, get, post, request, run, jinja2_view

app = Bottle()

@app.jinja2_view('index.html')
@app.get('/')
def index():
    return

run(app, host='localhost', port=8080, debug=True, reloader=True)

我得到:

Traceback (most recent call last):
  File "webserver.py", line 10, in <module>
    @app.jinja2_view('index.html')
AttributeError: 'Bottle' object has no attribute 'jinja2_view'

如何将 jinja2_view 与 Bottle() 构造函数一起使用? (构造函数是必要的,因为我使用的 mysql 库需要 app.install(plugin)

编辑1

如果我将 @app.get()@jinja2_view 一起使用,回调函数将无法访问插件

from bottle import get, post, request, run, jinja2_view, Bottle

import bottle_mysql

app = Bottle()
plugin = bottle_mysql.Plugin(dbuser='bottle',dbpass='password', dbname='mydb')
app.install(plugin)

@app.get('/now')
@jinja2_view('now.html')
def get_now(db):
    db.execute('SELECT now() as now')
    row = db.fetchone()
    now = str(row['now'])
    return { 'now': now }

run(app, host='localhost', port=8080, debug=True, reloader=True)

异常(exception):

TypeError('get_now() takes exactly 1 argument (0 given)',)

如果我注释掉@jinja2_view('now.html'),路由就会工作并返回正确的 json 响应。

最佳答案

jinja2_view是 Bottle 模块提供的函数,它不是 Bottle 的类方法类(class)。 因此,当您调用@app.jinja2_view时, python 搜索 app (这是 bottle.Bottle 的一个实例)名为 jinja2_view 的属性,它显然无法找到该属性。

因此,您有两个非常简单的选择来纠正此问题:

  1. 您可以返回使用 @jinja2_view('index.html') .
  2. 只需导入 Bottle 并为所有 Bottle 方法使用完全限定的命名空间,例如@bottle.jinja2_view('index.html')app = bottle.Bottle() .

我个人非常喜欢后者,因为它可以避免全局命名空间的意外污染,这很重要,因为这些围绕网络服务器构建的小项目往往会随着时间的推移而增长和膨胀。当然,您的里程可能会有所不同。

编辑

我根据您的原始示例创建了一个更简单的示例,希望这将有助于确定问题所在。尝试运行这个:

from bottle import get, run, jinja2_view, Bottle
import datetime

app = Bottle()
@app.get('/now')
@jinja2_view('now.html')
def get_now():
    now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    return { 'now': now }

run(app, host='localhost', port=8080, debug=True)

在浏览器中查看此内容可以在 <h1> 中正确呈现日期时间字符串。元素。如果它也适用于您,则问题可能出在插件上。

关于python - Bottle:使用jinja2_view装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44164943/

相关文章:

python - 将 kwargs 传递给 django 管理表单

python - 使用 flasks tojson 过滤器序列化日期时间

html - Django 模板 - 背景图像 Jinja

python - 以附件形式发送文件

python - 如何向下滚动并单击按钮以在python中连续抓取页面

python - 创建一个将列表作为输入并返回该列表中字符串 “bebo” 的计数的函数

python - 如果服务器被CTRL + C杀死或中断或崩溃,请采取措施

python - Bottle request.files.getall() 返回空列表

Python将配置文件添加到路径

javascript - 使用带有 javascript 警报的 Jinja2 for 循环