2017-03-11 14 views
0

我想弄清楚使用重定向時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) 

所以,現在寫的,當我添加一個客戶,我通過ID到視圖客戶重定向(url_for('customer.customer')),我必須再次在數據庫中搜索客戶,然後呈現我的模板。我想要幫助確定這是否是正確的/好的方法?我知道我不能使用g,因爲重定向意味着一個新的請求,因此g將不會持續。

我可以使用會議但後來我發現,我必須這樣做

session['customer'] = customer 

如果客戶是客戶模型的實例,我會寫一個自定義的JsonEncoder,我將定義如何編碼客戶實例(Fixing the class to enable object storing in Flask session)。

那麼,是不是更好再次使用提供的客戶ID或商店的客戶對象會議從數據庫中獲取客戶(使用定製JsonEncoder)或有另一種更好的方法?

回答

0

是的,這是正確的做法。兩次查詢並不昂貴。

您也可以嘗試Message Flashing用於顯示重定向錯誤。

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

+0

我怎麼會用一個JWT令牌?我想將數據從一個視圖傳遞到另一個視圖(通過重定向) – ueg1990

+0

您可以將其添加到查詢字符串。 HTTP:// XXXX JWT = {} JWT。 – Shuo

+0

好吧,我的意思是我仍然必須編寫一個自定義的JsonEncoder來定義如何編碼我的客戶實例? – ueg1990