как реализовать декоратор перенаправления фляги

У меня есть экземпляр приложения flask, работающий на порту 80, и другой экземпляр того же приложения на порту 8080. Я хочу, чтобы все пользователи использовали порт 80 для всех URL-адресов, кроме одного URL-адреса с именем /parallel_url. Поэтому, когда они посещают https://server:80/parallel_url, он перенаправляется на https://server:8080/parallel_url. Я также не хочу, чтобы пользователи могли посещать любые другие URL-адреса (кроме /parallel_url) через порт 8080, и я хочу, чтобы они были перенаправлены на сообщение 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)

person Viswajith Kalavapudi    schedule 02.07.2019    source источник
comment
почему этот вопрос был отклонен, голосование должно сопровождаться комментарием, отзывом. Это помогло бы ОП лучше сформулировать вопрос.   -  person Viswajith Kalavapudi    schedule 03.07.2019


Ответы (1)


Я бы просто перехватил все возможные комбинации и использовал функцию 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()
person Ruben Helsloot    schedule 02.07.2019