使用 Flask 访问对象属性
Accessing object properties using Flask
我是 Flask 和模板的新手;我正在尝试传递一个对象并将其数据显示在我的 HTML 页面上。
我有一个支队class喜欢
class Detachment:
def __init__(self, name, ...):
self.name = name
self.... = ... # lots of data, mostly lists that I'd like to index
我试过这样做:
import Detachment as dt
from flask import Flask, request, redirect, url_for
@app.route('/')
def go():
# stuff
testDetachment = dt.Detachment('name')
return redirect(url_for('cooliofunction', detachment=testDetachment)
@app.route('/templates')
def cooliofunction():
return render_template('data.html', obj=request.args.get('detachment'))
我的 data.html 尝试:
{{obj}} <br />
{{obj.name}} <br />
虽然 {{obj}} 会显示对象地址,但我无法访问在我的分离中设置的变量 - 它显示为空白。我是不是处理了整个问题,还是有一种简单的方法来访问对象的属性?
编辑: 我使用重定向是因为 testDetachment 的创建实际上取决于文件上传,但我忽略了它以专注于对象属性。
EDIT2: 所以我一直在使用重定向,因为我正在关注显示已上传内容的文件上传教程,但是我不需要那样做。直接渲染模板,我可以直接访问对象的属性。谢谢大家!
如果 url_for
获取的参数不是其正在构建的规则的一部分,它将通过将值转换为字符串将它们附加为查询字符串。对象的字符串表示是它的地址,而不是对象本身。当您在另一个视图中检索它时,您检索的是对象的字符串表示形式,而不是实际对象。
正如所写,您应该忽略重定向并直接在 go
视图中呈现模板。
如果您的实际代码有特定的重定向原因,那么您应该为该对象发送一个唯一标识符,并在另一个视图中重新加载它。例如,如果您正在使用数据库,将对象提交到数据库,在 url 中传递 id,并在另一个视图中通过 id 加载它。
当您的路由到达 obj
时,由于您传递它的方式,它只是一个字符串。 redirect(url_for('cooliofunction', detachment=testDetachment)
可能实际上将 str(testDetachment)
作为查询字符串隐式传递。
即使 name
不是字符串的有效属性,Jinja 也会简单地忽略这一点:
from flask import Flask, render_template_string
app = Flask(__name__)
@app.route("/")
def test():
obj = "Foo"
return render_template_string("{{ obj }} {{ obj.name }}", obj=obj)
#Foo
如果您想传递任意 Python 个对象,请使用 session
或某种其他形式的存储,例如数据库,它会从一个请求持续到下一个请求。
这不是 url_for
的目的。或者重定向,就此而言。
重定向是为了:
- 当页面不存在或他们无法访问时
- 您已完成某项操作(例如让他们登录),现在他们可以继续前进,您希望他们转到新页面。
所以通常你会做这样的事情:
@app.route('/login')
def login():
if request.method == 'POST' and request.form['username'] == 'the_user' \
and request.form['password'] == 'super secret!':
... # log the user in here
return redirect(url_for('main'))
或者如果您确实需要传递一些信息,您可以可以用url_for
这样做:
return redirect(url_for('page', extra='values', go='here', and_='will be added', to_the='query string', like='http://foo.bar?extra=values&go=here'))
但是,不要那样做。
我是 Flask 和模板的新手;我正在尝试传递一个对象并将其数据显示在我的 HTML 页面上。
我有一个支队class喜欢
class Detachment:
def __init__(self, name, ...):
self.name = name
self.... = ... # lots of data, mostly lists that I'd like to index
我试过这样做:
import Detachment as dt
from flask import Flask, request, redirect, url_for
@app.route('/')
def go():
# stuff
testDetachment = dt.Detachment('name')
return redirect(url_for('cooliofunction', detachment=testDetachment)
@app.route('/templates')
def cooliofunction():
return render_template('data.html', obj=request.args.get('detachment'))
我的 data.html 尝试:
{{obj}} <br />
{{obj.name}} <br />
虽然 {{obj}} 会显示对象地址,但我无法访问在我的分离中设置的变量 - 它显示为空白。我是不是处理了整个问题,还是有一种简单的方法来访问对象的属性?
编辑: 我使用重定向是因为 testDetachment 的创建实际上取决于文件上传,但我忽略了它以专注于对象属性。
EDIT2: 所以我一直在使用重定向,因为我正在关注显示已上传内容的文件上传教程,但是我不需要那样做。直接渲染模板,我可以直接访问对象的属性。谢谢大家!
如果 url_for
获取的参数不是其正在构建的规则的一部分,它将通过将值转换为字符串将它们附加为查询字符串。对象的字符串表示是它的地址,而不是对象本身。当您在另一个视图中检索它时,您检索的是对象的字符串表示形式,而不是实际对象。
正如所写,您应该忽略重定向并直接在 go
视图中呈现模板。
如果您的实际代码有特定的重定向原因,那么您应该为该对象发送一个唯一标识符,并在另一个视图中重新加载它。例如,如果您正在使用数据库,将对象提交到数据库,在 url 中传递 id,并在另一个视图中通过 id 加载它。
当您的路由到达 obj
时,由于您传递它的方式,它只是一个字符串。 redirect(url_for('cooliofunction', detachment=testDetachment)
可能实际上将 str(testDetachment)
作为查询字符串隐式传递。
即使 name
不是字符串的有效属性,Jinja 也会简单地忽略这一点:
from flask import Flask, render_template_string
app = Flask(__name__)
@app.route("/")
def test():
obj = "Foo"
return render_template_string("{{ obj }} {{ obj.name }}", obj=obj)
#Foo
如果您想传递任意 Python 个对象,请使用 session
或某种其他形式的存储,例如数据库,它会从一个请求持续到下一个请求。
这不是 url_for
的目的。或者重定向,就此而言。
重定向是为了:
- 当页面不存在或他们无法访问时
- 您已完成某项操作(例如让他们登录),现在他们可以继续前进,您希望他们转到新页面。
所以通常你会做这样的事情:
@app.route('/login')
def login():
if request.method == 'POST' and request.form['username'] == 'the_user' \
and request.form['password'] == 'super secret!':
... # log the user in here
return redirect(url_for('main'))
或者如果您确实需要传递一些信息,您可以可以用url_for
这样做:
return redirect(url_for('page', extra='values', go='here', and_='will be added', to_the='query string', like='http://foo.bar?extra=values&go=here'))
但是,不要那样做。