(DJANGO) Как перенаправить на другой URL из представления? - PullRequest
0 голосов
/ 10 февраля 2020

Я новичок в Django, и теперь у меня возникают проблемы с перенаправлением на другой URL из текущего представления. В этом случае я бы хотел перенаправить на страницу входа в Spotify.

Вот мое мнение:

#############################################################################
client_id = 'somestring'; # Your client id
client_secret = 'anotherstring'; # Your secret
redirect_uri = 'http://127.0.0.1:8000/callback/'; # Your redirect uri
stateKey = 'spotify_auth_state'
#############################################################################

def generateRandomString(length):
    text = ''
    possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'

    for i in range(0,length):
         text += possible[math.floor(random.random() * len(possible))] 
    return text

##############################################################################


def login_process(request):

    if request.method == 'GET':

        state = generateRandomString(16)
        print(str(state))
        HttpResponse.set_cookie(stateKey, state)

        #your application requests authorization
        scope = 'user-top-read user-read-email'
        return HttpResponseRedirect(request, 'https://accounts.spotify.com/authorize?' + urllib.parse.urlencode({
          response_type: 'code',
          client_id: client_id,
          scope: scope,
          redirect_uri: redirect_uri,
          state: state
        }), {})

def login_view(request, *args, **kwargs):
    print(args, kwargs)
    print(request.user)
    #return HttpResponse("<h1>Hello world</h1>")
    return render(request, "login.html", {})




def callback_view(request, *args, **kwargs):
    return render(request, "callback.html", {})


вот ссылка, по которой я должен щелкнуть, чтобы перенаправить:

    <a href="login/">Login with spotify</a>

вот мой urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', login_view, name='login_view'),
    path('login/', login_process, name = 'login'),
    path('callback/', callback_view, name = 'callback_view'),
]

Я получаю сообщение об ошибке: «AttributeError at / login / 'str' объект не имеет атрибута« cookies »», и я даже не знаю, вернется ли метод «return HttpResponseRedirect "это правильный способ сделать все это. Вы можете мне помочь?

1 Ответ

1 голос
/ 10 февраля 2020

Здесь:

HttpResponse.set_cookie(stateKey, state)

Вы вызываете HttpResponse.set_cookie для самого класса, а не для экземпляра, поэтому вы получаете несвязанный метод, который ожидает экземпляр в качестве первого параметра. На самом деле правильный способ - сначала создать ответ, а затем вызвать set_cookie:

qs = urllib.parse.urlencode({
          "response_type": 'code',
          "client_id": client_id,
          "scope": scope,
          "redirect_uri": redirect_uri,
          "state": state
        })
url = 'https://accounts.spotify.com/authorize?{}'.format(qs) 
response = HttpResponseRedirect(request, url)
reponse.set_cookie(whatever)
return response
...