flask-web开发-用户认证代码分析(四)

来源:互联网 发布:wow数据库 编辑:程序博客网 时间:2024/05/19 00:36

  理一下前几篇博文的思路.首先访问一个网页,进入的是首页,代码中是main.index一个简单的欢迎页面.这个页面需要forms.py表单并且渲染html,页面上可以跳转到注册和登录页面,那么就需views.py来提供跳转路径.假设我们已经注册,或者说数据库中已经有很多用户数据,那么对数据的调用,存储和修改都在modles.py.当用户登录时,views.py调用数据库中的用户信息来验证用户和密码是否正确,并给出跳转的首页或者再次回到登录页面,其中涉及了密码散列值加密的验证.接下里这里简单补充一下,用户登出的代码.主要谈一下用户注册,以及用户资料修改的内容.
  用户退出登录,必然在首页要有一个logout的链接,点击后可以删除当前的登录状态,重新设置用户会话,并且无登录跳转到首页.以它为例,说说这种链接怎么实现的.首先在首页html文件中写入跳转链接,这里链接到auth.logout函数,蓝本中必须加的上层文件夹名作为前缀.具体函数在app/auth/views.py中.

from flask.ext.login import logout_user, login_required@auth.route('/logout')  #定义路由@login_required  #只有在登录的前提下才能用logout这个路由函数def logout():  logout_user() #flask-login中的logout_user()函数,可以删除并重设用户会话  flash('You have been logged out.')#显示一行信息  return redirect(url_for('main.index'))#重定向到主页或者叫首页

之前都是假定用户数据已经在数据库了,现在添加新用户,那就要注册表单,渲染,数据库查询判断用户名是否可用,存储新用户的相关数据,邮件验证等代码.validators是扩展中的一个验证函数,它常用的参数有 Required, Length, Email, Regexp, EqualTo,分别是要求不能为空,长度限制,邮箱格式限制,正则表达,相等.但这个函数在提交表单时才生效验证,也会带来不必要的麻烦.比如说你所有的注册信息都写过了,提交时告诉你用户名已被注册,然后

from flask.ext.wtf import Formfrom wtforms import StringField, PasswordField, BooleanField, SubmitFieldfrom wtforms.validators import Required, Length, Email, Regexp, EqualTofrom wtforms import ValidationErrorfrom ..models import Userclass RegistrationForm(Form):#定义表单类  email = StringField('Email', validators=[Required(), Length(1, 64),Email()])#验证是否为邮箱格式  username = StringField('Username', validators=[  Required(), Length(1, 64), Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0,'Usernames must have only letters, ''numbers, dots or underscores')])  password = PasswordField('Password', validators=[  Required(), EqualTo('password2', message='Passwords must match.')])  password2 = PasswordField('Confirm password', validators=[Required()])  submit = SubmitField('Register')  def validate_email(self, field):  if User.query.filter_by(email=field.data).first():   raise ValidationError('Email already registered.')def validate_username(self, field):  if User.query.filter_by(username=field.data).first():   raise ValidationError('Username already in use.')#如果输入的email和username,与数据库中的相同那么则抛出已被注册的错误.

表单好了,那么需要模板渲染表单了,这样在跳转到注册页面才能很好的显示.渲染模板依然用wtf.quick_form(),里面的参数就是要渲染的表单.
auth/register.html

{% extends "base.html" %}{% import "bootstrap/wtf.html" as wtf %}{% block title %}Flasky - Register{% endblock %}{% block page_content %}<div class="page-header">    <h1>Register</h1></div><div class="col-md-4">    {{ wtf.quick_form(form) }}</div>{% endblock %}

按照习惯一般是在登陆界面进行跳转,再次把login.html的代码贴出来,加上一个跳转链接.

{% extends "base.html" %}{% import "bootstrap/wtf.html" as wtf %}{% block title %}Flasky - Login{% endblock %}{% block page_content %}<div class="page-header">    <h1>Login</h1></div><div class="col-md-4">    {{ wtf.quick_form(form) }}    <p>Forgot your password? <a href="{{ url_for('auth.password_reset_request') }}">Click here to reset it</a>.</p>    <p>New user? <a href="{{ url_for('auth.register') }}">Click here to register</a>.</p></div>{% endblock %}

可以看到最后一句url_for地址为注册页面,点击链接发出Get请求后,就会跳转到注册页面.上面还有一句是密码重置的链接,一起放在登陆界面允许用户点击跳转.

原创粉丝点击