как реализовать колбу перенаправить декоратор - PullRequest
0 голосов
/ 02 июля 2019

У меня есть экземпляр приложения фляги, работающий на порту 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)

1 Ответ

1 голос
/ 02 июля 2019

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