重新捡起flask(六)

其实到这里来说,我发现狗书一些没太讲清楚的事情了,当然看着之前的笔记,其实我也知道自己以前也发现了一些问题。

由于我们大部分都是在用拓展包,其实拓展包为我们做了一些什么事情其实我是完全不知道的。

比如现在我们重点来看一下我们test函数。

@app.route("/test", methods=['GET', 'POST'])
def test():
    form = NameForm()
    if form.validate_on_submit():
        session["name"] = form.name.data
        redirect(url_for("test"))
    return render_template("test.html", form=form, name=session.get("name"))

一个需要说到的点是,什么时候浏览器会发送post请求,什么时候会发送get请求,我们后台是否知道?

单纯从上面这段代码我们是不知道的。

我们只能猜测在jinja2模板里面的submit按钮会触发post请求,如果只是打开网址,会发送get请求。

我们是否能指定submit按钮,按下以后也发送get请求呢?我们现在不知道。

暂且就按上面的理解来继续吧。

然后,我们现在主要是解决一个刷新页面,浏览器会重复提交上一次请求的情况,当是post请求的话,浏览器会不厌其烦的告警。

浏览器是浏览器的事,我们只能靠我们的后台来做处理了。

那其实就像我们上面的所说的一样,我们应该是要处理上面那个东东,我要让按下submit的请求变成一个get请求,狗书中的redirect其实也是get请求啦。

狗书上是怎么做的,他直接改成上面的代码就实现了。

我一脸蒙蔽,不应该是改前端的代码么?

改后台这么骚的思路也可以做?

这里我真的不是特别理解。

但是,也要试图去理解一下。

我们没改前端,那么说明一个东东,按下submit按钮后,确实还是发了一个post请求过来(google浏览器开发者模式是不是可以验证这个说法?)。

后台收到这个post请求后,强制让客户端再发一个get请求过来。这样导致,按下按钮后,实际的最后效果,是最后发送了一个get请求。

这个思路确实骚。

不像我,傻乎乎的就像去改造前端按钮发送的请求。

再来看看上面这段代码,好像没起作用,坑吧,这么精辟的思路翻车了?

大家可以想想为什么没有生效?

因为什么呢?因为我漏了一个return。

其实完整的应该是这样的。

@app.route("/test", methods=['GET', 'POST'])
def test():
    form = NameForm()
    if form.validate_on_submit():
        session["name"] = form.name.data
        return redirect(url_for("test"))
    return render_template("test.html", form=form, name=session.get("name"))

这样继续让我怀疑之前的一些假设。

假设我刚刚的假定是对的话,好像会有些问题。

我按下按钮触发post请求给后台,后台看到你这个东东,表格里面有东西,好,我就给你重定向一下。然后再返回给你test.html。

这样的话,其实最后请求也是get请求啊...

难道说前面想的是有问题的?

我们再来猜测吧,难道是这么说?

我们虽说写的是后台的代码,其实并不完全只是后台。其实也有一部分前端的逻辑?

不太清楚,望高人指点...

posted @ 2017-11-25 10:49  onhacker  阅读(156)  评论(0)    收藏  举报