1页面解析
1.1定义视图函数
视图函数中,向页面传递数据时,数据之间用逗号隔开,以参数名=值的形式直接传递
@blue.route('/index/')
def index():
content_h2 = '<h2>随便说点啥</h2>'
scores = [89, 85, 99, 100, 98, 79]
return render_template('index.html', a=content_h2, b=scores)
1.2页面解析
在flask中,页面也可以继承自另一个页面;先在一个页面将各个部分分隔(同django一样),然后在新页面中继承{% extends 'base.html' %}。
1.2.1继承
在新页面中,如果需要继承某个块中的内容时,使用{{ super() }},然后在之后写新增加的内容;如果需要包含某个文件中的全部内容时,使用{% include 文件 %}
1.2.2加载静态文件
硬编码:指定定义静态文件的路径
<link rel="stylesheet" href="/static/css/index.css">
使用url_for进行解析导入静态文件
<link rel="stylesheet" href="{{ url_for('static', filename='css/index.css') }}">
flask中单行注释和多行注释都使用{##}
1.2.3页面解析
flask中页面解析有for标签、if标签等标签
{% for i in a %}
<p>{{ i }}</p>
{% else %}
<p> a变量不存在,才解析else中语句 </p>
{% endfor %}
{{ loop.index }} 统计for循环次数,从1开始
{{ loop.index0 }} 统计for循环次数,从0开始
{{ loop.revindex }} 倒序统计for循环次数
{{ loop.first }} 判断循环第一次
{{ loop.last }} 判断循环最后一次
flask中判断相等没有ifequal标签,而是直接用等于进行判断
if标签{% if 条件 == 值%} {% endif %}
1.2.4macro方法
macro方法为宏定义;用于在页面定义函数
无参函数
{% macro say() %} 定义方法say()
<h5>六脉神剑</h5>
{% endmacro %}
{{ say() }} 调用方法say()
有参函数
{% macro create(name,age) %}
<p>用户名为:{{ name }}</p>
{% endmacro %}
{{ create('小花',21) }} 调用
宏定义macro定义的函数放在其他html文件中,要在另外一个html文件中使用时,在要使用的文件中导入: {% from 'functions.html' import say %} 导入文件下的函数;{{ say() }} 调用导入的函数
1.2.5过滤器
{{ a | safe }}
{{ 'python' | upper }}
{{ 'python' | lower | length }}
可以多个过滤器一起使用,过滤时,将按照顺序依次过滤。
2模型定义
定义时间字段用DateTime类型约束,然后用python系统自带的datetime的now方法为字段默认赋值;定义好后,在manage文件中使用db.init_app((app))对其进行初始化
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Student(db.Model):
__tablename__ = 'studnet'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
s_name = db.Column(db.String(5), unique=True, nullable=False)
s_age = db.Column(db.Integer, default=20)
s_gender = db.Column(db.Boolean, default=1)
creat_time = db.Column(db.DateTime, default=datetime.now)
def save(self):
db.session.add(self)
db.session.commit()
def delete(self):
db.session.delete(self)
db.session.commit()
2.1模型迁移
在命令行中执行迁移文件
python manage.py shell 进入交互环境
from app.models import db 导入模型
db.create_all() 迁移
3数据库的使用
3.1数据库的增操作
add(对象);add_all([对象1,对象2...])
使用:db.session.add(对象)
db.session.commit()
@blue.route('/add_stu/', methods=['GET'])
def add_stu():
if request.method == 'GET':
插入数据
stu = Student()
stu.s_name = '莉哥'
stu.s_gender = 0
db.session.add(stu)
db.session.commit()
return '创建学生信息成功'
@blue.route('/add_many_stu/', methods=['GET'])
def add_many_stu():
批量插入学生信息
names = ['张三丰', '燕赤霞', '宁采臣']
stus = []
for name in names:
stu = Student()
stu.s_name = name
stus.append(stu)
# db.session.add(stu)
db.session.add_all(stus)
db.session.commit()
return '批量插入学生信息成功'
3.2数据库的删操作
delete(对象)
使用:db.session.delete(stu)
db.session.commit()
@blue.route('/del_stu/', methods=['GET'])
def del_stu():
if request.method == 'GET':
删除学生
stu = Student.query.filter(Student.s_name=='燕霞').first()
db.session.delete(stu)
db.session.commit()
return '删除数据成功'
3.3数据库的修改操作
db.session.add(stu) # 修改时,这句可加可不加
db.session.commit()
@blue.route('/up_stu/', methods=['GET'])
def up_stu():
if request.method == 'GET':
更新年龄
stu = Student.query.filter(Student.s_name=='张山').first()
stu.s_age = 28
db.session.add(stu) # 修改时,这句可加可不加
db.session.commit()
return '修改学生信息成功'
3.4数据库的查操作
查看有两种方式:filter(模型名.字段==值)和filter_by(字段=值)
stu = Student.query.filter(Student.s_name == '扫地僧')
stu1 = Student.query.filter_by(s_name='扫地僧')
当通过主键查找时,则有三种方式:get(id值)和filter_by和filter三种。get()方法,获取主键所在行的对象信息,能获取对象,则返回。获取不到对象则为空.
stu = Student.query.get(2)
stu = Student.query.filter_by(id=2).first()
stu = Student.query.filter(Student.id == 2).first()
当获取数据库中的第一个对象时,有两种方式:all()用来查询所有的对象,结果为一个列表;first用来查询filter和filter_by结果中的第一个元素对象
stu = Student.query.all()[0]
stu = Student.query.first()
@blue.route('/sel_stu/', methods=['GET'])
def sel_stu():
if request.method == 'GET':
查找
stu1 = Student.query.filter(Student.s_name == '扫地僧')
stu1 = Student.query.filter_by(s_name='扫地僧')
获取第一个对象
stu2 = Student.query.all()[0]
stu2 = Student.query.first()
# get()方法,获取主键所在行的对象信息,能获取对象,则返回。获取不到对象则为空
stu3 = Student.query.get(2)
stu3 = Student.query.filter_by(id=2).first()
stu3= Student.query.filter(Student.id == 2).first()
return '查询成功'
在定义模型类的时候可以对某些方法进行封装成对象方法
如封装下面的方法
def save(self):
db.session.add(self)
db.session.commit()
def delete(self):
db.session.delete(self)
db.session.commit()
增加和修改后就能可以直接使用对象.save()进行添加和提交
删除就可以直接使用对象.delete()进行删除并提交
3.5对查询数据排序
order_by('-id'):表示按照id的降序排列
order_by('id'):表示按照id的升序排列
@blue.route('/sel_stu/', methods=['GET'])
def sel_stu():
if request.method == 'GET':
stus = Student.query.order_by('-id').all() # 降序
stus = Student.query.order_by('id').all() #升序
3.6分页
分页可以使用切片进行分页,也可以使用语句进行分页
offset()跳过几条 limit()查询多少条
@blue.route('/sel_stu/', methods=['GET'])
def sel_stu():
if request.method == 'GET':
page=2
stus = Student.query.all()[(page-1) * 3: page*3]
stus = Student.query.offset(1).limit(3).all()
stus = Student.query.offset((page-1) *3).limit(page*3).all()
上面的page为传入的要查看的页数;
查询结果依次为查看第二页的三条数据
跳过第一条,查看第2条至第4条的三条数据
查询第2页的3条数据
3.7大小于
gt:大于;ge:大于等于;lt:小于;le:小于等于。>,>=,<,<=也可以直接使用
@blue.route('/sel_stu/', methods=['GET'])
def sel_stu():
if request.method == 'GET':
stus = Student.query.filter(Student.s_age.__gt__(25)).all()
stus = Student.query.filter(Student.s_age > 25).all()
3.8模糊查询
contains():包含
startswith():以什么开头
endswith():以什么结束
like():模糊查询 _:匹配一位;%:匹配任意长度的字符串
@blue.route('/sel_stu/', methods=['GET'])
def sel_stu():
if request.method == 'GET':
stus1 = Student.query.filter(Student.s_name.contains('张')).all()
stus2 = Student.query.filter(Student.s_name.startswith('六')).all()
stus3 = Student.query.filter(Student.s_name.endswith('僧')).all()
stus4 = Student.query.filter(Student.s_name.like('__神%')).all()
return '查询成功'