Flask 通过 url 变量传递另一个 url

问题描述 投票:0回答:3

我正在尝试从头开始通过 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”之类的内容时,它运行良好“/”将被视为新目录

有什么办法可以在烧瓶中避免这个问题吗?

python python-3.x flask web-development-server
3个回答
4
投票

不要尝试将该值作为路由本身的一部分进行传递。将其作为查询参数传递。

@app.route('/api/v1/cors/')
def api_cors():
    url = request.args.get('url')

并将其称为

"/api/v1/cors/?url=https://google.com/images/image.jpg"


2
投票

如果您想使用与现在使用的相同的 URL 方案,请将您的路由装饰器更改为此,它将起作用。

@app.route('/api/v1/cors/url=<path:name>&method=<method>', methods=['GET'])

0
投票

在我的用例中,我正在构建一个 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
© www.soinside.com 2019 - 2024. All rights reserved.