首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >瓶子:使用jinja2_view装饰器

瓶子:使用jinja2_view装饰器
EN

Stack Overflow用户
提问于 2017-05-25 01:21:29
回答 2查看 804关注 0票数 1

如果我直接从bottle导入post、get和jinja2_view,我就能够使用jinja2_view作为装饰器:

代码语言:javascript
复制
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装饰器了:

代码语言:javascript
复制
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)

我得到了:

代码语言:javascript
复制
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'

如何在Bottle()构造函数中使用jinja2_view?(构造函数是必需的,因为我使用的MySQL库需要app.install(plugin)

编辑1

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

代码语言:javascript
复制
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)

例外:

代码语言:javascript
复制
TypeError('get_now() takes exactly 1 argument (0 given)',)

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

EN

回答 2

Stack Overflow用户

发布于 2017-05-25 04:23:20

您不能这样做,因为正如错误所述,Bottle类没有jinja2_view属性。但是,如果你同时使用它们,每个都有自己的用途,那就没有问题了:Bottle()用于实例化你的应用程序,jinja2_view用于呈现模板。

票数 1
EN

Stack Overflow用户

发布于 2017-05-25 04:23:34

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

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

您可以重新使用@jinja2_view('index.html').

  • Just导入瓶子,并对所有瓶子方法使用完全限定的命名空间,例如@bottle.jinja2_view('index.html')app = bottle.Bottle().

我个人强烈倾向于后者,因为它避免了全局名称空间的意外污染,这可能很重要,因为这些围绕over服务器构建的小项目往往会随着时间的推移而增长和膨胀。当然,您的里程可能会有所不同。

编辑

我已经在你的原文基础上创建了一个更简单的例子,希望这将有助于确定问题所在。尝试运行以下命令:

代码语言:javascript
复制
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>元素中正确呈现datetime字符串。如果它对你也有效,那么问题可能出在插件上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44164943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档