day4

1.配置views文件 apps/views

from flask import Blueprint, render_template, redirect, \
    url_for, request

from app.models import db

blue = Blueprint('app', __name__)


@blue.route('/index/', methods=['GET'])
def index():
    if request.method == 'GET':
        return render_template('back/index.html')

# 传入数据并渲染index页面
@blue.route('/index1/', methods=['GET'])
def index1():
    if request.method == 'GET':
        data = ['Python', 'Vue', 'Linux', 'Celery', 'RabbitMQ',
                'MySQL', 'MongoDB', 'Redis', 'Scrapy', 'Urllib',
                'Requests', 'Selenium', 'Django',
                'Flask', 'Tornado', 'Sanic']
        content_h2 = '<h2>H2标签</h2>'
        return render_template('back/index1.html',
                               data=data,
                               content_h2=content_h2)
        # return render_template('web/index.html')

# 创建学生对象表
@blue.route('/create_db/', methods=['GET'])
def create_db():
    # 创建所有模型对应的表
    db.create_all()
    # 删除所有模型对应的表
    # db.drop_all()
    return '创建表成功'

2.模型文件 app/models

from datetime import datetime

from flask_sqlalchemy import SQLAlchemy

# 生成对象,ORM
db = SQLAlchemy()

1.一对多模型建立
class Grade(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    g_name = db.Column(db.String(50))
    stus = db.relationship('Student', backref='g')
# 建立外键联系,设置返回g,提供反向引用声明
    __tablename__ = 'grade'

2.多对多模型建立
# 中间表course_student
# 两个外键列c_id,s_id
c_s = db.Table('c_s',
   db.Column('c_id', db.Integer, db.ForeignKey('course.id')),
   db.Column('s_id', db.Integer, db.ForeignKey('stu.id'))
   )


class Course(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    c_name = db.Column(db.String(50), unique=True)
    # 多对多的关联关系可以写在任何一方,反向引用c当使用course查询时.stus,当使用student查询时.c
    stus = db.relationship('Student', secondary=c_s, backref='c')

    __tablename__ = 'course'


# 定义模型


class Student(db.Model):
    # 自增的int类型的主键,长度11位
    id = db.Column(db.Integer, primary_key=True)
    # 长度50,且唯一,且不能为空的s_name字段
    s_name = db.Column(db.String(50), unique=True, nullable=False)
    # 默认为20的s_age字段
    s_age = db.Column(db.Integer, default=20)
    # 默认为当前时间的create_time字段
    # django中默认创建时间: auto_now_add=True,
    #            修改时间:auto_now=True
    create_time = db.Column(db.DateTime, default=datetime.now())

    # 外键字段
    s_g = db.Column(db.Integer, db.ForeignKey('grade.id'), nullable=True)

    # 定义表名
    __tablename__ = 'stu'


    # def __str__(self):
    def __repr__(self):
        return '<Student ({})>'.format(self.id)

    def save(self):
        # 创建 、修改
        db.session.add(self)
        db.session.commit()

    # def __init__(self, name):
    #
    #     self.s_name=name
    #
    # def __new__(cls, *args, **kwargs):
    #
    #     pass
    #
    # def __del__(self):
    #     # 析构函数,当对象引用计数为0时,被回收
    #     pass
  1. app/stu_views 学生视图函数文件
stu_blue = Blueprint('stu', __name__)
1.创建蓝图

2.注册路由
@stu_blue.route('/stu/', methods=['GET', 'POST', 'DELETE', 'PATCH'])
def stu():
    if request.method == 'GET':
    3.# 名字查询
        stu = Student.query.filter(Student.s_name == 'vincent').first()
        print(stu)
        # Django的ORM中,get(条件),如果条件不成立结果报错,如果条件对应多个结果则报错
        # Flask中,get(主键值),查询的是主键所对应的数据,查询不到返回None
        4. get根据主键查询
        stu = Student.query.get(20)
        print(stu)
        5. # 排序
        # order_by()
        # 升序order_by(Student.id)
        # 降序order_by(-Student.id)
        stus = Student.query.order_by(-Student.id).all()
        print(stus)
        6.分页
        # offset、limit
        # offset偏移:跳过几个元素
        # limit: 截图几个元素
        # django中Paginator()用于分页
        page = 3
        stus = Student.query.offset((page - 1)*2).limit(2).all()
        print(stus)
        
        paginate(page, per_page, error_out=True)
        # page 当前页数
        # per_page 每页显示的条数
        stus = Student.query.paginate(1, 2)
        print(stus.items)
        # 是否有上一页: flask中has_prev  django中has_previous
        # 是否有下一页: flask中has_next  django中has_next
        # 下一页角码: flask中next_num    django中next_page_number
        # 上一页角码: flask中prev_num    django中previous_page_number
        
        7.# 模糊查询,icontains,and_、not_、or_,startswith, endswith, like
        # contains  like '%三%'
        stus = Student.query.filter(Student.s_name.contains('三')).all()
        stus = Student.query.filter(Student.s_name.like('%三%')).all()
        print(stus)
        # startswith like '三%'
        stus = Student.query.filter(Student.s_name.startswith('三')).all()
        stus = Student.query.filter(Student.s_name.like('三%')).all()
        print(stus)
        # endswith like '%三'

        stus = Student.query.filter(Student.s_name.endswith('三')).all()
        stus = Student.query.filter(Student.s_name.like('%三')).all()
        print(stus)

        # like % _
        stus = Student.query.filter(Student.s_name.like('_三')).all()
        print(stus)

        # 与或非,django: 且
        # filter(条件1,条件2,条件3) filter(Q(条件1),Q(条件2),Q(条件3))
        # django :或
        # filter(Q(条件1) | Q(条件2) | Q(条件3))
        # django :非
        # filter(~Q(条件1),Q(条件2),Q(条件3))

        8.# 与或非,flask,and_,or_,not_
        # 且操作, and_
        stu = Student.query.filter(Student.s_name.like('%三%'))\
            .filter(Student.s_age == 20).all()
        stu = Student.query.filter(Student.s_name.like('%三%'),
                                   Student.s_age == 20).all()


        stu = Student.query.filter(and_(Student.s_name.like('%三%'),
                                   Student.s_age == 20)).all()
        # 或操作,or_

        stus = Student.query.filter(or_(Student.s_name.like('%三%'),
                                   Student.s_age == 20)).all()
        # 非操作,not_


        stus = Student.query.filter(not_(Student.s_name.like('%三%')),
                                    Student.s_age == 20).all()

        print(stus)

        # django中: gt gte lt lte
        
        9.# flask中: gt ge lt le > >= < <= ==
        stus = Student.query.filter(Student.s_age.__gt__(20)).all()
        stus = Student.query.filter(Student.s_age >= 20).all()
        print(stus)

        10.# in_  notin_

        stus = Student.query.filter(Student.id.in_([1, 2, 3])).all()

        stus = Student.query.filter(Student.id.notin_([1, 2, 3])).all()
        print(stus)

        return '查询学生信息成功'

11.# 增操作
    if request.method == 'POST':
        # 创建一个学生对象信息
        # 创建学生信息
        # student = Student()
        # student.s_name = 'admin'
        # # add()方法只是在准备向数据库中插入数据
        # db.session.add(student)
        # # commit()事务提交,将数据插入到数据库中
        # db.session.commit()

        # 创建多个学生对象信息
        names = ['张三', 'coco', 'vincent', '李四']
        stus = []
        for name in names:
            student = Student()
            student.s_name = name
            stus.append(student)
        db.session.add_all(stus)
        db.session.commit()
        return '创建学生信息成功'

12.#删除对象
    if request.method == 'DELETE':
        # Django中all()查询结果为QuerySet,取第一个元素all().first()
        # Flask中all()查询结果为list,取第一个元素all()[0]
        stus = Student.query.filter(Student.s_name == 'coco').all()
        stu = Student.query.filter(Student.s_name == 'coco').first()
        print(stu)
        stu = Student.query.filter_by(s_name='coco').first()
        print(stu)
        # delete()删除,接收删除的对象
        db.session.delete(stu)
        db.session.commit()
        return '删除学生信息成功'


13.# 修改数据也使用add
    if request.method == 'PATCH':
        stu = Student.query.filter(Student.s_name == '李四').first()
        stu.s_age = 33
        stu.s_name = '小李'
        # 修改数据,add(修改对象)这句话可写可不写
        # db.session.add(stu)
        # db.session.commit()
        stu.save()
        return '修改学生信息成功'


14. # 修改数据
@stu_blue.route('/stu_grade/', methods=['GET'])
def stu_grade():
    # 将id为1,2,3的学生分配到微电子学
    stus = Student.query.filter(Student.id.in_([1,2,3])).all()
    for stu in stus:
        stu.s_g = 2
        stu.save()
    return '学生分配班级成功'


15. # 一对多的查询使用
@stu_blue.route('/sel_stu_grade/', methods=['GET'])
def sel_stu_grade():
    # 通过班级查询学生内容,一查多
    grade = Grade.query.filter(Grade.g_name == '微电子学').first()
    stus = grade.stus
    # 通过学生查询班级,多查一
    stu = Student.query.filter(Student.s_name == 'admin').first()
    grade = stu.g
    return '查询成功'

16. # 
@stu_blue.route('/sel_stu_course/', methods=['GET'])
def sel_stu_course():
    # 向中间表加信息
    cou1 = Course.query.filter(Course.c_name == 'VHDL').first()
    cou2 = Course.query.filter(Course.c_name == 'JAVA').first()
    stus = Student.query.filter(Student.id.in_([1,2])).all()
    # 获取课程所关联的学生信息
    # print(cou1.stus)
    # for stu in stus:
    #     cou1.stus.append(stu)
    # print(cou1.stus)
    # 向中间表加数据,append,向中间表删除数据,remove
    for stu in stus:
        # stu.c.append(cou2)
        stu.c.remove(cou2)
    db.session.commit()
    return '学生和课程'

4.templates/index.html 模板文件

{% block css %}
    <!-- super()相当于将父模板中坑css中已定义的内容添加过来,如果直接继承父模板中的坑,将会覆盖坑中方法,所以需要使用
     super()调用父模板方法并继续重写-->
    {{ super() }} 
    <!-- 感叹号不是jinja2语法, 注解使用{# 注解内容 #} -->
    {# 在django中模板语法: {% block.super %} #}

    <!-- 样式加载 -->
    <link rel="stylesheet" href="/static/css/other.css">
    {# django中加载样式:{% load static %} {% static 'css/other.css' %}  #}
    <!-- 样式加载2 -->
    <link rel="stylesheet"
          href="{{ url_for('static', filename='css/other.css') }}">
{% endblock %}
 {# 标签: for、if、{% 标签 %} {% end标签 %} #}
    {# {{ 变量 }}: 解析变量的值 #}

    {{ data }}
    <br>
    {% for item in data %}
        {% if item == 'Vue' %}
            <span style="color:red;">{{ item }}</span>
        {% else %}
            {{ item }}
        {% endif %}
    {% endfor %}
    <br>
    {# flask中获取data中第二个元素 #}
    {# django中获取data中第二个元素, data.1 #}
    {{ data[1] }}
    <br>
    {{ content_h2 }}
    {# 过滤器,使用管道符'|' ,safe加载样式 striptags删除格式#}
    {{ content_h2 | safe }}
    {{ content_h2 | striptags }}
    {{ content_h2 | length }}

5.manage 管理文件

app = Flask(__name__)

app.register_blueprint(blueprint=blue)
app.register_blueprint(blueprint=stu_blue,url_prefix='/stu')
# 数据库的配置
# mysql+pymysql://root:password@host:port/1902flask
# mysql+pymysql://root:@127.0.0.1:3306/1902flask
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@139.196.79.238:3306/1902flask'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
# 初始化方法,在views文件中创建db对象时,未传入app,则需调用init_app方法对app进行初始化

if __name__ == '__main__':

    manage = Manager(app)
    manage.run()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容