【问题标题】:Displaying property object instead of value in Flask template [closed]在 Flask 模板中显示属性对象而不是值
【发布时间】:2018-05-14 02:22:59
【问题描述】:

在我的 Python (3.5) Flask 项目中,我使用 CAS client 进行身份验证,一切正常。身份验证完成后,我想在输出页面中显示用户名。所以我使用下面的代码

__init__.py

from flask import Flask
from flask_cas import CAS
from flask_cas import login_required
# ...

APP = Flask(__name__)
cas = CAS(APP)
# ...

def list_page()
     return render_template("list.html", name=cas.username)

@app.route('/admin/')
@login_required
def admin_page()
    return list_page();

list.html

...
<H2> Hi {{name}} </h2>
...

在我看到的输出页面

Hi <property object at 0x7fb37dfe6958>

【问题讨论】:

  • 我们需要查看cas 变量的定义才能对此进行回答。
  • @MartijnPieters 我已经更新了代码以包含实例化部分。
  • 您发布的代码没有重现问题; cas.username 属性返回一个字符串,而不是&lt;property object at 0xhexaddress&gt;
  • 换一种说法,你确定你没有不小心使用name=CAS.username而不是name=cas.username吗?或者,在您的代码中的其他地方,为名称 cas 分配了其他内容?
  • 感谢 Martijn,您的上一条信息很有帮助。

标签: python python-3.x templates flask cas


【解决方案1】:

如果不知道 __init__.py 中的 cas 变量是什么,就很难准确找出问题所在。但是我怀疑您遇到的错误可能是因为 cas 是一个类,而不是该类的实例。

向你展示我的意思:

>>> class MyCAS:
...    @property
...    def name(self):
...        return 'Monjur'
...
>>> MyCAS.name
<property object at 0x109cf1cc8>
>>> MyCAS().name
'Monjur'

第一种情况,我没有实例化类(没有括号),所以返回值是属性对象。 在第二种情况下(带括号),我看到了实例的实际名称。

如果您的cas 对象确实应该是从类实例化的对象(例如flask.ext.cas.CAS),请确保您像这样创建它:

from flask.ext.cas import CAS
cas = CAS() # With parenthesis :)

不是这样的:

from flask.ext.cas import CAS
cas = CAS  # No parenthesis :(

【讨论】:

  • 我会尝试这种方法并告诉你。
  • @MdMonjurUlHasan 我看到了您的最新编辑,正如 cmets 所建议的,您可能正在将 cas 重新分配给其他内容。在list_page() 内部时,您是否检查过此变量是类还是实例?
猜你喜欢
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多