【问题标题】:flask and android session烧瓶和安卓会话
【发布时间】:2017-04-27 18:35:47
【问题描述】:

我正在从我的 android 应用程序向我的烧瓶服务器发送一个 HTTP 请求。最初,我在我的烧瓶服务器中为我的移动客户端创建一个会话条目,作为 session['mobile_username'] = None in my home '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)

【问题讨论】:

    标签: android python session flask


    【解决方案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,具有类似的行为。 如果不存在会话,它将打印到 /login 的链接,否则它将打印会话用户。

    您是只有 android 的问题,还是没有移动请求?

    【讨论】:

    • 我在我的 android 应用程序中进行了测试,它在我的第一个请求中创建了一个 session['mobile_username'] 而在我的第二个请求中它显示了一个 KeyError('mobile_username' 键不存在)并且同样工作正常在我的浏览器中。所以我不知道我哪里出错了。
    • 如果它在浏览器中运行,您是否尝试删除 if request.form['device'] == 'Mobile': 检查?我建议您尝试简化问题并使其逐步发挥作用。您确定 android 请求正确并发送您期望的内容吗?
    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    相关资源
    最近更新 更多