用到的一些知识点:Flask-SQLAlchemy、Flask-Login、Flask-WTF、PyMySQL
这里通过一个完整的登录实例来介绍,程序已经成功运行,在未登录时拦截了success.html页面跳转到登录页面,登录成功后才能访问success。
以下是项目的整体结构图:
首先是配置信息,配置了数据库连接等基本的信息,config.py
DEBUG = True
SQLALCHEMY_ECHO = False
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:1011@localhost/rl_project?charset=utf8'
SECRET_KEY = '*xffx93xc8wx13x0e@3xd6x82x0fx84x18xe7xd9|x04exb9(xfdxc3'
common/_init_.py
# config=utf-8
from flask_sqlalchemy import SQLAlchemy
__all__ = ['db']
db = SQLAlchemy()
数据库配置类,common/data.py
# config=utf-8
from sqlalchemy import create_engine
from sqlalchemy.sql import text
from config import SQLALCHEMY_DATABASE_URI, SQLALCHEMY_ECHO
def db_query(sql, settings=None, echo=None):
if settings is None:
settings = SQLALCHEMY_DATABASE_URI
if echo is None:
echo = SQLALCHEMY_ECHO
return create_engine(settings, echo=echo).connect().execute(text(sql)).fetchall()
def db_execute(sql, settings=None, echo=None):
if settings is None:
settings = SQLALCHEMY_DATABASE_URI
if echo is None:
echo = SQLALCHEMY_ECHO
return create_engine(settings, echo=echo).connect().execute(text(sql)).rowcount
SQLALCHEMY_DATABASE_URI用于连接数据的数据库。
SQLALCHEMY_ECHO如果设置成 True,SQLAlchemy 将会记录所有 发到标准输出(stderr)的语句,这对调试很有帮助。
当然,我们在setting中设置了基本的连接数据库信息,启动时加载app = create_app('../config.py'),所以这个类删掉也不会报错。
form/login_form.py
# config=utf-8
from flask_wtf import FlaskForm as Form
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired
class LoginForm(Form):
accountNumber = StringField('accountNumber', validators=[DataRequired('accountNumber is null')])
password = PasswordField('password', validators=[DataRequired('password is null')])
使用Flask-WTF做登录的表单验证,这里简单做了账号密码不为空
如,当我们不填写密码时,点击登录:
model/_init_.py
# config=utf-8
from flask import Flask
from flask_login import LoginManager
from common import db
login_manager = LoginManager()
login_manager.login_view = "user.login"
def create_app(config_filename=None):
app = Flask(__name__)
login_manager.init_app(app)
if config_filename is not None:
app.config.from_pyfile(config_filename)
configure_database(app)
return app
def configure_database(app):
db.init_app(app)