2017-03-11 4 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

セッション(カスタムJsonEncoderを使用)に提供された顧客IDまたは顧客オブジェクトを使用してデータベースから顧客を再度取得する方が良いでしょうか、それとも良い方法がありますか?

答えて

0

はい、これは正しいアプローチです。 2回のクエリはそれほど高価ではありません。

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

OK、私はまだ私の顧客インスタンスをエンコードする方法を定義するカスタムJsonEncoderを書く必要があるということですか? – ueg1990

関連する問題