Получение токена доступа Spotify с помощью spotipy на Django и Python

Я новичок в Django и пытаюсь связать Spotify с моим webapp. Я использую 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, содержащее код, который перехватывается и используется для получения маркера доступа.

Установите ожидаемый ответ в качестве возвращаемого значения.

Кстати, имейте в виду:

  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']

Решением было создание нового представления для доступа к URL

views.py

@authenticated_user
def spotify_login(request):
    #cerca nel json
    my_loaded_dict = {}
    with open('spotify_auth.json', 'r') as f:
        try:
            my_loaded_dict = json.load(f)
        except:
            pass
    if str(request.user.username) in my_loaded_dict:
        messages.error(request, "You have already linked your Spotify account")
        return HttpResponseRedirect('account/' + str(request.user.username))

    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")
    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]
    data = {
        str(request.user.username): spotify_code
    }
    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"),
]

Код также сохраняет токен в JSON и ищет его, если он уже был сохранен

Вернуться на верх