跨请求传递Flask中的数据

时间:2017-03-11 09:12:36

标签: python flask

我正在尝试找出在使用重定向时在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)再次从数据库中检索客户是否更好?还是有另一种更好的方法?

2 个答案:

答案 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.

jwt