如何实现烧瓶重定向装饰器
how to implement flask redirect decorator
我在端口 80 上有一个 Flask 应用程序实例 运行,在端口 8080 上有一个相同应用程序的另一个实例。我希望所有用户都将端口 80 用于所有 url,除了一个url 名为 /parallel_url
。因此,当他们访问 https://server:80/parallel_url
时,它会重定向到 https://server:8080/parallel_url
。我也不希望用户能够访问端口 8080 上的任何其他 url(不包括 /parallel_url
),我希望他们被重定向到 post 80
所以如果他们访问 https://server:8080/*
它需要重定向到 https://server:80/*
我打算写一个装饰器,看看当前的 url 是否是 /parallel_url
以外的任何东西,并将其重定向到 80。因此,如果用户在端口 8080 中访问它,他们需要重定向到 80
def parallel_redirect(func):
@functools.wraps(func)
def wrapper():
"""
What to do here to redirect to 80
"""
if request.url_rule == "/parallel_url":
value = func()
return value
return wrapper
@mod.route('/parallel_url')
@parallel_redirect
@login_required
def parallel_url():
template = tpl_env.get_template('my_index.html')
x = "some data from db"
y = "some other data from db"
return template.render(x=x,y=y)
更新:
我找到了一个变量,它告诉我我在哪个端口。请参考下面的代码
def parallel_redirect(func):
@functools.wraps(func)
def wrapper():
if os.environ.curr_port == 8080:
if request.url_rule != "/parallel_url":
# code to redirect to "https://server:80/"+request.url_rule
elif os.environ.curr_port == 80:
if request.url_rule == "/parallel_url":
# code to redirect to "https://server:8080/"+request.url_rule
else:
value = func()
return value
return wrapper
@mod.route('/parallel_url')
@parallel_redirect
@login_required
def parallel_url():
template = tpl_env.get_template('my_index.html')
x = "some data from db"
y = "some other data from db"
return template.render(x=x,y=y)
我会捕获所有可能的组合并使用 redirect
函数调用其他服务器。您只需要请求中的当前端口,如
所述
from flask import redirect
def parallel_redirect(func):
@functools.wraps(func):
request_port = request.environ.get('REMOTE_PORT')
if request.url_rule == "/parallel_url":
if request_port == 80:
# /parallel_url, but on port 80, redirect
return redirect("https://...:8080/parallel_url", code=302)
else:
return func()
elif request_port == 8080:
# not /parallel_url, but on port 8080, also redirect
return redirect("https://...:80" + request.url_rule, code=302)
# finally, not /parallel_url, and on port 80, so we're all good
return func()
我在端口 80 上有一个 Flask 应用程序实例 运行,在端口 8080 上有一个相同应用程序的另一个实例。我希望所有用户都将端口 80 用于所有 url,除了一个url 名为 /parallel_url
。因此,当他们访问 https://server:80/parallel_url
时,它会重定向到 https://server:8080/parallel_url
。我也不希望用户能够访问端口 8080 上的任何其他 url(不包括 /parallel_url
),我希望他们被重定向到 post 80
所以如果他们访问 https://server:8080/*
它需要重定向到 https://server:80/*
我打算写一个装饰器,看看当前的 url 是否是 /parallel_url
以外的任何东西,并将其重定向到 80。因此,如果用户在端口 8080 中访问它,他们需要重定向到 80
def parallel_redirect(func):
@functools.wraps(func)
def wrapper():
"""
What to do here to redirect to 80
"""
if request.url_rule == "/parallel_url":
value = func()
return value
return wrapper
@mod.route('/parallel_url')
@parallel_redirect
@login_required
def parallel_url():
template = tpl_env.get_template('my_index.html')
x = "some data from db"
y = "some other data from db"
return template.render(x=x,y=y)
更新: 我找到了一个变量,它告诉我我在哪个端口。请参考下面的代码
def parallel_redirect(func):
@functools.wraps(func)
def wrapper():
if os.environ.curr_port == 8080:
if request.url_rule != "/parallel_url":
# code to redirect to "https://server:80/"+request.url_rule
elif os.environ.curr_port == 80:
if request.url_rule == "/parallel_url":
# code to redirect to "https://server:8080/"+request.url_rule
else:
value = func()
return value
return wrapper
@mod.route('/parallel_url')
@parallel_redirect
@login_required
def parallel_url():
template = tpl_env.get_template('my_index.html')
x = "some data from db"
y = "some other data from db"
return template.render(x=x,y=y)
我会捕获所有可能的组合并使用 redirect
函数调用其他服务器。您只需要请求中的当前端口,如
from flask import redirect
def parallel_redirect(func):
@functools.wraps(func):
request_port = request.environ.get('REMOTE_PORT')
if request.url_rule == "/parallel_url":
if request_port == 80:
# /parallel_url, but on port 80, redirect
return redirect("https://...:8080/parallel_url", code=302)
else:
return func()
elif request_port == 8080:
# not /parallel_url, but on port 8080, also redirect
return redirect("https://...:80" + request.url_rule, code=302)
# finally, not /parallel_url, and on port 80, so we're all good
return func()