python实战Flask表单提交的方法

Posted Java面试题精选

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实战Flask表单提交的方法相关的知识,希望对你有一定的参考价值。

这里介绍一下Flask表单提交相关的方法,还是以代码实例为主。


首先,Flask模板中表单提交代码与我们一般写的H5表单无异,当然,Flask也提供了表单类,Flask-WTF扩展。这里只介绍常规的表单提交方法。


首先是模板类:

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>from_test</title>
</head>
<body>
{% if name %}
   {{ name }}
{% else %}
<form method="post" action="login">
   Name:<input type="text" name="name"/>
   PassWord:<input type="password" name="password"/>
   <input type="submit" value="Submit"/>
</form>
{% endif %}
</body>
</html>


处理程序:

from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/')
def index():
   return render_template('test1.html')
@app.route('/login', methods=['post'])
def login():
   name = request.form.get('name')
   password = request.form.get('password')
   if name == 'admin' and password == '123':
       return render_template('test1.html', name=name)
   return render_template('test1.html')
if __name__ == '__main__':
   app.run(debug=True)


当验证成功后,页面显示登录者的名字信息。验证失败则继续显示登录页面。


如果此时点击刷新按钮,那么会出现以下提示:


这不太友好,要解决这个问题可以使用重定向,Flask提供了redirect函数,用法如下:

@app.route('/login', methods=['get', 'post'])
def login():
   name = request.form.get('name')
   password = request.form.get('password')
   if name == 'admin' and password == '123':
       return redirect(url_for('login'))
   return render_template('test1.html')


当我们登录成功后,此时用户刷新页面也没有任何问题,但是名字没有传递到页面。那么这时就要和会话session一块儿使用来保证重定向后信息不被丢失。

用法如下:

@app.route('/login', methods=['get', 'post'])
def login():
   name = request.form.get('name')
   password = request.form.get('password')
   if name == 'admin' and password == '123':
       session['name'] = name
       return redirect(url_for('login'))
   return render_template('test1.html', name=session.get('name'))


我这边用的是python2.7,在直接使用时出现一些错误提示:

the session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret


提示比较明显,没有设置密钥导致了session不可用,为了安全起见,也应该设置一个密钥,Flask提供了密钥设置的方法:app.config['SECRET_KEY']

设置密钥可以有效防止跨站请求伪造的攻击。


解决办法是在代码中加入:

app.config['SECRET_KEY'] = 'myproject'
app.secret_key = 'myproject'


当然,通常不同的程序使用不同的密钥,并且密钥应该保存在环境变量中,而不是这样直接写。


在进行表单提交操作时,如果我们写错了用户名或者密码,页面往往会给出提示,Flask提供了很方便的操作,即使用Flash消息。


这里做一个简单的用户不存在提示(只是演示Flash用法,用户名密码分开提示是不安全的)

@app.route('/login', methods=['get', 'post'])
def login():
   name = request.form.get('name')
   password = request.form.get('password')
   if name == 'admin' and password == '123':
       session['name'] = name
       return redirect(url_for('login'))
   if name != 'admin':
       flash('no this name')
   return render_template('test1.html', name=session.get('name'))


页面模板中消息提示的代码:

{% for message in get_flashed_messages() %}
   
{{ message  }}
{% endfor %}


现在应该是可以了,这里我本人使用的是python2.7,如果消息提示为中文,可能此时会遇到一个编码错误,信息:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)


原因是读取消息时,python的str默认是ascii编码,和unicode编码冲突,解决方案是加入如下代码:

import sys
reload(sys)
sys.setdefaultencoding('utf8')


大功告成!


以上是关于python实战Flask表单提交的方法的主要内容,如果未能解决你的问题,请参考以下文章

Flask blog实战---上传头像功能

Python---Flask--03--Web表单

简单的vue.js的表单提交数据至flask然后数据库入库,再将表里面的数据展示在网页

Python/FLASK - html 表单返回字符串。如何检查它是不是包含数字?

python实战Flask蓝图使用的方法

如何使用 Ajax 提交 Flask-WTF 表单