Web Services 如何传递一个url内包含?,/,& flask的webservice方法

raogr8fs  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(133)

我尝试在Flask方法中传递URL,

My url: https://example.org/de?=fg&hi=jk

我尝试了以下步骤:

@app.route('/flip/<path:url>')
def flip(url):
    return "retrievved url:"+str(url)
    
calling the url : localhost:8200//flip/https://example.org/de?=fg&hi=jk 
returns : `https://example.org/de`

and another method,

@app.route('/flip')
def flip(url):
    url=request.args.get('url')
    return "retrievved url:"+str(url)

    
calling the url: localhost:8200//flip?url=https://example.org/de?=fg&hi=jk  
returns : 'https://example.org/de?=fg'

我的预期输出应该返回我们传递的完整url https://example.org/de?=fg&hi=jk

0lvr5msh

0lvr5msh1#

这与Flask无关。您的URL并不代表您所认为的意思。
例如,此URL:

localhost:8200//flip?url=https://example.org/de?=fg&hi=jk

...有两个查询参数:

url=https://example.org/de?=fg
hi=jk

&分隔外部请求上的查询参数,因此它具有单独的urlhi参数。
首先,在查询参数中使用许多这样的字符也是非法的,但您通常可以侥幸逃脱。
这就是为什么需要在其他URL中嵌入URL的网站使用percent encoding的原因。

localhost:8200//flip?url=https%3A//example.org/de%3F%3Dfg%26hi%3Djk

现在只有一个查询参数:

url=https%3A//example.org/de%3F%3Dfg%26hi%3Djk

然后,当您解析查询字符串时,得到的结果是:

url=https://example.org/de?=fg&hi=jk

如果确实无法在客户端修复问题,可以迭代所有查询参数,并尝试将它们重新组合为一个url参数。
或者,您可以获取整个URL(request.url而不是request.args),并手动对其进行解析,而不是让Flask或Python为您解析。
但无论哪种方式,这真的是黑客,你不应该考虑它,除非绝对必要。
另外,你的URL是非法的,你不想依赖于“你经常会逃脱惩罚”。除非它是可以接受的,比如说,一些用户将无法连接,因为他们的代理搞砸了URL,你花了整个周末撞你的头在table上试图调试它,然后它为他们中的一些人工作,但现在有几个得到错误的页面,然后新版Chrome突然打破了一些不同的东西,然后...
当你坚持标准的时候,HTTP已经够复杂和混乱的了,特别是当你的框架为你做了大部分繁重的工作的时候。

相关问题