Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask Spotipy让每个人都看到了相同的数据_Python_Flask_Heroku_Spotipy - Fatal编程技术网

Python Flask Spotipy让每个人都看到了相同的数据

Python Flask Spotipy让每个人都看到了相同的数据,python,flask,heroku,spotipy,Python,Flask,Heroku,Spotipy,我正在使用Spotipy从用户那里获取数据并显示它。它对一个用户很好,但当另一个用户登录时,网站会向两个用户显示一个用户的数据,而不是显示各自的数据 例如,如果用户A和B登录,它将向两者显示A的数据。如果A离开,它将在几分钟后刷新并显示B的数据。从本质上讲,现在不能有多人同时使用该网站。我不确定这里有什么问题 我有一个初始的flask文件app.py,在这里我进行身份验证并获得spotipy.Spotify()变量。然后,我将此变量作为环境变量传递给其他页面,并获取这些页面中的数据。我用getT

我正在使用Spotipy从用户那里获取数据并显示它。它对一个用户很好,但当另一个用户登录时,网站会向两个用户显示一个用户的数据,而不是显示各自的数据

例如,如果用户A和B登录,它将向两者显示A的数据。如果A离开,它将在几分钟后刷新并显示B的数据。从本质上讲,现在不能有多人同时使用该网站。我不确定这里有什么问题

我有一个初始的flask文件app.py,在这里我进行身份验证并获得spotipy.Spotify()变量。然后,我将此变量作为环境变量传递给其他页面,并获取这些页面中的数据。我用getTracks方法来做这件事。我得到sp并通过它

# Flask imports
from flask import Flask, request, url_for, redirect, session, render_template
from flask_session import Session
from flask_pymongo import PyMongo

# Blueprint imports
from pages.top import top_
from pages.twitter import twitter_
from pages.twitter_top import twitter_top_
from pages.reddit import reddit_
from pages.spotify_rec import spotify_rec_
from pages.user_collection import user_collection_

# Spotipy imports
import time
import spotipy
from spotipy.oauth2 import SpotifyOAuth
import os
from os import environ


client_id = environ['CLIENT_ID']
client_secret = environ['CLIENT_SECRET']
mongo_uri = environ['MONGO_URI']

# Initialise Flask app and register blueprints
app = Flask(__name__)
app.register_blueprint(top_, url_prefix="")
app.register_blueprint(twitter_, url_prefix="")
app.register_blueprint(twitter_top_, url_prefix="")
app.register_blueprint(reddit_, url_prefix="")
app.register_blueprint(spotify_rec_, url_prefix="")
app.register_blueprint(user_collection_, url_prefix="")

app.config['MONGO_URI'] = mongo_uri
mongo = PyMongo(app)
app.config['mongo'] = mongo

app.secret_key = "spotty"
sess = Session()
app.config['SESSION_COOKIE_NAME'] = "Spotty Cookie"
TOKEN_INFO = "token_i"


@app.route('/')
def login():
    sp_oauth = create_spotify_ouath()
    auth_url = sp_oauth.get_authorize_url()
    return redirect(auth_url)


@app.errorhandler(404)
def error404(error):
    return "A bug is preventing the app from loading. Try going back to the home page and reloading or come back later. Sorry!", 404


@app.errorhandler(500)
def error500(error):
    return "A bug is preventing the app from loading. Try going back to the home page and reloading or come back later. Sorry!", 500


@app.route('/redirect')
def redirectPage():
    sp_oauth = create_spotify_ouath()
    session.clear()
    code = request.args.get('code')
    token_info = sp_oauth.get_access_token(code)
    session[TOKEN_INFO] = token_info
    return redirect(url_for('getTracks', _external=True))


@app.route('/getTracks')
def getTracks():
    try:
        token_info = get_token()
    except:
        print("user not logged in")
        return redirect('/')
    sp = spotipy.Spotify(auth=token_info['access_token'])
    app.config['sp'] = sp
    return render_template('index.html')


def get_token():
    token_info = session.get(TOKEN_INFO, None)
    if not token_info:
        raise "exception"
    now = int(time.time())
    is_expired = token_info['expires_at'] - now < 60
    if (is_expired):
        sp_oauth = create_spotify_ouath()
        token_info = sp_oauth.refresh_access_token(token_info['refresh_token'])
    return token_info


def create_spotify_ouath():
    return SpotifyOAuth(
        client_id=client_id,
        client_secret=client_secret,
        redirect_uri=url_for('redirectPage', _external=True),
        scope="user-top-read user-library-read")


if __name__ == "__main__":
    app.run(debug=True)
