from datetime import datetime
import time
import pymysql
# 关于数据库操作的文件
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from sqlalchemy import desc
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:westos@localhost/User'
# SQLAlchemy 将会追踪对象的修改并且发送信号。
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
app.config['SECRET_KEY'] = 'westos'
boostrap = Bootstrap(app)
# 默认情况下创建一个表, 表名为类名; 如果指定了__tablename__, 那么表名为你指定的名称;
class Student(db.Model):
__tablename__ = "students"
# sid: 表头的一列, db.SMALLINT代表存储的数据类型, primary_key(主键), 数据是唯一的;
sid = db.Column(db.SMALLINT, primary_key=True)
sname = db.Column(db.String(50))
sage = db.Column(db.SMALLINT)
# 实现一对多(Role(1): User(n))的关系
# - 多的一端写外键
# - 少的一端写反向引用
class User(db.Model):
# autoincrement=True自增
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
# unique=True, name的值不能重复, 是唯一的;
name = db.Column(db.String(50), unique=True)
# 长度为100, 是因为网站密码一般会加密;
passwd = db.Column(db.String(100))
# 指定用户注册/创建的时间,
# default, 指定默认值, datetime.now()获取当前时间;
# 用户注册时间为当前时间;
add_time = db.Column(db.DateTime, default=datetime.now())
gender = db.Column(db.Boolean, default=True)
# 用户的角色id,不能随便写, 必须要关联其他的数据库表(role) --- 外键
role_id = db.Column(db.INTEGER, db.ForeignKey('role.id'))
def __repr__(self):
return '' %(self.name)
# 用户角色表
class Role(db.Model):
# autoincrement=True自增
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
# unique=True, name的值不能重复, 是唯一的;
name = db.Column(db.String(50), unique=True)
# Role表中的users属性与User表关联, 并且User这个表中可以由role这个对象属性;
users = db.relationship('User',backref='role')
# 对象的字符串显示, 方便查询时使用
def __repr__(self):
return "" %(self.name)
# 1. 创建定义的表结构
# db.create_all()
# 2. 删除定义的表结构
# db.drop_all()
# 3. *****************往表中插入数据;***************************
# 向数据库插入数据分为三个步骤:
# 创建Python对象
# 把它添加到会话
# 提交会话
#
# # 1). 创建用户角色;
role1 = Role(name="超级会员")
role2 = Role(name="会员")
db.session.add(role1)
db.session.add(role2)
db.session.commit()
for i in range(50):
u = User(name='westos%s' %(i), passwd='westos', role_id=1)
db.session.add(u)
db.session.commit()
for i in range(50):
u = User(name='redhat%s' % (i), passwd='redhat', role_id=2)
db.session.add(u)
db.session.commit()
# 查询所有数据
print(Role.query.all())
print(User.query.all())
# 根据条件查询数据(筛选数据(filter_by)); slect * from table where xxx=xxx;
print(User.query.filter_by(role_id=1).all())
print(User.query.filter_by(role_id=2).all())
# 通过这种方式可以查看原生的sql语句
user = User.query.filter(User.role_id==1)
print(user)
# 对于查询的信息进行显示限制;
users = User.query.filter_by(role_id=1).limit(5).all()
print(users, len(users), end='\n')
# 对于查询的信息进行排序输出(默认情况由小到大进行排序), 如果想要由大到小: desc(User.add_time);
users = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).all()
print(users)
# 多个过滤函数加一个显示函数:
users = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).limit(5).all()
print(users)
# # offset指定偏移量, limit 指定输出数量, 类似于切片操作;
# # 1 2 3 4 5 6 7 8 9
# # limit(5): 1 2 3 4 5
# # limit(5).offset(2): 3 4 5 6 7
users = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).limit(5).offset(2).all()
print(users)
# 切片操作li[2:7]
users = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).slice(2,7).all()
print(users)
count = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).slice(2, 7).count()
print(count)
# 分页:第一个参数代表显示第几页的数据, 第二个参数代表每页显示多少条数据;
users = User.query.paginate(1, 5)
print(users.items)
users = User.query.paginate(2, 5)
print(users.items)
u = User.query.filter_by(name='westos0').first()
print(u.name, u.passwd, u.add_time, u.role_id, u.role, u.role.id, u.role.name)
# 对于找到的内容进行更新;
u = User.query.filter_by(name='westos0').first()
print(u)
u.passwd = '123456'
db.session.add(u)
db.session.commit()
要想在程序中集成Bootstrap,显然要对模板做所有必要的改动。不过,更简单的方法是使用一个名为Flask-Bootstrap 的Flask 扩展,简化集成的过程。Flask-Bootstrap 使用pip安装:
pip install flask_bootstrap
from flask_bootstrap import Bootstrap
app = Flask(__name__)
bootstrap = Bootstrap(app)
初始化Flask-Bootstrap 之后,就可以在程序中使用一个包含所有Bootstrap 文件的基模板。这个模板利用Jinja2 的模板继承机制,让程序扩展一个具有基本页面结构的基模板,其中就有用来引入Bootstrap 的元素。
{%extends "bootstrap/base.html"%}
{%block title %}Flask{% endblock %}
这两个块分别表示页面中的导航条和主体内容。
在这个模板中,navbar 块使用Bootstrap 组件定义了一个简单的导航条。
content 块中有个
参考链接: https://pythonhosted.org/Flask-Bootstrap/basic-usage.html#available-blocks
块名 说明
doc 整个html文档
html_attribs html标签属性
html html标签中的内容
head head标签中的内容
title title标签中的内容
metas 一组meta标签
styles 层叠样式表定义
body_attribs body标签的属性
body body标签中的内容
navbar 用户定义的导航条
content 用户定义的页面内容
scripts 文档底部的JavaScript 声明
上表中的很多块都是Flask-Bootstrap 自用的,如果直接重定义可能会导致一些问题。例如,Bootstrap 所需的文件在styles 和scripts 块中声明。如果程序需要向已经有内容的块中添加新内容,必须使用Jinja2 提供的super() 函数。例如,如果要在衍生模板中添加新的JavaScript 文件,需要这么定义scripts 块:
{% block scripts %}
{{ super() }}
{% endblock %}