我正在尝试从头开始通过 Flask 构建一个 cors 代理。这是我的代码
@app.route('/api/v1/cors/url=<name>&method=<method>', methods=['GET'])
def api_cors(name, method):
if method == 'http' or method == 'https':
r = request.urlopen(method+"://"+name)
return r.read()
else:
return "method not set!"
到目前为止,它运行良好,但我有一个问题,当我传递“url=google.com&method=https”时,它运行良好,但是当我传递“url=google.com/images/image.jpg&method=https”之类的内容时,它运行良好“/”将被视为新目录
有什么办法可以在烧瓶中避免这个问题吗?
不要尝试将该值作为路由本身的一部分进行传递。将其作为查询参数传递。
@app.route('/api/v1/cors/')
def api_cors():
url = request.args.get('url')
并将其称为
"/api/v1/cors/?url=https://google.com/images/image.jpg"
。
如果您想使用与现在使用的相同的 URL 方案,请将您的路由装饰器更改为此,它将起作用。
@app.route('/api/v1/cors/url=<path:name>&method=<method>', methods=['GET'])
在我的用例中,我正在构建一个 MS Graph 文件浏览器,它从 Graph API 调用接收
@odata.nextLink
值,该值看起来像 https://graph.microsoft.com/v1.0/groups/myGroupId/drive/ items('driveItem')/children?$select=id,name,webUrl&$top=10&$skiptoken=someToken.
在我的主要 python 脚本中,我使用
quote
将 urllib.parse.quote
函数添加到 jinja 环境中。我们需要它来对 jinja 模板中的 URL 进行编码:
import urllib
app.jinja_env.globals.update(Auth=identity.web.Auth, quote=urllib.parse.quote)
在我的 Jinja 模板中,我使用以下内容对
result['@odata.nextLink']
URL 进行编码,并确保设置 safe=''
,以便 /
字符也被编码。这个编码的 URL 被发送到我们的 odNextLink
路由:
<a href="{{ url_for('odNextLink', nextLink=quote(result['@odata.nextLink'], safe='')) }}">Next link</a>
在我们的路线中,我们需要确保有
import urllib
,以便我们可以在调用 API 端点之前使用 urllib.parse.unquote(nextLink)
对 URL 进行取消编码。
# this route should return results from a Graph API 'nextLink' call
@app.route("/od_group_items/<nextLink>")
def odNextLink(nextLink):
import urllib
token = app.auth.get_token_for_user(ast.literal_eval(os.getenv('SCOPE')))
if "error" in token:
return redirect(url_for("login"))
api_result = requests.get(
urllib.parse.unquote(nextLink),
headers={'Authorization': 'Bearer ' + token['access_token']},
timeout=30,
).json()
return api_result