解决ValueError("When specifying _scheme, _external must be True")在flask出现报错
报错的原因
当使用 Flask 框架中的 url_for() 函数时,如果同时指定了 _scheme 参数和 _external=False 参数,会导致出现 "ValueError: When specifying _scheme, _external must be True" 的错误。
这是因为,当指定 _scheme 参数时,表示要生成一个具有特定协议的 URL。而当 _external 参数设置为 False 时,表示生成的 URL 仅包含相对路径。因此,在 _scheme 和 _external 参数同时存在时,会出现矛盾,导致抛出 ValueError 异常。
解决这个问题的方法是,当指定 _scheme 参数时,需要同时将 _external 参数设置为 True。
例如:
url_for('index', _scheme='https', _external=True)
或者
url_for('index', _scheme='https')
这样就能生成一个具有 https 协议的绝对 URL 了。
总之,当使用 _scheme 参数时,需要同时将 _external 参数设置为 True,以避免出现 "ValueError: When specifying _scheme, _external must be True" 的错误。
如何解决
解决 "ValueError: When specifying _scheme, _external must be True" 的错误,需要在使用 Flask 框架中的 url_for() 函数时将 _scheme 和 _external 参数正确地设置。
正确的做法是,当指定 _scheme 参数时,需要同时将 _external 参数设置为 True。
例如:
url_for('index', _scheme='https', _external=True)
或者
url_for('index', _scheme='https')
这样就能生成一个具有 https 协议的绝对 URL 了。
如果不需要指定_scheme 参数可以不用指定 _scheme 和 _external 参数。
url_for('index')
径的 URL 了。
总之,解决 "ValueError: When specifying _scheme, _external must be True" 的错误,只需要在使用 _scheme 参数时同时将 _external 参数设置为 True 就可以了。如果不需要使用_scheme 参数,就不需要使用 _scheme 和 _external 参数。
需要注意的是,在使用 url_for() 时,还有其他参数,如 _anchor、_method、_fragment,需要根据需要来设置。
使用例子
当然有,下面是一个使用 Flask 的简单示例,展示了如何正确使用 url_for() 函数来生成 URL。
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def index():
return 'Welcome to the homepage'
@app.route('/login')
def login():
return 'Welcome to the login page'
@app.route('/profile/')
def profile(username):
return 'Welcome to {}\'s profile'.format(username)
if __name__ == '__main__':
app.run(debug=True)
在上面的示例中,我们可以使用 url_for() 函数来生成不同类型的 URL。
# generate relative URL
print(url_for('index')) # /
print(url_for('login')) # /login
print(url_for('profile', username='John')) # /profile/John
# generate absolute URL with scheme
print(url_for('index', _scheme='https', _external=True)) # https://localhost:5000/
print(
url_for('login', _scheme='https', _external=True)) # https://localhost:5000/login
print(url_for('profile', username='John', _scheme='https', _external=True)) # https://localhost:5000/profile/John
在这个例子中,我们使用了 _scheme 和 _external 参数来生成 https 协议的绝对 URL。
在这个例子中,我们使用了 _scheme 参数来生成 https 协议的绝对 URL,并且不需要使用 _external 参数。
需要注意的是,在上面的示例中,我们使用了一些简单的路由,在实际项目中,你可能需要使用更复杂的路由和参数来生成 URL。
总之,使用 url_for() 函数来生成 URL 时,需要正确地使用 _scheme 和 _external 参数,并根据需要使用其他参数。