【问题标题】:How to remove parameters from URL in Flask python如何从 Flask python 中的 URL 中删除参数
【发布时间】:2014-12-05 20:58:35
【问题描述】:

在我的网站中,我的网址将带有尾随参数,例如:

example.com/magicpage/?p=10&d=somestuff

有没有办法在处理请求后删除这些参数?所以当用户点击一个链接的时候,参数是传过来的,但是可见的URL就是:

example.com/magicpage

我的代码:

@app.route("/magicpage")
def magicPage():
    #parse parameters and do things
    #finish up
    #remove the trailing parameters in the url
    #return the rendered page

【问题讨论】:

  • 它是可能会链接到外部的页面,还是需要上下文(参数)才能正确显示的 Web 应用程序的一部分?
  • 需要上下文来显示正确的内容。

标签: python url flask


【解决方案1】:

有两种方法可以做到这一点。

选项 1:使用 POST 参数而不是 GET。

如果参数是通过 HTML 表单传递的,请将 method=post 添加到 <form> 标记,然后将页面更改为:

@app.route("/magicpage")
def magicPage():
    param1 = request.args.get("param1")
    param2 = request.args.get("param2")

到:

@app.route("/magicpage", methods=["POST"])
def magicPage():
    param1 = request.form.get("param1")
    param2 = request.form.get("param2")

好处是没有重定向。不利的一面是,如果用户尝试刷新结果页面,他们将收到令人讨厌的浏览器弹出窗口,提示他们重新提交信息:

也就是说,这是在网络中传递隐藏参数的更常见方式。


选项2:处理参数后进行重定向。

这有点复杂,因为我们重定向到同一个页面,我们需要检查他们是第一次还是第二次来到这个页面。

最好的方法是使用发布请求。这样做的好处是没有刷新弹出窗口,但缺点是除非您将参数存储在会话中,否则不会在页面的后期渲染中为您提供参数。

@app.route("/magicpage", methods=["GET", "POST"])
def magicPage():
    if request.method == 'POST':
        # process parameters
        return redirect(request.path)
    if request.method == "GET":
        # render page

或者,您可以只检查是否存在一个参数作为您的指标:

@app.route("/magicpage", methods=["GET", "POST"])
def magicPage():
    if request.form.get("param1", None) is not None:
        # process parameters
        return redirect(request.path)
    else:
        # render page

【讨论】:

  • 有趣的是,我实际上是在将初始参数作为 POST 请求传递,所以参数是不可见的,而是在下一页保持会话(假设您返回的结果多个页面,然后我的 page2 链接将具有参数,以便我可以继续提供过滤后的内容)。因此,参数实际上嵌入在 url 中,实际上并不是来自表单。如果我重定向,我会丢失参数以及我正在服务的内容。 :(
  • @Stupid.Fat.Cat 在这种情况下,您正在寻找的是session。它允许您在请求之间传递信息,而无需使用 url 参数。 flask.pocoo.org/docs/0.10/quickstart/#sessions
  • @Stupid.Fat.Cat 你在这个答案中寻找其他什么来接受它?
  • 似乎我必须做很多重构,直到我真正实现这一点。在那之前,我不确定它是否会起作用,所以我还不能接受它:(
  • 也许作为 session 的 cobblecode 替代品,如果您出于某种原因想要避免使用它们(但为什么会这样呢?),“参数”可以嵌入到您生成的页面的链接中在 post-POST 重定向之后。尽管如此,所有关于安全性和可管理性的警告仍然适用,这就是为什么session 听起来仍然是一个更好的主意。
【解决方案2】:

您可以使用隐藏的表单域通过POST 将参数传递到多个页面。

<input type="hidden" ...>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2014-09-08
    • 2014-10-25
    • 1970-01-01
    相关资源
    最近更新 更多