美文网首页
day58-flask模板及模型、数据的操作

day58-flask模板及模型、数据的操作

作者: barriers | 来源:发表于2019-01-23 19:32 被阅读0次

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 '查询成功'

相关文章

  • day58-flask模板及模型、数据的操作

    1页面解析 1.1定义视图函数 视图函数中,向页面传递数据时,数据之间用逗号隔开,以参数名=值的形式直接传递 1....

  • 5.django视图函数

    一、首页 1.数据操作(数据模型) 2.模板操作 模板操作离不开两个函数 很明显后一个函数更简洁,少一个参数。co...

  • Laravel数据库操作之-Eloquent ORM

    数据库操作之-Eloquent ORM Eloquent ORM简介、模型的建立及查询数据 Eloquent OR...

  • FreeMarker页面静态化

    1、页面静态化 1.1 页面静态化 模板+数据模型=输出,页面静态化需要准备数据模型和模板,先知道数据模型的结构才...

  • Django视图层的扩展

    什么是视图 视图是通过对模型的操作,从模型中取出数据并返回给模板的Python函数。 视图的作用 视图接受web请...

  • Laravel框架基础学习

    1.路由设置 路由和控制器绑定。 视图 - 使用模板 Model - 模型 连接数据库 数据库操作 - 查询构造器...

  • SpringMVC 概念

    MVC设计模式 模型层(Mode):即对数据的存储及操作; 控制层(Controller):控制器作用于模型和视图...

  • Thymeleaf的集成(入门)

    模板 + 数据模型 进行合并 常见的模板引擎 JSP、Velocity、Freemarker、Thymeleaf...

  • Django入门实践(二)

    后台数据 数据模型只有图书、英雄: 模板templates 在templates/booktest中添加模板文件b...

  • 数据代理、el和data的两种写法、MVVM

    MVVM模型 1、M:模型(model):data中的数据 2、V:视图(View):模板代码 ...

网友评论

      本文标题:day58-flask模板及模型、数据的操作

      本文链接:https://www.haomeiwen.com/subject/mulsjqtx.html