flask 框架中使用flask-wtf的问题

关于flask-wtf的应用场景

  1. flask-wtf的使用

    说到flash的使用很自然的就会想到在flask框架中,由于并没有像Django这种重量级框架,在各种方面做了较为完善的功能,比如admin"爸爸",很多需要通过使用第三方库进行实现,例如在进行数据校验时,使用了flask-wtf package,用来获取前端的表单数据,简易具体代码如下:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo
class RegisterForm(FlaskForm):
    # 说明标签,检验器,保证数据必须填写并且不能为空
    user_name = StringField(label="用户名", validators=[DataRequired("用户名不能为空")])
    # DataRequired中展示的是如果出现错误后展现的错误信息.在前段中将会产生DataRequired内容,可以通过遍历form.user_name.errors进行逐条查看
    password = PasswordField(label="密码", validators=[DataRequired("密码不能为空")])
    password2 = PasswordField(label="确认密码", validators=[DataRequired("确认密码不能为空"), EqualTo("password","两次密码不一致")])
    submit = SubmitField(label="提交")

如果使用过Django你一定会发现,啊呖呖,为什么这么像Django中的模型类,长得很像,其中label表示在前段中显示的名称,比如在前段中

form.user_name.label

(这里居然开了禁止转义,这…这句会有p标签)就会显示出"用户名".
第二个参数,validators是一个认证器,validators[DataRequired(str)],str表示当数据校验不合格时会抛出什么,Datarequired参数这里选择你填入的数据是否是必填的,大多数情况下,(。・∀・)ノ゙
经常还会使用到EqualTo方法用来对数据进行比对,比如在验证重复输入密码时,第一次输入的密码和第二次密码是否相同,对于EqualTo来说,第一个参数需要以str类型传入需要比对的数据,第二个参数则是比对不成功时前端抛出什么

前端方法简化

2. 注意如果使用了flask的form方法,那么在前端中可以简化代码,简化格式如下

  8 <form method="post">
  9     {{ form.csrf_token }}
 10     {{ form.user_name.label }}
 11     <p>{{ form.user_name }}</p>
 12     {% for msg in form.user_name.errors %}
 13         <p> {{ msg }}</p>
 14     {% endfor %}
 15     {{ form.user_name.label }}
 16     <p>{{ form.password }}</p>
 17     {% for msg in form.password.errors %}
 18         <p> {{ msg }}</p>
 19     {% endfor %}
 20     {{ form.password2.label }}
 21     <p>{{ form.password2 }}</p>
 22     {% for msg in form.password2.errors %}
 23         <p> {{ msg }}</p>
 24         {% endfor %}
 25     {{ form.submit }}
 26 </form>
                                                            

可能出现的问题

3. 为了实现前后端交互,因为大家都是python框架,那就用Django进行对比好了
由于Django是基于ORM的MVT框架,因此视图函数是用来操作数据库和调用前端template,传递接受前端数据中必须使用的,在flask中为了保证框架的轻量化设计,在框架设计之处,我们使用最简单的框架,不导入第三方package的情况下,通常只进行V和T的交互,也就是Views和template的交互,…略去一些,直接(ˉ▽ ̄~) 切入正题,为了使用flask-wtf的数据进行检验,(这里前端检验一遍,后端检验一遍,这个是最基本的要求啦==),直接上代码:

@app.route("/register", methods=["GET", "POST"])
 31 def register():
 32     form = RegisterForm()
 33     # 如果form中的数据完全满足所有的验证器,则返回真,否则返回为假,这里传入数>    据后进行跳转
 34     # 验证合格
 35     if form.validate_on_submit():
 36         # 获取数据
 37         uname = form.user_name.data
 38         #
 39         pwd = form.password.data
 40         pwd2 = form.password2.data
 41         print(uname, pwd, pwd2)
 42         session["user_name"] = uname
 43         return redirect(url_for("index"))
 44     return render_template("register.html", form=form)

具体参数如下,首先需要调用之前的表单认证类,这个类中有一个validate_on_submit的放方法,这表示如果数据获取不完整后者数据校验不合格,比如没填数据,或者密码前后两次不一致,等,False,只用也就是说,只用这一个方法,就会省去很多费时的if判断语句.不过只是这样你如果运行一定会爆出类似这样的错误**(这里划重点)**因为处理的方式都相同

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

