在 Django 和 Python 上使用 spotipy 获取 Spotify 访问令牌

Get Spotify access token with spotipy on Django and Python

我是 Django 的新手,我正在尝试 link Spotify 到我的网络应用程序。我正在使用 Spotify 来做到这一点,它可以正确访问 Spotify。

为此,我有一个按钮可以打开下面的视图

views.py

@authenticated_user
def spotify_login(request):

    sp_auth = SpotifyOAuth(client_id=str(os.getenv('SPOTIPY_CLIENT_ID')),
                           client_secret=str(os.getenv('SPOTIPY_CLIENT_SECRET')),
                           redirect_uri="http://127.0.0.1:8000/",
                           scope="user-library-read")
    redirect_url = sp_auth.get_authorize_url()
    auth_token = sp_auth.get_access_token()
    print(auth_token)
    print("----- this is the AUTH_TOKEN url -------", auth_token)
    return HttpResponseRedirect(redirect_url)

如果我不使用 auth_token = sp_auth.get_access_token(),一切正常,我被重定向到正确的位置。不幸的是,如果我添加那行代码来访问访问令牌,而不是停留在同一页面上,它会在浏览器上打开带有 Spotify auth_code 的另一个选项卡,并让原始页面永远加载。

有没有办法在不重新加载视图或在浏览器中打开另一个选项卡的情况下在后台检索访问令牌?

你被重定向到你告诉 django 去的地方。

redirect_url 只是一个包含代码的 spotify api 重定向,它被捕获并用于获取访问令牌。

将您的预期响应设置为 return 值。

顺便提醒一下:

  1. redirect_uri="http://127.0.0.1:8000/", 应在 spotify 应用程序中添加(通常为 http://127.0.0.1:8000/callback",
  2. auth_token是一个json,你可以在auth_token['access_token']
  3. 中找到token

解决方案是创建一个新视图来访问 URL

views.py

from .utils import is_user_already_auth_spotify, spotify_oauth2

@authenticated_user
def spotify_login(request):

    if is_user_already_auth_spotify(request.user.username):
        messages.error(request, "You have already linked your Spotify account")
        return HttpResponseRedirect('account/' + str(request.user.username))

    sp_auth = spotify_oauth2()
    redirect_url = sp_auth.get_authorize_url()
    return HttpResponseRedirect(redirect_url)


@authenticated_user
def spotify_callback(request):
    full_path = request.get_full_path()
    parsed_url = urlparse(full_path)
    spotify_code = parse_qs(parsed_url.query)['code'][0]

    sp_auth = spotify_oauth2()
    token = sp_auth.get_access_token(spotify_code)

    data = {
        str(request.user.username): token
    }
    with open('spotify_auth.json', 'w') as f:
        json.dump(data, f)

    messages.success(request, "You have correctly linked your Spotify account")

    return HttpResponseRedirect('account/' + str(request.user.username))

urls.py

urlpatterns = [
    path('account/<str:username>/', views.account_user, name="account"),
    path('spotify_login', views.spotify_login, name="spotify_login"),
    path('spotify_callback', views.spotify_callback, name="spotify_callback"),
]

utils.py

import json
from spotipy import oauth2
import os


def is_user_already_auth_spotify(username):
    my_loaded_dict = {}
    with open('spotify_auth.json', 'r') as f:
        try:
            my_loaded_dict = json.load(f)
        except:
            # file vuoto
            pass
    if str(username) in my_loaded_dict:
        # controllare scadenza token ed in caso rinnovarlo
        return True
    else:
        return False


def spotify_oauth2():
    sp_auth = oauth2.SpotifyOAuth(client_id=str(os.getenv('SPOTIPY_CLIENT_ID')),
                                  client_secret=str(os.getenv('SPOTIPY_CLIENT_SECRET')),
                                  redirect_uri="http://127.0.0.1:8000/members/spotify_callback",
                                  scope="user-library-read")
    return sp_auth

该代码还将token保存在一个JSON中,如果已经保存则搜索