我正在尝试找出在使用重定向时在Flask请求之间传递数据的最佳方法。以下是我的一些代码,
模型
class Customer(db.Model):
__tablename__ = 'customers'
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(80))
last_name = db.Column(db.String(80))
email = db.Column(db.String(120), unique=True)
phone_number = db.Column(db.String(10), unique=True)
address = db.Column(db.Text)
last_order = db.Column(db.Text)
send_email = db.Column(db.Boolean)
def __init__(self, first_name, last_name, email, phone_number, address,
last_order, send_email):
self.first_name = first_name
self.last_name = last_name
self.email = email
self.phone_number = phone_number
self.address = address
self.last_order = last_order
self.send_email = send_email
def __repr__(self):
return '<Customer {} {}>'.format(self.first_name, self.last_name)
视图
blueprint = Blueprint('customer', __name__, url_prefix='/customer')
@blueprint.route('/', methods=('GET', 'POST'))
@login_required
def home():
"""Logged-in user homepage"""
error = None
form = CustomerSearchForm()
if form.validate_on_submit():
phone_number = form.phone_number.data
customer = Customer.query.filter_by(phone_number=phone_number).first()
if customer:
return redirect(url_for('customer.customer', customer_id=customer.id))
else:
error = 'Customer with phone number {} not found'.format(phone_number)
form.phone_number.data = ''
return render_template('customer/index.html', form=form, error=error)
@blueprint.route('/<int:customer_id>', methods=('GET', 'POST'))
@login_required
def customer(customer_id):
"""Get customer by id"""
customer = Customer.query.get(customer_id)
return render_template('customer/customer.html', customer=customer, form=form)
所以,现在写一下,当我添加一个客户并通过重定向(url_for(&#39; customer.customer&#39;))将id传递给view客户时,我必须再次搜索客户数据库,然后渲染我的模板。我想帮助确定这是否是一个正确/好的方法?我知道我不能使用 g ,因为重定向意味着新的请求,因此 g 不会持续存在。
我可以使用会话,但后来发现我必须做
之类的事情session['customer'] = customer
如果客户是Customer模型的一个实例,我将编写一个自定义JsonEncoder,我将定义如何对客户实例进行编码(Fixing the class to enable object storing in Flask session)。
那么,使用提供的客户ID或在会话中存储客户对象(使用自定义JsonEncoder)再次从数据库中检索客户是否更好?还是有另一种更好的方法?
答案 0 :(得分:0)
是的,这是正确的做法。查询两次并不是那么昂贵。
您还可以尝试使用Message Flashing来显示重定向错误。
答案 1 :(得分:0)
是否应该跨请求传递对象或执行新查询取决于您的完整性要求。
如果您的业务逻辑不能存档陈旧数据,那么进行查询,caz数据库是单一的事实状态,并且该事务可以为您节省很多麻烦。
否则,您可以传递数据。有几种方法:
1. A session object server side, which store inside memcached or something.
2. Cookies, which is not used that much I guess.
3. JWT, which I believe is the right approach.