我已经设置了一个Django项目,我正在将它与Mopidy pyspotify的2.x版集成。我编写了一段代码来检查Spotify会话实例,如果没有,则创建一个,然后从Spotify URI获取一个轨道的名称。代码如下:
def spotify_logic(request):
if spotify.session_instance is not None:
foo = spotify.Track('spotify:track:7fHnHy7pH4hHLQxBq1NbE8')
foo.load()
name = foo.name
else:
config = spotify.SessionConfig()
config.application_key_filename = os.path.dirname(os.path.realpath(__file__)) + '/spotify_appkey.key'
session = spotify.Session(config=config)
session.login('TehNanor', '*******')
session.process_events()
foo = spotify.Track('spotify:track:7fHnHy7pH4hHLQxBq1NbE8')
foo.load()
name = foo.name
return render(request, 'clupus/spotify.html', {'name': name})
当我使用./manage.py runserver
在本地运行项目并访问服务器时,它会显示歌曲的名称:“第11阶段 - 直到我们遇见天空”。当我将更改提取到我的Apache服务器并访问URL时,我得到以下回溯。
Environment:
Request Method: GET
Request URL: http://ec2-54-196-205-226.compute-1.amazonaws.com/spotify/
Django Version: 1.6.1
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'raudio')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
114. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/ubuntu/public_html/clupus.com/clupus/raudio/views.py" in spotify_logic
63. foo.load()
File "/usr/local/lib/python2.7/dist-packages/spotify/track.py" in load
66. return utils.load(self, timeout=timeout)
File "/usr/local/lib/python2.7/dist-packages/spotify/utils.py" in load
126. raise RuntimeError('Session must be logged in to load objects')
Exception Type: RuntimeError at /spotify/
Exception Value: Session must be logged in to load objects
我已经尝试了十几种代码变体,每一次在本地运行的迭代都不适用于生产。我只能想象这个问题是因为我在本地使用./manage.py runserver
并且在我的Apache服务器上有一个mod_wsgi方法,但是我很难弄清楚如何纠正这个问题。
答案 0 :(得分:0)
这已经在freenode的#mopidy中得到了回答,但是由于其他人可能会发现这里的问题是答案和一些解释。
libspotify因此pyspotify不是线程安全的。库有全局状态,因此需要移动全局会话的设置,以便仅在启动时完成。在django中执行此操作的典型方法是将其移至中间件的__init__
方法,然后将全局状态附加到每个请求。
class SpotifyMiddlware(object):
def __init__(self):
config = spotify.SessionConfig()
config.application_key_filename = os.path.join(
os.path.dirname(os.path.realpath(__file__)), 'spotify_appkey.key')
self.session = spotify.Session(config=config)
self.session.login('TehNanor', '*******')
while not self.session.user:
self.session.process_events()
def process_request(self, request):
request.spotify = self.session
等待登录完成也可以进行回调+线程事件。我们只需检查您的视图中的登录状态,甚至可以检查中间件的process_request