这里是需要设置secret_key,使用配置

app.config["SECRET_KEY"] = "自己随意写,如果不是在生产环境",这里app是Flask()方法指向的

这里需要解释一下,因为flask直接将session扔进了cookie里,通常是不会这么做的,不过flask这么做了,这也就是受flask需要对这段数据进行加密,你穿的数据就是用来加密的秘钥,另外为了防止csrf攻击同样需要secret_key,同时,在表单中加上{{form.csrf_token}}这里和Django类似了,在Django的模板中也会使用到 csrf_token进行防止csrf攻击.总秘钥什么的先写上就行了,这样就不会这样宕着,(⊙o⊙),通过以上就可以实现,一个简单的登录操作.
不过因为没有重定向方法,所以你大概只能原地转圈圈=-=.

作者码子不容易,如需转载或者引用,请注明出处,米娜桑,祝君武运昌隆.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
用户登录模块是Web应用程序非常基础的模块之一。在Flask框架,实现用户登录功能通常需要借助Flask-WTF扩展和Flask-Login扩展。 Flask-WTF扩展提供了表单验证和CSRF保护等功能,而Flask-Login扩展则提供了用户认证和管理功能。 下面是用户登录模块的详细设计: 1. 创建Flask应用程序对象 ```python from flask import Flask app = Flask(__name__) ``` 2. 配置Flask应用程序对象 ```python app.config['SECRET_KEY'] = 'secret_key' app.config['WTF_CSRF_SECRET_KEY'] = 'csrf_secret_key' ``` SECRET_KEY和WTF_CSRF_SECRET_KEY是用于加密和CSRF保护的密钥。可以自行生成,也可以使用随机字符串生成函数。 3. 创建用户登录表单 ```python from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Length class LoginForm(FlaskForm): username = StringField('Username', validators=[DataRequired(), Length(min=6, max=20)]) password = PasswordField('Password', validators=[DataRequired(), Length(min=6, max=20)]) submit = SubmitField('Login') ``` 用户登录表单包含用户名和密码两个字段以及一个提交按钮。使用wtforms库,可以方便地创建表单和验证表单数据。 4. 创建用户模型 ```python from flask_login import UserMixin class User(UserMixin): def __init__(self, id, username, password): self.id = id self.username = username self.password = password def get_id(self): return str(self.id) ``` 用户模型需要继承Flask-Login扩展的UserMixin类,并实现get_id方法。get_id方法返回一个字符串类型的用户ID,用于Flask-Login扩展的用户认证和管理。 5. 实现用户认证回调函数 ```python from werkzeug.security import check_password_hash users = [ User(1, 'user1', 'password1'), User(2, 'user2', 'password2') ] def authenticate(username, password): for user in users: if user.username == username and check_password_hash(user.password, password): return user def load_user(user_id): for user in users: if user.id == int(user_id): return user ``` authenticate函数用于验证用户身份,如果验证成功返回用户对象,否则返回None。load_user函数用于根据用户ID返回用户对象。 6. 配置Flask-Login扩展 ```python from flask_login import LoginManager login_manager = LoginManager(app) login_manager.login_view = 'login' login_manager.login_message = 'Please login to access this page.' @login_manager.user_loader def load_user(user_id): return load_user(user_id) ``` 配置Flask-Login扩展需要传入Flask应用程序对象。login_view属性设置登录页面的路由名称,login_message属性设置登录提示信息。@login_manager.user_loader装饰器用于指定load_user函数。 7. 实现用户登录路由 ```python from flask import render_template, redirect, url_for, flash, request from flask_login import login_user, logout_user, current_user @app.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): user = authenticate(form.username.data, form.password.data) if user is not None: login_user(user) next = request.args.get('next') return redirect(next or url_for('index')) else: flash('Invalid username or password.') return render_template('login.html', form=form) ``` 用户登录路由处理函数使用@login_required装饰器保护,只有登录用户才能访问。使用authenticate函数验证用户身份,如果验证成功则调用login_user函数实现用户登录。如果登录成功,则跳转到原始请求页面或首页,否则显示错误信息。 8. 实现用户注销路由 ```python @app.route('/logout') @login_required def logout(): logout_user() return redirect(url_for('index')) ``` 用户注销路由处理函数使用@login_required装饰器保护,只有登录用户才能访问。使用logout_user函数实现用户注销。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值