#烧瓶导入
从flask导入flask、请求、url、重定向、会话、呈现模板
从会话导入会话
从比蒙戈进口比蒙戈
#蓝图导入
从pages.top导入top_
从pages.twitter导入twitter_
从pages.twitter\u top导入twitter\u top_
从pages.reddit导入reddit_
从pages.spotify\u rec导入spotify\u rec_
从pages.user\u集合导入用户\u集合_
#零星进口
导入时间
导入spotipy
从spotipy.oauth2导入SpotifyOAuth
导入操作系统
从操作系统导入环境
客户id=environ['client\u id']
client_secret=environ['client_secret']
mongo_uri=environ['mongo_uri']
#初始化Flask应用程序并注册蓝图
app=烧瓶(名称)
应用程序注册蓝图(顶部,url前缀=)
app.register\u blueprint(twitter\u,url\u prefix=”“)
app.register\u blueprint(twitter\u top\u,url\u prefix=”“)
app.register\u blueprint(reddit\u,url\u prefix=”“)
应用程序。注册蓝图(spotify\u rec\u,url\u前缀=)
应用程序注册蓝图(用户集合,url前缀=)
app.config['MONGO_URI']=MONGO_URI
mongo=PyMongo(应用程序)
app.config['mongo']=mongo
app.secret\u key=“spotty”
sess=会话()
app.config['SESSION\u COOKIE\u NAME']=“Spotty COOKIE”
TOKEN\u INFO=“TOKEN\u i”
@应用程序路径(“/”)
def login():
sp_oauth=create_spotify_ouath()
auth\u url=sp\u oauth.get\u authorize\u url()
返回重定向(验证url)
@app.errorhandler(404)
def error404(错误):
return“有一个bug正在阻止加载应用程序。请尝试返回主页并重新加载,或者稍后再回来。抱歉!”,404
@app.errorhandler(500)
def error500(错误):
return“有一个bug正在阻止加载应用程序。请尝试返回主页并重新加载,或者稍后再回来。抱歉!”,500
@app.route(“/redirect”)
def重定向页面():
sp_oauth=create_spotify_ouath()
会话.清除()
code=request.args.get('code')
令牌\u info=sp\u oauth.get\u access\u令牌(代码)
会话[令牌信息]=令牌信息
返回重定向(url_for('getTracks',_external=True))
@app.route(“/getTracks”)
def getTracks():
尝试:
令牌\信息=获取令牌()
除:
打印(“用户未登录”)
返回重定向(“/”)
sp=spotipy.Spotify(auth=token\u info['access\u token'])
app.config['sp']=sp
返回渲染模板('index.html')
def get_令牌():
令牌信息=会话.get(令牌信息,无)
如果不是令牌信息:
提出“例外”
now=int(time.time())
is_expired=令牌信息['expires_at']-现在<60
如果(已过期):
sp_oauth=create_spotify_ouath()
token\u info=sp\u oauth.refresh\u access\u token(token\u info['refresh\u token'])
返回令牌信息
def create_spotify_ouath():
返回SpotifyOuth(
客户号=客户号,
客户机密=客户机密,
重定向\u uri=url\u for('redirectPage',\u external=True),
scope=“用户顶部读取用户库读取”)
如果名称=“\uuuuu main\uuuuuuuu”:
app.run(debug=True)
如果需要引用完整的代码或文件结构,可以查看


感谢您的帮助!谢谢

您好,很明显,您在应用程序上有一个共享变量,现在我没有查看整个repo,但是查看getTracks()端点,您能在第81行解释一下为什么要将对象sp添加到应用程序配置中,我怀疑这是导致问题的原因,应用程序配置在所有用户之间共享。我这样做是因为我正在获取其他文件中的数据,并且需要使用“sp”变量来实现这一点。我将其传递给app config,以便可以将其传递给其他文件。我尝试使用session来传递数据(我不确定这是否能解决问题),但这不起作用,因为它说“sp不是JSON可序列化的”。除非你想在整个应用程序上共享数据,否则你不能使用app config传递数据,我建议在这里使用一个技巧[不是解决方案]只是一个让你保持下去的技巧,将sp对象传递给app config中的一个字典,类似于app.config['all_sp_objects']={},然后像这样填充这个字典app.config['all_sp_objects']['user_id']=sp,然后,当您需要访问对象时,使用用户id作为密钥访问它。作为永久解决方案,您需要改进您的应用程序结构和设计模式。看看一些示例应用程序。感谢@notify\u my\u threads的建议!我尝试了你提到的技巧,但也没有成功(除非我在这里做错了什么)。由于用户使用Spotify API登录,而app.config使每个人都拥有相同的数据,因此我使用cookie作为用户id并创建了字典。问题仍然存在,我看到两个用户的数据相同。