1.模板继承
  1.父模板
    {% block 块名 %}
    {% endblock %}
  2.子模板
    1.{% extends 父模板名称 %}
    2.{% block 块名%}
      {% endblock %}

      覆盖父模板中的同名块
2.修改配置
  app = Flask(
    __name__,
    template_folder="指定模板目录名称",
    static_folder="指定静态文件目录名称",
    static_url_path="/访问静态文件的路径")
3.请求
  1.请求对象 - request
    1.什么是 request
      封装由浏览器带给服务器的信息
      from flask import request
    2.request中的常用成员
      1.request.method
      2.request.args
      3.request.form
      4.request.url
      5.request.path
      6.request.full_path
      7.request.headers
        request.headers.get('Referer')
  2.获取请求提交的数据
    1.get
      1.表单 method = 'get'
      2.所有的地址栏提交 和 链接提交

<a href="/abc?name=xxx"></a>
         <script>
           location.href="/abc?name=xxx"
         </script>

    2.post
      1.表单 method = 'post'
==================================================
1.响应
  1.什么是响应
    响应就是由服务器端带给客户端的内容
    响应内容可以是字符串,模板,重定向
  2.响应字符串 或 模板
    1.响应字符串  
      return "普通字符串"
    2.响应模板
      return render_template('xxx.html')
      其本质 还是响应字符串
  3.响应对象
    响应对象:将响应内容封装到一个对象中,以便完成更多的响应行为

    在Flask中,使用 make_response() 构建响应对象
    from flask import make_response

@app.route('/xxx')
     def xxx():
       resp = make_response('响应内容')
       resp = make_response(render_template('xxx.html'))
       #允许调用resp中的属性或方法们以便完成更多的响应行为
       return resp

  4.重定向
    1.什么是重定向
      由服务器端通知客户端重新向新的地址发送请求
    2.语法

from flask import redirect
       @app.route('/xxx')
       def xxx():
         xxxx xxxx 
         return redirect('重定向地址')


2.文件上传
  1.注意问题
    表单中如果有文件上传的话,必须遵循以下两个要求:
    1.表单的提交方式method必须为post
    2.表单的 enctype 属性的值必须为 multipart/form-data

<form method="post" enctype="multipart/form-data">
     </form>

  2.服务器端
    1.获取上传文件
      语法: request.files
      作用:获取上传的所有的文件

      f = request.files['uimg']
      从上传的文件中,将名称为 uimg 的文件获取出来并保存在f中
    2.将文件保存到指定的目录处
      语法: f.save('保存路径')
      作用:将文件保存到指定目录处
      注意:
        1.保存路径可以是相对路径也可以是绝对路径
        2.保存路径要精确到文件名称
        3.保存的目录必须是已存在的
      ex:
        f.save('static/'+f.filename)
        f.filename : 能够获取出文件名
      思考:
        上传的文件,文件名称由 年月日时分秒微妙.扩展名 组成
