2017-04-26 110 views
0

我從我的android應用程序發送HTTP請求到我的燒瓶服務器。最初,我在燒瓶服務器會話創建我的移動客戶端的會話入門[「mobile_username」]在我家「http://0.0.0.0:2800/」 URL所以當它的用戶日誌將被更新,以他的名字=無。但問題是,當我把我的登錄功能,第二個請求,我檢查會話[「mobile_username」]是否返回鍵錯誤名爲「mobile_username」沒有這樣的關鍵。我知道會話不同步,但我需要知道一個解決方案如何處理我的移動應用程序和我的燒瓶服務器之間的會話。任何幫助都會很棒。燒瓶和安卓會議

我的代碼:

import datetime 
from flask import Flask, render_template, request, jsonify, flash, session, redirect, url_for 
from flask import Session 
from his.Models import db, GuestDetails, BookingDetails, RoomPriceDetails, RoomDetails, DiscountDetails 
app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///HIS.sqlite" 


@app.route('/', methods=['POST', 'GET']) 
def home(): 
    if request.method == 'POST': 
     if request.form['device'] == 'Mobile': 
      try: 
       if session['mobile_username'] is not None: 
        return jsonify({'message': 'dashboard'}) 
       elif session['mobile_username'] is None: 
        return jsonify({'message': "Please login or sign up"}) 
      except KeyError: 
       session['mobile_username'] = None 
       print(session['mobile_username']) 
       return jsonify({'message': 'home'}) 
    else: 
     try: 
      if session['username'] is not None: 
       return redirect(url_for('dashboard')) 
      elif session['username'] is None: 
       return render_template('home.html', message="Please login or sign up") 
     except KeyError: 
      session['username'] = None 
      return render_template('home.html') 
     return render_template('home.html') 
@app.route('/login', methods=['POST', 'GET']) 
def login(): 
    if request.method == 'POST': 
     if request.form['device'] != 'Mobile': 
      if session['username'] is None: 
       guest_id = request.form['id'] 
       print(guest_id) 
       password = request.form['password'] 
       records = db.session.query(GuestDetails).all() 
       IDs = [records[i].Guest_ID for i in range(len(records))] 
       if guest_id in IDs: 
        d_password = db.session.query(GuestDetails).filter_by(Guest_ID=guest_id).first() 
        if password == d_password.Password: 
         session['username'] = d_password.First_name+" "+d_password.Last_name 
         session['user_id'] = d_password.Guest_ID 
         return redirect(url_for('dashboard')) 
        else: 
         return render_template('login.html', message="Password is incorrect") 
       else: 
        return render_template('login.html', message="User id does not exist. Please sign up..") 
      else: 
       return redirect(url_for('dashboard')) 
     else: 
      if request.method == "POST": 
       if session['mobile_username'] is None: 
        print(session['mobile_username']) 
        guest_id = request.form['id'] 
        password = request.form['password'] 
        records = db.session.query(GuestDetails).all() 
        IDs = [records[i].Guest_ID for i in range(len(records))] 
        if guest_id in IDs: 
         d_password = db.session.query(GuestDetails).filter_by(Guest_ID=guest_id).first() 
         if password == d_password.Password: 
          session['mobile_username'] = d_password.First_name + " " + d_password.Last_name 
          session['mobile_user_id'] = d_password.Guest_ID 
          return jsonify({'message': 'Successfully logged in', 'name': session['mobile_username']}) 
         else: 
          return jsonify({'message': 'Password is incorrect'}) 
        else: 
         return jsonify({'message': "User id does not exist. Please sign up.."}) 
       else: 
        return jsonify({'message': "dashboard"}) 
    else: 
     return render_template('login.html') 

if __name__ == '__main__': 
    app.secret_key = 'super secret key' 
    app.config['SESSION_TYPE'] = 'redis' 
    db.init_app(app) 
    with app.app_context(): 
     db.create_all() 
    app.run(host="0.0.0.0", port=2800, debug=True, threaded=True) 

回答

1

隨着if elif else你的代碼的所有水平是相當難追這可能是什麼絆倒你,並造成某種邏輯錯誤在你的代碼。我會建議試着簡化你的條件邏輯,這樣你就可以更容易地知道發生了什麼。

例如這樣的:

if request.form['device'] == 'Mobile': 
     try: 
      if session['mobile_username'] is not None: 
       return jsonify({'message': 'dashboard'}) 
      elif session['mobile_username'] is None: 
       return jsonify({'message': "Please login or sign up"}) 
     except KeyError: 
      session['mobile_username'] = None 
      print(session['mobile_username']) 
      return jsonify({'message': 'home'}) 
else: 
    try: 
     if session['username'] is not None: 
      return redirect(url_for('dashboard')) 
     elif session['username'] is None: 
      return render_template('home.html', message="Please login or sign up") 
    except KeyError: 
     session['username'] = None 
     return render_template('home.html') 
    return render_template('home.html') 

可以簡化爲:

if request.form['device'] == 'Mobile': 
    if 'mobile_username' in session: 
     return jsonify({'message': 'dashboard'}) 
    return jsonify({'message': "Please login or sign up"}) 
else: 
    if 'username' in session: 
     return redirect(url_for('dashboard')) 
    return render_template('home.html', message="Please login or sign up") 

這裏有一個類似的行爲非常基本flask session example。 如果沒有會話存在,它會打印一個鏈接到/登錄,否則它會打印會話的用戶。

你們只具有Android的問題,或也與無移動要求?

+0

我在Android應用測試它在我的第一次請求創建一個會話[「mobile_username」],而在我的第二個請求時,它顯示了一個KeyError異常(「mobile_username」鍵不堅持),並在我的瀏覽精細同一作品。所以我不知道我哪裏錯了。 – Gautham

+0

如果它從瀏覽器的工作你試圖消除'如果的request.form [「設備」] ==「移動」:'檢查?我建議你儘量簡化問題並逐步開展工作。你確定Android的請求是正確的,併發送你所期望的? – Kai