首先是数据库表设计models.py
from . import db
import datetime
# 用户表
class Users(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), index=True, nullable=False)
email = db.Column(db.String(32), unique=True, nullable=False)
password = db.Column(db.String(64), nullable=False)
ctime = db.Column(db.DateTime, default=datetime.datetime.now)
# 关联roles表,一对多关系
role_id = db.Column(db.Integer, db.ForeignKey("roles.id"))
# relationship,联查时候用到,详细见《flask插件之flask_sqlalchemy使用》中有介绍
role = db.relationship("Roles", backref='user')
__table_args__ = (
# 联合唯一
db.UniqueConstraint('id', 'name', 'email', name='uix_id_name_email'),
# 联合索引
db.Index('ix_id_name_eamil', 'name', 'email'),
)
def __repr__(self):
return self.name
class Roles(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), index=True, nullable=True)
# 与生成表结构无关,仅用于查询方便
permission = db.relationship('Permission', secondary='roles2permission', backref='role')
def __repr__(self):
return self.name
class Permission(db.Model):
__tablename__ = 'permission'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(32), unique=True, nullable=False)
url = db.Column(db.String(128))
menu_id = db.Column(db.Integer, db.ForeignKey("menus.id"))
menu = db.relationship("Menus", backref='permission')
def __repr__(self):
return self.name
# roles和permisson多对多关系,flask中没有ManyToMany用法,多对多需要这么创建
class Roles2Permisson(db.Model):
__tablename__ = 'roles2permission'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
permission_id = db.Column(db.Integer, db.ForeignKey('permission.id'))
class Menus(db.Model):
__tablename__ = "menus"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(32), unique=True)
# 关联menus,关联自己,用于生成子菜单
parent = db.Column(db.Integer, db.ForeignKey("menus.id"))
def __repr__(self):
return self.name
login视图函数:
from flask import Blueprint, session, redirect, url_for, render_template, request
from flask.views import MethodView
import hashlib
login = Blueprint('login', __name__, url_prefix='/login')
from .middlewares import *
from ..models import *
from ..