1

TL;博士:

在 Flask 中 - 我希望在我的基本模板的导航栏中有一个语言选择下拉菜单 - 这样就可以从每个页面中选择语言。我想要它,这样当用户单击下拉列表中的选项时,他们会停留在同一页面上,但会使用新翻译刷新它(将新参数传递给视图函数并重新加载模板)

我只知道如何重定向到:

  • request.url (这将是按钮的 url,我不想要,我想要用户点击的页面)。
  • request.referrer (这是实际的以前的 url,但是由于我更改了语言,因此 url 也发生了变化,所以我不想要相同的 url,我想要相同的路线。

由于用户可以从各个页面单击,我不能只说“url_for(某个路由)”,因为这会将其硬编码到一个路由,我希望这取决于用户单击时的位置。否则,将 url_for 与我的语言环境参数一起使用会按预期工作。我只是不能用它来“动态刷新”可以这么说。

那么有没有一种方法可以让我做一些类似于 request.referrer 的事情,但是使用引用视图功能 - 而不是引用 url?有点像:

redirect(request.referring_route(locale=newlocale))

我的路线的一些例子:

# Index page
@user_blueprint.route("/<locale>", methods=["GET"])
def index(locale):

    return render_template("index.html")

# Some word info page with a word parameter
@user_blueprint.route("/<locale>/word/<word_id>", methods=["GET"], defaults={"locale": "en"})
@user_blueprint.route("/<locale>/ord/<word_id>", methods=["GET"], defaults={"locale": "da"})
def wordinfo(word_id, locale):

    myword = words.get(word_id)
    return render_template("wordinfo.html", myword=myword)

# This could be my route for changing language
@user_blueprint.route("/<locale>/refresh_language", methods=["GET", "POST"])
def refresh_language(locale):
    if locale in accepted_languages:
        session["locale"] = locale
        return redirect(referring_route_with_same_parameters_but_new_locale(locale=locale))

我尝试使用 request.referrer 并使用装饰器强制重定向到与会话匹配的 url,但这也意味着强制用户始终看到他们在会话中使用的语言,然后他们将无法接收链接到不同的语言版本。这让我很困扰。当用户为页面的不同语言版本输入完整、有效的 url 时,我希望会话语言/首选语言发生变化。

4

0 回答 0