Spotipy重定向URI在服务器而非用户浏览器打开的问题求助
解决Spotipy在Heroku部署时的重定向与EOFError问题
第一步:修正Spotify开发者后台的重定向URI配置
- 必须在Spotify开发者控制台的应用设置里,把
https://nameofmyapp.herokuapp.com/callback(需带完整回调路径,不能仅填根域名)添加到重定向URI列表并保存。 - 环境变量
REDIRECT_URI必须和控制台填写的内容完全一致,包含https前缀与完整路径。
第二步:完善认证流程代码
你的现有代码缺少回调处理逻辑,Spotipy的OAuth流程需要专门的视图处理授权跳转后的回调请求,调整如下:
主视图(index)
def index(request): cache_handler = spotipy.DjangoSessionCacheHandler(request=request) auth_manager = spotipy.oauth2.SpotifyOAuth( client_id=env("CLIENT_ID"), client_secret=env("CLIENT_SECRET"), redirect_uri=env("REDIRECT_URI"), scope=env("SCOPE"), cache_handler=cache_handler ) # 检查是否已完成授权 if not auth_manager.validate_token(cache_handler.get_cached_token()): # 未授权则跳转至Spotify登录授权页 auth_url = auth_manager.get_authorize_url() return redirect(auth_url) # 已授权则初始化Spotify会话 session = spotipy.Spotify(oauth_manager=auth_manager, requests_session=True) # 此处可添加获取用户数据等业务逻辑 return render(request, 'index.html', {'user_info': session.current_user()})
回调视图(callback)
def callback(request): cache_handler = spotipy.DjangoSessionCacheHandler(request=request) auth_manager = spotipy.oauth2.SpotifyOAuth( client_id=env("CLIENT_ID"), client_secret=env("CLIENT_SECRET"), redirect_uri=env("REDIRECT_URI"), scope=env("SCOPE"), cache_handler=cache_handler ) # 处理授权回调,获取并缓存access token auth_manager.get_access_token(request.GET.get('code')) # 回调处理完成后跳转回主页面 return redirect('index')
配置URL路由
在项目urls.py中添加回调路由:
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('callback', views.callback, name='callback'), ]
第三步:排查EOFError的常见诱因
- 环境变量配置错误:用
heroku config命令检查Heroku上的CLIENT_ID、CLIENT_SECRET、REDIRECT_URI、SCOPE是否完整且无拼写错误。 - HTTPS强制校验:Heroku应用默认强制HTTPS,确保
REDIRECT_URI以https开头,禁止使用http。 - Session后端配置:
DjangoSessionCacheHandler依赖Django Session,Heroku上建议用数据库或Redis作为Session存储,避免使用本地内存Session。 - Spotipy版本问题:升级Spotipy到最新版本,旧版本可能存在OAuth流程bug:
pip install --upgrade spotipy
内容的提问来源于stack exchange,提问作者Hadi Zorkot
相关产品推荐
相关产品推荐

