【问题标题】:how to implement flask redirect decorator如何实现烧瓶重定向装饰器
【发布时间】:2019-11-13 11:05:40
【问题描述】:

我有一个烧瓶应用程序实例在端口 80 上运行,同一应用程序的另一个实例在端口 8080 上运行。我希望所有用户对所有 URL 使用端口 80,除了一个名为 /parallel_url 的 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)

【问题讨论】:

  • 为什么这个问题被否决,投反对票应该带有评论和反馈。这将有助于 OP 更好地提出问题

标签: flask python-decorators flask-restful flask-login


【解决方案1】:

我会捕获所有可能的组合并使用redirect 函数来调用其他服务器。你只需要请求中的当前端口,就像描述的here

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()

【讨论】:

    猜你喜欢
    • 2016-03-11
    • 2012-07-14
    • 2021-04-06
    • 2020-09-20
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多