Flask框架学习(一):Python Web Flask框架学习(一)
参考
Request对象
- 通过flask的requst对象可以访问由POST或PUT请求传来的数据,只需调用request中的form属性即可。
- form属性本身默认为ImmutableMultiDict属性,但是可以通过设置parameter_storage_class来改变其类型。
- 利用request,我们可以实现一个简单的登陆页面:
@app.route("/") @app.route("/<name>") def hello(name=None): return render_template("hello.html", name=name) @app.route("/login", methods=["GET", "POST"]) def login(): if request.method == "POST": if request.form['username'] == "admin" and request.form['password'] == "adminonly": # 通过form属性访问login页面POST来的用户名和密码 return hello(name=request.form['username']) # 这里会引发一个问题,后文引入Redirect后会解决 else: errmsg = "Username or Password is invalid." return error(errmsg=errmsg) return render_template("login.html") @app.route("/error") @app.route("/error/<ErrMsg>") def error(errmsg): return render_template("error.html", ErrMsg=errmsg)
hello页面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello page</title> </head> <body> <h2> This is a Hello Page </h2> {% if name %} <p> Hello, {{name}} </p> {% else %} <p> Hello World</p> {% endif %} </body> </html>
Login页面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <form method="post" action="login"> <table> <tr> <td>Username:</td> <td> <input type="text" id="username" name="username" /> </td> </tr> <tr> <td>Password:</td> <td> <input type="password" id="password" name="password" /> </td> </tr> <tr> <td></td> <td> <input type="submit" value="Submit" /> </td> </tr> </table> </form> </body> </html>
Error界面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Error</title> </head> <body> <h2> This is a Error Page </h2> <label> {{ ErrMsg }} </label> </body> </html>
对于此登录模块,输入正确用户名密码后会转向hello界面并显示用户名,输入账号密码不合法则会转向error页面。
- 在请求form属性中的值时,如果form中没有对应的键,会抛出一个特殊的KeyError异常。其可以被标准的KeyError捕获到,但如果置之不理则会显示一个HTTP 400 Bad Request页面出来。
- 对于通过URL传来的数据(如?key=value),可以使用args属性来获取
searchword = request.args.get('key', '')
- 代码中的注释小问题如下图,虽然显示为hello页面,但URL处依然为login。原因是return时只调用了hello方法,hello方法只是返回了一个HTML页面模板,使其显示在浏览器中,实际上还是停留在login这个方法中的,这里应该使用后文的redirect