• 千锋Flask学习笔记


    千锋Flask学习笔记

    写在前面

    • 学习链接:Python 900集(学完可就业/2019版)[359集: 451集],共93集

    • 感想 | 摘抄

      1. filter和filter_by区别
        • 接收的参数类型不一样
        • cls.query.filter(类名.属性名 条件操作符 条件) 过滤特定条件,返回的是query对象
        • cls.query.filter_by(关键字参数对) 单条件查询,条件必须关键字参数,而且and连接
    • 学习时遇到的问题

      • Flask用pycharm启动的时候无法按代码中的设置启动(debug设置为True也没辙)

      • 开发模式的环境配置在wsl的ubuntu中,bashrc和zshrc设置FLASK_ENV都没用,只有在windows的系统环境中配置了才有用

      • 使用 python manage.py db init没有迁移数据库,而是启动了服务器,并且还没有启动debug

        答:注意你 manage.py 中的主程序,是app不是manager吧憨憨~

      • 在使用sqlalchemy的order_by的时候报错:

        sqlalchemy.exc.CompileError: Can't resolve label reference for ORDER BY ...

        答:这里需要给 -id加上一个text函数

        Customer.query.order_by(text("-id")).first().id

      • 更换flask为0.13.1之后报错:

        ImportError: cannot import name 'import_string'

        答:werkzeug版本兼容问题,安装 pip install werkzeug==0.15.2 就行了

    1. Flask介绍

    1. Flask是一个基于Python实现的Web开发 “微”框架

    2. Flask跟Django一样,也是一个基于MVC设计模式的Web框架

    3. Flask依赖三个库:

      • Jinja2 模板引擎
      • Werkzeub WSGI工具集
      • Itsdangerous 基于Django的签名模块
    4. 参数配置:在启动的时候还可以添加参数,在run()中:

      • debug:是否开启调试模式,开启后修改过python代码会自动重启
      • threaded:是否开启多线程
      • port:启动指定服务器的端口号
      • host:主机,默认是127.0.0.1,指定为0.0.0.0代表本机所有ip
    5. debugger:

      • Flask中调试器拥有保护功能
      • PIN
      • 如果需要在页面中进行调试,需要输入PIN码进行确认
    6. Linux

      • 环境变量
        • 系统级
          • /etc/environment
          • /etc/profile
        • 用户级
          • ~/.bashrc
        • 临时级
          • 在窗口中直接export
    7. Flask-Script

      • 可以添加Flask脚本的扩展库
      • 添加命令行参数
      • 使用
        • 安装:pip install flask-script
        • 初始化:使用app构建Manager对象
        • 调用:
          • runserver
            • -d:调试模式
            • -r:自动重试加载
            • -p:port(0.0.0.0代表所有端口)
            • -h:host
            • --threaded:开启多线程模式
          • shell
    8. 简单的一阶程度拆分

      在这里插入图片描述

    9. 路由的管理

      • 使用的时候容易出现循环应用的问题
      • 使用懒加载的方式
        • 使用函数调用的形式进行加载
      • 使用新方案解决
        • 蓝图
          • 代表的一种规划
        • 路由的规划
      • flask-blueprint
        • 使用过程
          • 安装
            • pip install flask-blueprint
          • 初始化
            • 需要创建蓝图对象
              • name
              • 导入名字 __name__
            • 需要使用app进行初始化
              • 注册在App上
          • 使用
            • 和Flask对象差不多
            • 直接作为装饰器用来注册路由
    10. 数据库

      • Web开发中,大多数情况使用的都是关系型数据库
      • ORM
        • SQLAlchemy
      • flask-sqlalchemy
        • 使用过程
          • 安装
            • pip install flask-sqlalchemy
          • 初始化
            • 需要使用app进行SQLAlchemy对象的创建
              • 使用懒加载方式 init_app 方法搞定
            • SQLALCHEMY_DATABASE_URI
              • 连接数据库的路径
              • URI格式
                • 数据库+驱动://用户名:密码@主机:端口/库
            • SQLALCHEMY_TRACK_MODIFICATIONS
              • 将来被添加进来的一个特性
              • 默认是False
          • 使用
            • 定制模型
              • 继承自Model
              • 创建字段
            • 创建库,创建表
              • 库需要手动创建
                • SQLAlchemy对象.create_all
                • 删除 .drop_all
                • 不能差量更新
            • 数据操作
              • 存储
                • 创建对象
                • SQLAlchemy对象.session.add()
                • 添加完成还要进行commit()
      • Flask-Migrate
        • 迁移插件
        • 在FLask中像Django中一样进行模型迁移
        • 使用流程
          • 安装
            • pip install flask-migrate
          • 初始化
            • 使用app和db进行初始化
            • 可以使用懒加载方式
          • 使用
            • flask db 指令
              • init
              • migrate
              • upgrade
            • 结合flask-script使用
              • 在manager添加一个管理指令
                • manager.add_command('db', MigrateCommand)
              • python manage db 指令
    11. 二阶拆分

      在这里插入图片描述

    12. 公司开发环境

      • 开发环境
        • 开发人员使用
      • 测试环境
        • 测试人员使用
      • 演示环境
        • 给产品看的
        • 做演习、彩排
      • 生产环境、线上环境
        • 真实环境
        • 给用户看的
    13. 项目结构

      • 原版
        • HelloFlask.py
      • 改良
        • 三阶改装
        • manage.py
          • 项目管理文件
        • App
          • __init__
            • 初始化文件
            • 天然的单例
            • 调用的顺序是最高的
          • settings
            • config
            • 全局项目配置
          • ext
            • extension 扩展库
            • 除了和路由相关
          • views
            • apis
            • 路由,视图函数
          • models
            • 定制模型
    14. ODOO

      • 比django还重的Web框架
      • 可以快速生成网站
    15. 三阶拆分

      在这里插入图片描述

    2. Views

    1. 路由

      • 路由参数获取
      • <>
        • 语法:<converter:name>
        • converter
          • int
          • float
          • string
            • /作为结尾的
          • path
            • 从path修饰开始,后面的东西都是我们的
            • / 没有作用了
          • uuid
            • any
    2. 视图函数

      • 默认支持GET、HEAD、OPTIONS
      • 其余请求不支持
      • 想支持其余请求需要手动注册
    3. Flask有四大内置对象

      • Request
        • request
      • Session
        • session
      • G
        • g
      • Config
        • 在模板中config
        • 在python代码中,app.config
    4. 小结

      在这里插入图片描述

    3. Request

    1. args
      • 请求参数
      • query_string
      • query_params
      • get请求参数
      • 它并不是get专属,所有请求都能获取这个参数
    2. form
      • 表单数据
      • post请求参数
        • 直接支持put,patch
    3. ImmutableMultiDict
      • args和form都是这个类型
      • dict子类

    4. Response

    1. 创建Response的三种方式
      • 直接返回字符串
      • make_response
      • 直接构建Response
    2. 参数设置
      • 内容
      • 状态码
    3. render_template
      • 帮助把模板变成html字符串
    4. 重定向
      • redirect
      • 反向解析:url_for
    5. 终止处理
      • abort:本质上就是一个exception
      • HttpException:
        • 子类指定两个属性即可实现
        • code
        • description
    6. 异常捕获
      • 可以提升程序交互
      • 让程序变得友好
      • 注册errorhandler

    5. 会话技术

    1. 跨请求共享数据

    2. 出现原因

      • web开发中http都是短连接
      • http请求是无状态的
      • 请求从request开始,到response就结束了
    3. Cookie

      • 客户端会话技术
      • 数据存储在客户端
      • key-value
      • flask中的cookie默认对中文等进行了处理,直接可以使用中文
    4. Session

      • 服务端会话技术
      • 数据存储在服务器
      • key-value
      • flask中
        • 将session存储在cookie中
        • 对数据进行序列化
        • 还进行了base64
        • 还进行了zlib压缩
        • 还传递了hash
      • session的时间是31天
    5. Token

    6. flask-session

      • 实现了服务端session
      • 将数据存储在服务端,将数据对应的key存储在cookie中
      • RedisSessionInterface
        • save_session:将数据进行了pickle序列化
    7. flask-bootstrap

      • bootstrap/base.html
        • html_attribs:给整个html添加属性
        • html
          • head
            • title
            • metas
            • styles
          • body_attribs
            • body
              • navbar:导航条
              • content:内容
              • scripts
    8. 小结

      在这里插入图片描述

    6. 模型和模板

    1. 模板路径默认在Flask(app)创建的路径下

    2. 如果想自己指定模板路径

      • 在Flask创建的时候,指定template_folder
      • 在蓝图创建的时候,也可以指定template_folder
      • 蓝图指定此蓝图同意前缀:/xxx
      • 模板中使用反向解析和在Python代码中一样
        • url_for
    3. 静态资源

      • 静态资源在flask中是默认支持的
      • 默认路径在和flask同级别的static中
      • 想要自己指定
        • 可以Flask创建的时候指定 static_folder
        • 也可以在蓝图中指定
      • 静态资源也是有路由的
        • endpoint是static
        • 参数有一个filename
      • {{ for_for('static', filename='xxx') }}
    4. flask-debugtoolbar

      • 从Django中借鉴
      • 样式基本一致
      • 使用方式更简单
        • 安装
        • 使用app初始化
    5. 模型

      • 约束
      • 模型信息指定
        • 表名映射
          • _tablename_
        • 模型继承
          • 默认继承并不会报错,它会将多个模型的数据映射到一张表中,导致数据混乱,不能满足基本使用
          • 抽象的模型是不会在数据库中产生映射的
            • _abstract_ = True
      • 文档
        • falsk-sqlalchemy
        • sqlalchemy
      • 项目中数据库优化
        • 怎么连接
        • 连接多少个
        • django和flask
          • 默认都是有数据库连接池的
      • 数据查询
        • 获取单个对象
          • first
          • get
          • get_or_404
        • 获取结果集
          • all
            • 特殊、特例
            • 列表:list
          • filter
            • BaseQuery对象
              • _str_ 输出的是这个对象数据的SQL
            • 条件
              • 类名.属性名.魔术方法(临界值)
              • 类名.属性名 操作符运算符 临界值
              • contains
              • startswith
              • endswith
              • in_
              • link
              • _gt_
              • _ge_
              • _lt_
              • _le_
            • 筛选
              • filter_by()
              • offset()
              • limit()
              • order_by()
              • get()
              • first()
              • paginate()
              • offset和limit不区分顺序,都是先执行offset
              • order_by调用必须在offset和limit之前
            • 与或非
              • _and
              • _or
              • _not
          • filter_by
            • 用在级联数据上
            • 条件语法精准
            • 字段 = 值
          • 级联数据
            • 获取
              • 手动实现获取
              • 使用关系 relationship 进行级联查询
                • 反向引用
            • 关系
              • 1:1
                • ForeignKey + Unique
              • 1:M
                • ForeignKey
              • M:N
                • 额外关系表
                • 两个 ForeignKey
          • 筛选在flask-sqlalchemy中,all如果使用,只能放在最后
    6. 小结

      在这里插入图片描述

    7. 数据传输加密反爬

    1. 爬虫
      • 数据获取
      • 数据提取
      • 数据存储
    2. 反爬
      • 数据加密反爬
      • 在服务端对数据进行特定算法的加密
      • 在客户端进行数据的解密
        • 浏览器还是可破解的
        • Android或IOS移动端,破解率基本为零

    8. 钩子函数

    1. 面向切面编程
    • 动态介入请求流程
    • before_request
    • after_request
    1. Django请求流程
      • urls -> views
      • views -> models
      • models -> views
      • views -> response
    2. 添加中间件
      1. client -> process_request: list
      2. 逐一进行process_request
      3. process_request -> urls
      4. urls -> process_view: list
      5. 逐一进行process_view
      6. process_view -> views
      7. views -> models
      8. models -> views
      9. views -> response
      10. response -> process_response: list
      11. 逐一进行process_response
    3. 四大内置对象
      1. request
      2. session
      3. g
        • 跨函数传递数据
        • 设置全局变量
      4. config (app)
        • python flask:current_app.config
        • 一定是在项目启动之后

    9. 用户激活、手机、邮箱

    1. 用户激活

      • 邮箱
        • 异步发送邮件
        • 在邮件中包含激活地址
          • 激活地址接收一个一次性的token
          • token是用户注册的时候生成的,存在了cache中
          • key-value
            • key:token
            • value:用户的一个唯一标识
      • 短信
        • 同步操作
    2. 小结

      在这里插入图片描述

    10. Flask-RESTful

    1. 输出

      • 默认输出字典,可以直接进行序列化
      • 如果包含对象
        • 默认会抛出异常,对象不可JSON序列化
      • 使用格式化工具
        • marshal 函数
        • marshal_with 装饰器
        • 条件
          • 格式
            • 字典格式
            • 允许嵌套
            • value 是 fields.xxx
          • 数据
            • 允许任何格式
          • 如果格式和数据完全对应,数据就是预期格式
          • 如果格式比数据种的字段多,程序以然正常运行,不存在的字段是默认值
          • 如果格式比数据中的字段少,程序正常执行,少的字段不会显示
          • 以格式的模板为主
        • 结论
          • 想要什么格式的返回
          • 格式工具(模板)就是什么样的
          • 和传入的数据没什么直接关系
        • 格式和数据的映射
          • 格式中的字段名和数据中的字段名需要一致
            • 也可以手动指定映射
            • attribute='property_name'
          • 也可以对属性指定默认值
            • default
            • 指定默认值,值传递使用传进来的值
            • 未传递,则使用默认值
        • fields
          • Raw
            • format
            • output
            • 调用
              • 将数据传递进格式化工具的时候,先获取值 output
              • 再对值进行格式化 format
          • String
            • 继承Raw
            • 将value进行格式化
            • 转换成兼容格式的text
          • Integer
            • 继承自Raw
            • 重写了初始化,将default设置为0
            • 重写格式化,直接将value转换成int
          • Boolean
            • 继承自Raw
            • 重写格式化,直接将 value 转换成 bool
          • Nested
            • 继承自Raw
            • 重写output
            • 进行marshal
          • List
            • 继承自Raw
            • 重写了output
              • 判断你的类型
              • 对不同的类型进行不同的处理
                • dict 直接进行处理
                • list 迭代处理
            • 重写format
              • 进行格式化
    2. 输入

      • RequestParser
        • 使用过程
          • 先定义一个RequestParser对象
          • 向对象中添加字段
          • 从对象中获取字段
        • 对象在添加参数的时候,可以实现数据的预校验
          • 参数是否必须
          • 数据的类型
          • 还可以设置错误提示
          • 接收多个值: action="append"
          • 也可以接收指定别名
          • location可以指定参数的来源
            • 可以配合 action="append"一起用
            • 获取多个来源的同名变量
    3. 爬虫与反爬虫

      • 基于IP频率反爬
        • 客户端使用代理服务器
      • 基于UA的反爬
        • 使用UA池
      • 基于Cookie或用户反爬
        • Cookie池
        • 登录大量账号,存储cookie
    4. 小结

      在这里插入图片描述

    11. 公司组成、项目架构

    1. 公司

      • 找工作的途径
        • 投递简历
          • 至关重要
          • 一定要自己写
        • 内推
      • 人力
        • 人力资源
          • 人员招聘
          • 员工考核
          • 社保公积金
          • 员工关系
          • 薪资管理
      • 行政
        • 打杂的
        • 收发快递
        • 接待访客
        • 交物业水电
        • 拉拉网线
        • 设备采购
      • 技术
        • 产品经理
          • PRD
        • 项目经理 | 技术经理 | CTO
        • UI(UD、UE)
        • DBA数据库工程师
          • 后端
          • 移动端
          • 数据分析
        • 数据分析师
          • 爬虫
            • 金融量化交易
            • 信息采集
        • 后端
          • Web
        • 前端
          • HTML
          • 移动端
        • 测试
          • 黑盒测试
          • 白盒测试
        • 运维
      • 财务
        • 发工资
          • 工资构成
            • 全额缴税和五险一金
              • 不超过10%(北京)
            • 基本工资 + 津贴 + 报销款
            • 基本工资 + 绩效 + 现金
      • 运营推广
        • 网络推广
          • 百度竞价
          • 各大IT论坛贴吧
        • 线下推广
          • 地铁推广
          • 去指定区域推广
          • 小区推广
        • 口碑运营(公关)
      • 销售
        • 渠道
        • 线上销售
          • 网络销售
          • 电话销售
        • 线下销售
          • 实体店
          • 体验店
          • 院校
          • 班主任
      • 售后
        • 客服
        • 就业老师
        • 品保
          • 班主任
          • 就业老师
          • 教务
            • 稽查
            • 回访电话
      • 法务
        • 律师团队
    2. 开发流程

      • 产品
      • 开会讨论
      • 架构
        • 框架选型
      • 数据库开始
    3. 加班

      • 弹性制工作
        • 晚到晚走
        • 最近比较忙,需要加班
          • 吃饭、交通
          • 加班费
          • 加班有统计,可以调休
        • 996
          • 早9晚9上6天
    4. 公司

      • 常规公司
        • 通过融资进行发展的公司
      • 外包公司
        • 驻地开发
          • 出差
        • 在自己公司开发
      • 国企
    5. 公司发展历程

      • 天使投资
        • PPT产品
        • 固定页面的产品
      • A轮
        • 扩大规模
      • B轮
        • 优化产品
        • 占领市场
        • 对赌
      • C轮
      • D轮
      • E轮
      • IPO上市
    6. 工资

      • 期权
      • 股权

    12. 淘票票

    1. 开发

      • 淘票票
        • 淘票票后端
          • 淘票票公司自己管理
        • 客户端
          • 看电影用户准备的
        • 影院端
          • 电影放映
    2. 通用模块

      • 用户体系
        • 用户权限
        • 用户角色
      • 电影
        • 淘票票后端
          • 增删改查
        • 淘票票影院端
          • 查询
        • 淘票票客户端
          • 查询
      • 排挡
        • 淘票票后端
          • 增删改查
        • 影院端
          • 增删改查
        • 客户端
      • 影票
        • 淘票票后端
          • 增删改查
        • 影院端
          • 增删改查
        • 客户端
          • 增删查
    3. 可扩展

      • 优惠券
      • 积分系统
      • 影院会员系统
      • 评价系统
      • 套餐
      • 定位(手机、浏览器)
      • 地址
        • 后端规划好
        • 影院端添加
    4. 多个接口拥有通用功能

      • 如何复用代码
        • 装饰器
        • 钩子函数
        • 直接封装一个函数
        • 创建一个父类
    5. 淘票票后端

      • 管理淘票票用户
      • 淘票票影院管理
      • 电影
    6. 淘票票影院端

      • 后端购买来的电影播放权
        • 电影
      • 放映厅
      • 排挡
        • 关系表
        • 电影和放映厅 + 时间
    7. 淘票票客户端

      • 查看电影
        • 查看影院
        • 查看排挡
        • 下单
        • 找到具体排挡
        • 选座(座位锁定),并发处理
          • 订单过期
        • 支付
    8. 项目架构

      • 一个项目入口
        • App/_init_
        • apis
          • admin
          • movie_admin
          • movie_user
        • models
          • admin
          • movie_admin
          • movie_user
      • 另外一种架构
        • FlaskTpp
          • _init_
          • settings
          • ext
        • Admin
          • apis
          • models
        • MovieAdmin
          • apis
          • models
        • MovieUser
          • apis
          • models
    9. 系统设计

      在这里插入图片描述

      - 客户端
        - 用户系统
          - 字段
          - username
          - password
          - phone
          - email
          - is_delete
          - permission
        - 权限设计
          - 类似于linux权限设计
            - 精髓,一个字段可以代表多种权限
            - 还能分成两种
              - 完全和linux中一样
                - 使用二进制
                - 所有的初始权限值都是2的n次幂
              - 只是给一个数值
                - 数值越大,权限越高
                - 数值大的包含数值小的所有权限
          - 多表设计权限系统
            - 用户表
            - 权限表
            - 用户权限表
      
    10. Linux权限设计

      在这里插入图片描述

    11. FlaskTpp

      1. 开发流程
        • 产品经理提出需求
        • 开会,评审
        • 要添加的功能,周期(时间)
        • 数据设计
          • DBA
          • 架构师
          • 后端经验丰富的工程师
          • 自己设计
        • 建库建表
          • 模型建立
        • 对数据进行操作
          • CRUD
          • 和前端联调
            • 前端需要请求接口
            • 接口对接
              • API文档
              • 接口功能
              • 接口地址
              • 接口所需参数
                • 哪些是必须的,哪些是非必须的,哪些是通用参数
              • 接口返回数据类型
                • 数据字段
                • 状态码
                • 错误码
        • 设计操作的权限
          • 登录才能操作
          • 权限级别
        • 送测
          • 测试工程师会有bug反馈
        • 修复bug
          • 送测
        • 上线
      • 一个项目至少有两端
        • 一端用户端
        • 后台管理端
      • 大部分项目都是有三端的
        • 用户端
          • Web
          • 移动端
            • Android
            • IOS
          • 微信端
        • 商家端
          • Web
          • 移动端
            • Android
            • IOS
          • 微信端
        • 后台管理端
          • Web
          • 移动端
            • Android
            • IOS
          • 微信端
      • 我们实现使用RESTful
        • 用户端的接口
          • 不需要再关注展示端的具体实现
        • 商家端的接口
        • 后台管理接口
    12. Property

      • 将函数转换成属性
      • 动态干预数据的存取
    13. 权限

      • 两种设计
        • 单个字段实现所有权限
          • Linux:高格调权限设计
            • 使用二级制实现
            • 每一种权限使用一个不重复的二进制确定
              • 2的n次幂的值
            • 优点
              • 各种权限互不干扰
        • 包含模式权限
          • 值越大权限越多,包含值小的所有权限
      • 多表实现权限
        • 用户表
        • 权限表
        • 用户权限表(用户表和权限表多对多的关系)
    14. 装饰器

      • 面向切面编程的一部分
      • 再不修改原代码的情况下,添加功能、逻辑控制
      • 装饰器上内部参数
        • *args:用来接收位置参数
          • 关键字参数默认值可以自动处理
          • 如果传递关键字参数,就需要我们自己处理
            • 接收参数
            • 传递参数
        • **kwargs:用来接收关键字参数
        • 如果原函数拥有返回值
          • 默认只有调用的话,返回值会被丢弃
          • 想接收返回值,要进行数据的返回
    15. 权限系统

      • Linux
      • 权限分类
        • 1:读权限
        • 2:写权限
        • 4:修改权限
    16. 特殊登陆

      • 扫码登录
        • 前置条件
          • 有一个登录好的账号
        • 使用登录好账号中的token来访问自己的登录接口
          • 常规登录接口
            • 用户名
            • 密码
            • 手机号
            • 邮箱
          • 特殊登录接口
            • 直接可以通过token进行登录
          • 扫码扫出来的就是那个特殊的登录接口
      • 跨应用登录
      • 第三方登录
    17. 城市导入脚本

      • 获取城市信息
      • 将城市信息读出来
      • 插入数据库中
    18. 项目目前状况

      • 三端划分
        • 客户端
        • 商家端
        • 后台管理
      • 客户端
        • 用户模块
          • 注册登录
          • 信息修改
          • 用户删除(不允许)
          • 权限
      • 商家端
        • XXX
      • 后端
        • XXX
      • 通用
        • 地址管理
    19. 电影

      • 电影属于哪个公司
      • 演员
      • 操作
        • CRUD
          • C
            • 应该只有后台登录的管理员能创建
            • token认证
              • 会出现多个端token混乱
              • 不同token对应相同的id值
              • 解决方案:
                • token 添加前缀或后缀
                • 修改表结构,user_id的值是字符串,里面存uuid
    20. 电影公司

    21. 演员表

    22. 接下来

      • 电影模块
        • 电影哪来的(后端)
      • 后端
        • 用户实现(淘票票管理系统)
        • 可以实现电影的增删改查
      • 客户端就可以实现电影查询
      • 查询电影院(影院端)
        • 用户实现(影院端)
        • 获取电影列表
        • 购买电影播放权
    23. 再之后

      • 电影院有排挡
      • 用户浏览具体排挡下单
      • 票房排行
        • 统计电影卖的所有的票的总和
        • 电影
          • 排挡
            • 订单
              • 价钱
      • 热度排行
    24. 影院端

      • 用户
        • 一个用户对应多个电影院具体地址信息
      • 用户购买的电影播放权
      • 放映厅
      • 排挡
    25. 排挡之后

      • 用户可以查看排挡
      • 下单(锁单)
      • 支付
    26. 模型图

      在这里插入图片描述

    27. 电影院模型图

      在这里插入图片描述

    28. homework

      • 集成支付宝支付
      • 添加校验
        • 作为获取
          • 将已售卖的票剔除下去
          • 将锁单的票剔除下去
        • 锁单的票在过期后应该将座位归还
    29. 座位

      • 所有座位应该是大厅的座位表
      • 剔除已经卖了的
        • 已支付
        • 已取票
      • 锁单
        • 已下单,但未支付
    30. 并发

      • 变并行为串行
      • 加锁
        • 悲观锁
          • 对数据操作加锁
        • 乐观锁
          • 在读取获得的数据
          • 操作完成再读一遍,和预期的一样
    31. 支付

      • 如何确保付款
      • 核心逻辑第三方平台不会暴露给后端服务器的
      • 直接和支付平台对接的是客户端
      • 客户端可以返回给服务器一个支付状态
        • 客户端并不可信
        • 还要有一个确保策略
        • 接收支付宝的回调
          • notify_url
          • 已付款待确认就是客户端告诉你成功了,但是还没有收到支付宝的回调
    32. 项目简单回顾

        • 用户端
        • 商家端
        • 后台管理端
      • 用户模块
        • 用户权限
        • Linux
        • 多表
      • 电影
      • 商家电影授权
        • 商家和电影的关系表
      • 电影院地址
        • 级联到商家
      • 放映厅
        • 坐标系
        • 级联到电影院地址
      • 排挡
        • 放映厅和电影
        • 电影已经买了的,授权了的
      • 订单
        • 排挡和用户
        • 座位筛选
          • 将已经买了的
          • 锁定的
        • 订单锁定
          • 懒处理方式
          • 通过一个过期时间搞定
        • 订单生成
          • 座位表获取
          • 座位表确认
          • 并发
              • 乐观锁:操作前和操作后对数据进行比对,如果满足预期则是成功
              • 悲观锁:真的给库和表加锁,一定能成功,效率低
            • 事务
              • 默认ORM开启事务
              • begin
              • commit
              • rollback,回滚,多个操作的时候才有意义
        • 支付
          • 和django中一样
          • 支付注意配置支付账号的信息
          • 支付的时候调用指定的客户端
            • web
            • phone
            • 区别是调用的接口不一样,参数都是一样的
            • 使用的库封装了,对应的就是函数名不一样
          • 确保支付结果
            • 接收支付宝的回调
    33. 票房排行

      • 电影和钱 来个排序

      • 电影表

        • 订单
          • 电影
        • 排挡
          • 订单
        • 排挡
      1. 用户权限

        • 多表

          • 用户表

          • 权限表

          • 用户权限表

          • 权限组表

          • 权限组权限表

          • 用户权限组表

          • 用户组

          • 用户组表

          • 用户组权限组表

          • 用户组权限表

        • 权限组设计

          在这里插入图片描述

        • 用户权限判断

          1. 直接判断用户权限
          2. 获取所在组,组所拥有的权限
        • 只要有一个存在,即存在

      2. 多表加入分组聚合查询

        在这里插入图片描述

      3. Django扩容

        • 执行原生sql
          • objects.raw(“sql”)
        • 想做字段选择
          • defer:不要哪些字段
          • only:只要哪些字段

    13. nginx

    1. nginx

      1. 测试:sudo nginx -t -c /mnt/e/1-Work/3-Code/python_projects/8-Flask/Day23/FlaskTpp/config_ubuntu.conf

      2. 运行:sudo nginx -c /mnt/e/1-Work/3-Code/python_projects/8-Flask/Day23/FlaskTpp/config_ubuntu.conf

      3. 查看:ps -ef|grep nginx

      4. 文件:

        #user  nobody;
        worker_processes  1;
        
        #error_log  logs/error.log;
        #error_log  logs/error.log  notice;
        #error_log  logs/error.log  info;
        
        #pid        logs/nginx.pid;
        
        
        events {
            worker_connections  1024;
        }
        
        
        http {
            include       /etc/nginx/mime.types;
            default_type  application/octet-stream;
        
            sendfile        on;
            #tcp_nopush     on;
        
            #keepalive_timeout  0;
            keepalive_timeout  65;
        
            #gzip  on;
        
            # 负载均衡
            # upstream my_server{
            #     server 10.0.122.64:8000 weight=1;
            #     server 10.0.122.64:8000 weight=1;
            # }
        
            server {
                listen       80;
                server_name  10.16.30.12;
                #root  /mnt/e/1-Work/3-Code/python_projects/6-AXFProject/GPAXF;
        
                #charset koi8-r;
        
                #access_log  logs/host.access.log  main;
        
                #location /static {
                #    alias /mnt/e/1-Work/3-Code/python_projects/6-AXFProject/GPAXF/static;
                    # root   html;
                    # index  index.html index.htm;
                #}
        
                
                location / {
        			# uwsgi
                    include /etc/nginx/uwsgi_params;
                    uwsgi_pass 0.0.0.0:8888;
        			
        			# runserver
        			# proxy_pass http://127.0.0.1:5000;
        			# 负载均衡配置
                    # proxy_pass http://my_server;
                }
        
                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                    root   html;
                }
            }
        }
        
    2. uwsgi

      1. 初始化:uwsgi --ini uwsgi.ini

      2. 停止:uwsgi --stop uwsgi.pid

      3. 重启:uwsgi –reload uwsgi.pid

      4. 文件

        [uwsgi]
        # 使用nginx连接时,使用
        socket=0.0.0.0:8888
        # 直接作为web服务器使用
        # http=0.0.0.0:8888
        
        # 配置工程目录
        chdir=/mnt/e/1-Work/3-Code/python_projects/8-Flask/Day23/FlaskTpp
        
        # 配置项目的wsgi目录,相对工程路径
        wsgi-file=manage.py
        #router
        callable=app
        
        # 配置进程,线程信息
        processes=4
        threads=10
        enable-threads=True
        master=True
        # 进程id存储文件
        pidfile=uwsgi.pid
        daemonize=uwsgi.log
        

    14. logging

    1. 四大组成

      • Logger
        • 和代码直接对接
      • Handler
        • 处理者
        • 日志处理策略
      • Filter
        • 过滤器
      • Formatter
        • 格式化
    2. 日志有级别

    3. 日志处理流程

      • 通过Logger对象进行输出
      • 交给Handler处理者进行处理
        • 处理者可以对输出样式进行格式化
        • 也可以对数据进行过滤
    4. Django settings配置样本

      # 日志配置
      LOGGING = {
          'version': 1,  #使用的python内置的logging模块,那么python可能会对它进行升级,所以需要写一个版本号,目前就是1版本
          'disable_existing_loggers': False, #是否去掉目前项目中其他地方中以及使用的日志功能,但是将来我们可能会引入第三方的模块,里面可能内置了日志功能,所以尽量不要关闭。
          'formatters': { #日志记录格式
              'verbose': { #levelname等级,asctime记录时间,module表示日志发生的文件名称,lineno行号,message错误信息
                  'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
              },
              'simple': {
                  'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
              },
              'myself': {
                  'format': "%(levelname)s - %(asctime)s - %(message)s"
              }
          },
          'filters': { #过滤器:可以对日志进行输出时的过滤用的
              'require_debug_true': { #在debug=True下产生的一些日志信息,要不要记录日志,需要的话就在handlers中加上这个过滤器,不需要就不加
                  '()': 'django.utils.log.RequireDebugTrue',
              },
              'require_debug_false': { #和上面相反
                  '()': 'django.utils.log.RequireDebugFalse',
              },
          },
          'handlers': { #日志处理方式,日志实例
              'console': { #在控制台输出时的实例
                  'level': 'DEBUG', #日志等级;debug是最低等级,那么只要比它高等级的信息都会被记录
                  'filters': ['require_debug_true'], #在debug=True下才会打印在控制台
                  'class': 'logging.StreamHandler', #使用的python的logging模块中的StreamHandler来进行输出
                  'formatter': 'simple'
              },
              'file': {
                  'level': 'INFO',
                  'class': 'logging.handlers.RotatingFileHandler',
                  # 日志位置,日志文件名,日志保存目录必须手动创建
                  'filename': os.path.join(BASE_DIR, "logs", "debug.log"), #注意,你的文件应该有读写权限。
                  # 日志文件的最大值,这里我们设置300M
                  'maxBytes': 300 * 1024 * 1024,
                  # 日志文件的数量,设置最大日志数量为10
                  'backupCount': 10,
                  # 日志格式:详细格式
                  'formatter': 'verbose',
                	'encoding': 'utf-8',  # 设置默认编码,否则打印出来汉字乱码
              },
          },
          # 日志对象
          'loggers': {
              'django': {  #和django结合起来使用,将django中之前的日志输出内容的时候,按照我们的日志配置进行输出,
                  'handlers': ['console', 'file'], #将来项目上线,把console去掉
                  'propagate': True, #冒泡:是否将日志信息记录冒泡给其他的日志处理系统,工作中都是True,不然django这个日志系统捕获到日志信息之后,其他模块中可能也有日志记录功能的模块,就获取不到这个日志信息了
              },
              'my': {
                  'handlers': ['debug'],
                  'level': 'DEBUG',
                  'propagate': False
              }
          }
      }
      

    碌碌谋生,谋其所爱。 @李英俊小朋友

  • 相关阅读:
    向对象数组中添加新的属性 Jim
    vuecli3.0 postcsspxtoviewport将px转化为vwvh适配/Web 端屏幕适配方案 Jim
    js深拷贝与浅拷贝 Jim
    行业死亡案例汇总(客观记录不做评价)
    wins和linux 系统不同编码格式导致的.py执行问题: bad interpreter: No such or file directory
    Pyhon之类学习1
    How to handle error In $.get()
    sql 修改列名及表名
    程序设计类网站
    数据类型
  • 原文地址:https://www.cnblogs.com/lyjun/p/16217572.html
Copyright © 2020-2023  润新知