heroku上的Eventlet和Spotipy身份验证问题

rqmkfv5c  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(137)

我在Heroku Flask应用程序中验证我的用户时遇到问题,因为我的procfile包含

web: gunicorn --worker-class eventlet -w 1 app:app

字符串
如果我将procfile更改为以下内容,则身份验证没有问题。

web: gunicorn  app:app


下面是我的验证用户的代码。在Procfile中使用web: gunicorn --worker-class eventlet -w 1 app:app时,用户被重定向到类似https://accounts.spotify.com/en/authorize?client_id=8247cd9f7e43....的页面。我收到一个内部服务器错误。当我将Procfile更改为web: gunicorn app:app时,用户验证正确,并被重定向到主页。

@app.route('/', methods=['GET'])
def index():
    cache_handler = spotipy.cache_handler.FlaskSessionCacheHandler(session)
    auth_manager = spotipy.oauth2.SpotifyOAuth(scope='user-read-currently-playing playlist-modify-private',
                                               cache_handler=cache_handler,
                                               show_dialog=True)
    
    if 'code' in request.args:
        code = request.args['code']
        print("Code is", code)
        # Log a message
        logging.info("Code is %s", code)
        # Step 2. Being redirected from Spotify auth page
        auth_manager.get_access_token(code)
        logging.info("Code is %s", code)
     
    if not auth_manager.validate_token(cache_handler.get_cached_token()):
        # Step 1. Display sign-in link when no token
        auth_url = auth_manager.get_authorize_url()
        return f'<h2><a href="{auth_url}">Sign in</a></h2>'

    # Step 3. Signed in, display data
    spotify = spotipy.Spotify(auth_manager=auth_manager)
    # Render the index.html template with the text entry box, submit button, and Spotify data
    return render_template('index.html')


我在这个应用程序中使用Flask-SocketIO,所以我需要能够使用eventlet。如果你能帮忙的话,我将不胜感激。问题似乎不是重定向URI,因为它在没有eventlet的情况下工作。

czq61nw1

czq61nw11#

如果您遇到Flask-SocketIO(使用Eventlet)和Spotipy库之间的冲突,您可以尝试的另一种方法是使用Gevent库。Gevent是另一个类似于Eventlet的异步库,它可能与Spotipy使用的请求库更兼容。
按照以下步骤修改Flask应用程序以使用Gevent:

**1.更新您的Procfile:**修改您的Procfile,使用Gunicorn的Gevent worker。将Procfile的现有内容替换为以下内容:

web: gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 app:app

字符串

**2.安装Gevent:**您需要在虚拟环境中安装gevent和gevent-websocket。你可以用pip来做:

pip install gevent gevent-websocket

**3.修改Flask应用:**使用async_mode ='gevent'初始化SocketIO对象。另外,在应用程序的开始执行monkey补丁,但使用gevent而不是eventlet。下面是您的代码可能的外观:

import spotipy
from flask_socketio import send, emit, SocketIO
import logging
import gevent

socketio = SocketIO(app, async_mode='gevent')

相关问题