3.模型 - Models
  1.什么是模型
    模型,是根据数据库中表结构而创建出来的class
    模型其实就是将数据表进行"类化",以类(对象)的方式来操作数据表(数据)
    数据库中的每一张表到编程语言中,就是一个class
    表中的每一个列对应到编程语言中就是class中的一个属性
    表中的每一条数据对应到编程语言中就是class的一个对象

    模型:可以被称为 "模型类" 或 "实体类"
  2.模型的框架 - ORM
    1.什么ORM
      ORM : Object Relational Mapping
      简称: ORM  ,  O/RM  ,  O/R Mapping
      中文: 对象关系映射
    2.ORM框架的三大特征
      1.数据表(Table)到编程类(Class)的映射
        数据库中每一张表对应到编程语言中都有一个类
        在ORM中:
          允许将数据表 自动 生成一个类
          允许将类 自动 生成一张数据表
      2.数据类型的映射
        数据表中的字段以及数据类型 对应到 编程语言中有对应的属性和类型

      3.关系映射
        将数据库中表与表之间的关系 对应到编程语言中类与类之间的关系
        数据库中表与表之间的关系:
          1.一对一
            A表中的一条记录能够与B表中的一条记录相关联
            B表中的一条记录能够与A表中的一条记录相关联

            主键,外键,唯一约束
          2.一对多
            A表中的一条记录能够与B表中的多条记录相关联
            B表中的一条记录只能与A表中的一条记录相关联
          3.多对多
            A表中的一条记录能够与B表中的多条记录相关联
            B表中的一条记录能够与A表中的多条记录相关联

            实现方式:  
              增加第三张关联表来实现多对多
    3.ORM的优点
      1.封装了数据库中所有的操作,大大的提高了开发效率
      2.可以省略庞大的数据访问层,即便不用SQL编码也能完成对数据的CRUD操作
  3.Flask中的ORM框架
    1.Python中的ORM
      比较常用的ORM框架 - SQLAlchemy
      安装:sudo pip3 install sqlalchemy
    2.在Flask中
      使用的也是SQLAlchemy
      但需要安装 Flask-SQLAlchemy 插件包
      安装:sudo pip3 install flask-sqlalchemy

  4.创建数据库 - flask
    create database flask default charset utf8 
    collate utf8_general_ci;
  5.在Flask中配置数据库
    1.通过 app (Flask应用实例) 构建配置信息

app.config['SQLALCHEMY_DATABASE_URI']="mysql://用户名:密码@主机:端口/数据库"
       app.config['SQLALCHEMY_DATABASE_URI']="mysql://root:123456@localhost:3306/flask"

    2.创建数据库应用实例
      from flask_sqlalchemy import SQLAlchemy
      db = SQLAlchemy(app)
  6.定义模型
    语法:
      class MODELNAME(db.Model):
        __tablename__ = "TABLENAME"
        COLUMN_NAME=db.Column(db.TYPE,OPTIONS)
      
      1.MODELNAME : 定的模型类的类名,通常参考表名
      2.TABLENAME : 映射到数据库中表的名称
      3.COLUMN_NAME : 属性名,映射到数据表中就是列名
      4.TYPE : 映射到列的数据类型
      5.OPTIONS : 列选项

      db.TYPE 列的数据类型:
      类型名         python类型       说明
      Integer       int              普通整数,32位
      SmallInteger  int              小范围整数,16位
      BigInteger    long             不限精度的整数
      Float         float            浮点类型
      Numeric       decimal.Decimal  定点类型
      String        str              变长字符串
      Text          str              变长字符串
      Boolean       bool             布尔值
      Date          datetime.date    日期
      Time          datetime.time    时间
      DateTime      datetime.datetime日期和时间

      OPTIONS 列选项
      选项名           说明
      primary_key      如果设置为True表示该列为主键
      unique           如果设置为True表示该列的值唯一
      index            如果设置为True表示该列要创建索引
      nullable         如果设置为True表示该列允许为空,默认允许为空
      default          指定该列的默认值

作业:
  1.创建 Student 模型类
    表名:student
    字段:
      1.id , 主键,自增
      2.sname ,姓名,长度为30的字符串并不允许为空
      3.sage ,年龄,整数
  2.创建 Teacher 模型类
    表名:teacher
    字段:
      1.id , 主键,自增
      2.tname , 姓名,长度为30的字符串并不允许为空
      3.tage ,年龄,整数
      4.tbirth , 生日,日期类型,允许为空
  3.创建 Course 模型类
    表名: course
    字段:
      1.id , 主键,自增
      2.cname , 长度为30的字符串并不允许为空

数据库工具:
  1.Navicate for MySQL
  2.Power Designer
    数据库建模工具 - ER图(Entity Realtionship)

select s.sname,c.cname from student as s
 inner join student_course as sc
 on s.id = sc.sid
 inner join course as c
 on sc.cid = c.id
 where c.cname='钢管舞'/home/tarena/PycharmProjects/FlaskDemo04/static/b04.jpg
 /home/tarena/PycharmProjects/FlaskDemo04/static/b04.jpg