【问题标题】:Passing data in Flask across requests跨请求在 Flask 中传递数据
【发布时间】:2017-03-11 09:12:35
【问题描述】:

我试图找出使用重定向时在 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)

所以,现在写,当我添加一个客户并使用redirect(url_for('customer.customer')) 将id 传递给视图客户时,我必须在数据库中再次搜索客户,然后呈现我的模板。我需要帮助确定这是否是正确/好的方法?我知道我不能使用 g 因为重定向意味着一个新请求,因此 g 不会持续存在。

我可以使用 session 但后来我发现我必须做类似的事情

session['customer'] = customer

如果客户是客户模型的一个实例,我将编写一个自定义 JsonEncoder,我将在其中定义如何编码客户实例 (Fixing the class to enable object storing in Flask session)。

那么,使用提供的客户 ID 或将客户对象存储在 session 中(使用自定义 JsonEncoder)再次从数据库中检索客户更好还是有其他更好的方法?

【问题讨论】:

    标签: python flask


    【解决方案1】:

    是的,这是正确的方法。查询两次并没有那么昂贵。

    您也可以尝试Message Flashing 来显示重定向错误之类的内容。

    【讨论】:

      【解决方案2】:

      您是否应该跨请求传递对象或执行新查询取决于您的完整性要求。

      如果你的业务逻辑不能处理陈旧数据,那就做一个查询,因为数据库是唯一的真实状态,事务可以为你省去很多麻烦。

      否则,您可以传递数据。有几种方法:

      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

      【讨论】:

      • 我将如何使用 JWT 令牌?我想将数据从一个视图传递到另一个视图(通过重定向)
      • 好的,我的意思是我仍然需要编写一个自定义 JsonEncoder 来定义如何对我的客户实例进行编码?
      • github.com/jpadilla/pyjwt查看文档,你可以传递一个dict对象给它。
      猜你喜欢
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 2018-06-19
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      相关资源
      最近更新 更多