Flask-Login 和 Heroku 问题

Posted

技术标签:

【中文标题】Flask-Login 和 Heroku 问题【英文标题】:Flask-Login and Heroku issues 【发布时间】:2012-11-16 21:11:21 【问题描述】:

我有一个示例 Web 应用程序(在 heroku 上运行 flask-login 的烧瓶),网址为:http://twittaclone.herokuapp.com。

当我在本地主机上运行它时,登录功能可以正常工作。当我推送到 heroku 时,它吓坏了并且不允许用户登录(它确实允许用户注册)。正在修改数据库。

为什么烧瓶登录在heroku上不起作用?

app = Flask(__name__)
mysql = MySQL()

app.config['MYSQL_DATABASE_HOST'] = os.environ['MYSQL_DATABASE_HOST'] if 'MYSQL_DATABASE_HOST' in os.environ else config.MYSQL_DATABASE_HOST
app.config['MYSQL_DATABASE_PORT'] = os.environ['MYSQL_DATABASE_PORT'] if 'MYSQL_DATABASE_PORT' in os.environ else config.MYSQL_DATABASE_PORT
app.config['MYSQL_DATABASE_USER'] = os.environ['MYSQL_DATABASE_USER'] if 'MYSQL_DATABASE_USER' in os.environ else config.MYSQL_DATABASE_USER
app.config['MYSQL_DATABASE_PASSWORD'] = os.environ['MYSQL_DATABASE_PASSWORD'] if 'MYSQL_DATABASE_PASSWORD' in os.environ else config.MYSQL_DATABASE_PASSWORD
app.config['MYSQL_DATABASE_DB'] = os.environ['MYSQL_DATABASE_DB'] if 'MYSQL_DATABASE_DB' in os.environ else config.MYSQL_DATABASE_DB

mysql.init_app(app)

if 'SECRET_KEY' in os.environ: app.config['SECRET_KEY'] = os.environ['SECRET_KEY']
else: app.config['SECRET_KEY'] = os.urandom(24)

def connect_db(): return mysql.connect()


###
# Routing for your application.
###

login_manager = LoginManager()
login_manager.login_view = "login"

@login_manager.user_loader
def load_user(username):
    g.db = connect_db()
    return get_user(username)

login_manager.init_app(app)

@app.route('/')
def home(): return render_template('home.html')

def connect_db(): return mysql.connect()

@app.before_request
def before_request():
    g.user = current_user
    g.db = connect_db()

@app.teardown_request
def tear_down(exception):
    g.db.close()

@app.route('/main/')
@login_required
def main():
    print("in main")
    tweets, user = get_main()
    follower_count, followee_count = get_follower_info(g.user.username)
    return render_template('main.html', user=user, tweets=tweets, followercount =      follower_count, followeecount = followee_count)


@app.route('/login/', methods=['GET', 'POST'])
def login():
    """Logs the user in."""
    if request.method == 'GET':
        if current_user is user_logged_in: logout_user()

    error = None
    if request.method == 'POST':
        user = get_user(request.form['username'])
        if user is None:
            error = 'Invalid username'
        elif not check_password_hash(user.password, request.form['password']):
            error = 'Invalid password'
        else:
            flash('You were logged in')
            login_user(user)
            return redirect(url_for('main'))

    return render_template('login.html', error=error)

【问题讨论】:

你所说的“吓坏了”是什么意思? 运行heroku logs 显示什么? (见***.com/questions/2671454/…) 问题是我的 Procfile 中有 gunicorn。当我将其更改为:web:python app.py。 Heroku 现在可以很好地提供内容。不知道为什么 gunicorn 每次请求都没有会话... 我不精通heroku,但我确实使用gunicorn 来服务客户项目。除非您使用--debug 标志启动它,否则它会吞下异常。这可能会让您深入了解为什么您的会话会被破坏。 app.secret_key 不应该是随机的。 This answer solved my problem 【参考方案1】:

多年后,但这解决了您的问题:Heroku gunicorn flask login is not working properly

更新的 Procfile:

web: gunicorn app:app --preload

gunicorn 预加载文档:https://docs.gunicorn.org/en/stable/settings.html

【讨论】:

【参考方案2】:

我很确定 Heroku 使用 PostgreSQL。尝试参考他们的文档https://devcenter.heroku.com/articles/heroku-postgresql

【讨论】:

以上是关于Flask-Login 和 Heroku 问题的主要内容,如果未能解决你的问题,请参考以下文章

Flask-HttpAuth 和 Flask-Login

在Flask和Flask-Login中删除会话cookie

使用Flask-Login注册登录

Flask-Login + Flask-Sockets = Chaos

如何整合Flask-HTTPAuth和Flask-Login

Flask-Login