我的烧瓶应用程序遇到问题。当 not 在 docker 容器内运行应用程序时,我能够通过 Spotify API 成功授权。
localhost:5000/login
localhost:5000/callback
,其中显示文本“成功”但是当我对 Flask 应用程序进行 dockerize 时,当用户在授权页面上单击“同意”时,我收到以下错误:
下面是我的 Dockerfile 和 app.py 文件
Dockerfile
FROM python:3.9-slim-buster
WORKDIR /app
COPY ./requirements.txt /app
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
ENV FLASK_APP=app.py
CMD ["flask", "run", "--host", "0.0.0.0"]
应用程序.py
from flask import Flask, render_template, flash, session, redirect, request, Response, session, make_response
from spotify_connector import SpotifyConnector
connector = SpotifyConnector()
@app.route('/')
def index():
return "INDEX"
@app.route('/login')
def login():
client_id = app.config['CLIENT_ID']
redirect_uri = app.config['REDIRECT_URI']
scope = app.config['SCOPE']
authorize_url = 'https://accounts.spotify.com/en/authorize?'
state_key = connector.create_state_key(15)
session['state_key'] = state_key
parameters = 'response_type=code&client_id=' + client_id + '&redirect_uri=' + redirect_uri + '&scope=' + scope + '&state=' + state_key
response = make_response(redirect(authorize_url + parameters))
return response
@app.route('/callback')
def callback():
code = request.args.get('code', None)
state = request.args.get('state', None)
session.pop('state_key', None)
payload = connector.getToken(code)
if payload is not None:
session['access_token'] = payload['access_token']
session['refresh_token'] = payload['refresh_token']
return "SUCCESS"
else:
return "FAILURE"
if __name__ == "__main__":
app.run(host="localhost")
在为 Spotify 生成令牌的代码部分(错误的根源),我使用以下方法检索我的客户端 ID 和秘密:
CLIENT_ID = os.getenv("CLIENT_ID")
CLIENT_SECRET = os.getenv("CLIENT_SECRET")
我扔了一个打印语句,看到授权标头看起来像这样 --
Authorization: Basic "":""
,而它应该看起来像这样 Authorization: Basic CLIENT_ID:CLIENT_SECRET
。这证实了 CLIENT_ID 和 CLIENT_SECRET 不可用。
我将以下内容添加到我的 Dockerfile 中,现在我可以成功授权:
ENV CLIENT_ID=*****
ENV CLIENT_SECRET=*****
更进一步,我很可能会删除上述两个声明,并将
os.getenv
声明添加到我的 Flask 应用程序配置文件中。