学习随笔 Flask-Login

pip list       回车就可以获得我们电脑上安装过的包
ctrl+alt+I  自动缩进

Flask-WTF定义表单

from flask_wtf import Form
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import Required, Length, Email, Regexp, EqualTo
from wtforms import ValidationError
from ..models import User

class LoginForm(Form):
    email = StringField('Email', validators=[Required(), Length(1,64), Email()])
    password = PasswordField('Password', validators=[Required()])
    remember_me = BooleanField('Keep me logged in')
    submit = SubmitField('Log in')

class RegistrationForm(Form):
    email = StringField('Email', validators=[Required(), Length(1, 64), Email()])
    username = StringField('Usernam', 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):   # 自定义验证器 -- namefield验证器
        if User.query.filter_by(email=field.data).first():
            raise ValidationError('Email already registered.')

    def validate_user(self, field):
        if User.query.filter_by(username=field.data).first():
            raise ValidationError('Usernam already in use.')

表单Flask-WTF验证器补充:https://www.cnblogs.com/sysnap/p/6568397.html

使用Flask-Login实现用户登陆注册模块

from flask import render_template, redirect, request, url_for, flash
from flask_login import login_user, logout_user, login_required
from . import auth
from .. import db
from ..models import User
from .forms import LoginForm, RegistrationForm

@auth.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()
        if user is not None and user.verify_password(form.password.data):
            login_user(user, form.remember_me.data)   # 在用户会话中把用户标记为已登陆
            # 用户访问未授权的URL时会显示登陆表单,Flask-Login会把原地址保存在查询字符串的next参数中,这个参数可以从request.args字典中读取
            return redirect(request.args.get(next) or url_for('main.index'))
        flash('Invaliid username or password.')
    return render_template('auth/login.html', form=form)

@auth.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        user = User(email=form.email.data,
                    username=form.username.data,
                    password=form.password.data)
        db.session.add(user)
        flash('You can now login.')
        return redirect(url_for('auth.login'))
    return render_template('auth/register.html', form=form)


@auth.route('/logout')
@login_required
def logout():
    logout_user()
    flash('You have been logged out.')
    return redirect(url_for('main.index'))
关于 使用工厂化函数构建项目,flask_sqlalchemy创建不了数据库的问题,解决方法如下:https://blog.csdn.net/qq850482461/article/details/75287254
#!/usr/bin/env python
import os
from app import create_app, db
from app.models import *   #一定要引入模型类否则可能出现无法使用db.create_all()
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand

app = create_app('default')
manager = Manager(app)
migrate = Migrate(app, db)

def make_sell_context():
    return dict(app=app, db=db, User=User, Role=Role)
manager.add_command('shell', Shell(make_context=make_sell_context))
manager.add_command('db', MigrateCommand)

@manager.command  # 创建初始数据库脚本
def create_db():
    db.create_all()

if __name__ == '__main__':
    manager.run()

猜你喜欢

转载自blog.csdn.net/hongchen37/article/details/80268145