1模版语法
1.1 模版语法主要分为两种: 变量和标签
模版中的变量 : {{ var }}
模版中的标签:{% tag %}
1.2结构标签
Block 挖坑
{% block xxx %}
{% endblock %}
extends 继承
{% extends 'xxx.html' %}
继承后保留块中的内容
{{ super() }}
macro 宏(函数)
{% macro hello(name) %}
{{ name }}
{% endmacro %}
宏定义 可以在模版中定义函数,在其他地方调用
导入宏
{% from 'xxx.html' import xxx %}
1.3循环
{% for item in cols %}
aa
{% else %}
bb
{% endfor %}
也可以获取循环消息的loop
loop.first
loop.last
loop.index 当前迭代的次数 从1开始
loop.revindex 到循环结束需要迭代的次数 从1开始
1.4过滤器
语法:
{{ 变量|过滤器|过滤器 }}
capitalize 首字母大写
lower 小写
upper 大写
safe 将样式渲染到页面中
2. 静态文件信息配置
第一种方式:
第二种方式:
3.数据库的链接
3.1 安装
pip install flask-sqlalchemy
pip install pymysql
3.2定义模型
使用SQLALchemy的对象去创建字段
_tablename_ 指定创建的数据库的名称
创建models.py文件
from flask_sqlalchemy import SQLALchemy
db = SQLALchemy()
class Student(db.Model):
id = db.Column(db.Integer,primary_key = True,autoincrement=True)
s_name = db.Column(db.String(16),unique=True)
s_age = db.Column(db.Integer,default=1)
__tablename__ = 'student'
Integer 表示创建的字段类型为整形
Primary_key 表示为主键
String 表示为字符串
Unique 表示唯一
autoincrement 表示自增
3.3 创建表
在views.py中引入db
from app.models import db
@blue.route('/create_db/')
def create_db():
db.create_all()
return '删除成功'
@blue.route('/drop_db/')
def drop_db():
db.drop_all()
return '删除成功'
db.create_all() 表示创建定义模型中对应到数据库中的表
db.drop_all() 表示删除数据库中的所有的表
3.4初始化SQLALchemy
在文件的根目录下flask.py文件中使用SQLALchemy去整合一个或者多个Flask应用
方法一:
from app.models import db
db.init_app(app)
方法二:
from APP.models import db
def create_app():
app = Flask(__name__)
db.init_app(app)
return app
3.5配置数据库的访问地址
在根目录下的flask1.py文件中如下配置:
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@localhost:3306/HelloFlask"
HelloFlask 为数据库名称
3.6对学生数据进行CRUD操作
语法: 类名.query.xxx
获取查询集:all() filter(类名.属性名==xxx) filter_by(属性名=xxx)
3.6.1添加数据
def create_stu():
stu = Student()
stu.s_name = '小红'
stu.s_age = 20
db.session.add()
db.session.commit()
return '添加成功'
3.6.2 获取全部学生信息
def get_stu():
students = Students.query.all()
return render_template('xx.html',students=students)
3.6.3 获取某个学生的信息
写法1:
the_stu = Students.query.filter(Students.s_name=='小花')
写法2:
the_stu = Student.query.filter_by(s_name='小花')
写法3:
sql = 'select * from student where s_name=小花 '
student =db.session.execute(sql)
3.6.4 修改学生信息
写法1:
students = Student.query.filter_by(s_id=3).first()
students.s_name = '小黑'
db.session.commit()
写法2:
Student.query.filter_by(s_id=3).update({'s_name':'小黑'})
db.session.commit()
3.6.5删除某个学生的信息
stu = Students.query.filter_by(s_id=2).first()
db.session.delete(stu)
db.session.commit()
Ps: 在数据库的增删改中,如果不在最后 db.session.commit() 则数据库中的数据不会更新,只会更新本地缓存的数据。
4.flask中的密码加密
方法1 使用Werkzeug
Werkzeug
中的security
模块可以很方便的实现哈希值的计算,只需要两个函数,分别用于用户注册和用户验证阶段
generate_password_hash(password,method=pbkdf2:sha1,salt_length=8)
:这个函数将原始密码作为输入,以字符串形式输出密码的哈希值。method和salt_length的默认值能满足大多数需求,这个用于注册,传入密码
check_password_hash(hash,password)
:这个函数参数是哈希值和用户输入的密码。返回值为True表示密码,用于用户验证,传入用户输入的密码和哈希值
5.关联关系
5.1一对多建立模型
学生模型:
class Student(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
s_name = db.Column(db.String(20),unique=True,nullable=False)
s_age = db.Column(db.Integer,default=1)
s_grade = db.Column(db.Integer,db.ForeignKey('grade.g_id'),nullable=True)
__tablename__ = 'student'
班级模型:
class Grade(db.Model):
g_id = db.Column(db.Integer,primary_key=True,autoincrement=True)
g_name = db.Column(db.String(20),unique=True)
g_desc = db.Column(db.String(100),nullable=True)
g_time = db.Column(db.Date,default=datetime.now)
students = db.relationship('Student',backref='stu',lazy=True)
__tablename__ = 'grade'
5.2 查询
-
通过班级查询学生信息
查询班级id为1的班级的学生信息
students = Grade.query.get(id).students
-
通过学生信息查询班级信息
查询id为1的学生的班级信息
grade = Student.query.get(1).stu
表的外间由db.ForeignKey指定,传入的参数是表的字段。db.relationship 它声明的字段不作为表字段,第一个参数是关联的类的名字,backref是一个反向身份代理,相当于在Student类中添加了stu属性。可以直接在Students的实例.stu 就可以得到相对应的grade对象。 一般来说relationship写在 一对多的一这一边
5.3数据库迁移
5.3.1 安装migrate
pip install flask-migrate
5.3.2配置使用migrate
-
初始化,使用app和db进行migrate对象的初始化
from flask-migrate import Migrate #绑定app和数据库 Migrate(app=app,db)
-
在Manager()对象上添加迁移指令
from flask_migrate import Migrate,MigrateCommand app = Flask(__name__) manage = Manage(app=app) manage.add_command('db',MigrateCommand)
-
终端操作
python manage.py db init 初始化 只需要在第一次时调用 python manage.py db migrate 生成迁移文件 python manage.py db upgrade 执行迁移文件中的升级