开发知识点-Django

开发知识点-Django_第1张图片

Django

  • 1 了解简介
  • 2 Django项目结构
  • 3 url 地址 和视图函数
  • 4 路由配置
  • 5 请求及响应
  • 6 GET请求和POST请求
    • 查询字符串
  • 7 Django设计模式及模板层
  • 8 模板层-变量和标签
  • 9 模板层-过滤器和继承
    • 继承 重写
  • 10 url反向解析
  • 11 静态文件
  • 12 Django 应用及分布式路由
    • 创建之后 注册 一下
  • 13 模型层及ORM介绍
    • 同步表结构
    • 默认 初始化 id 自增
  • 14 ORM-基础字段及选项
      • django 模型models 常用字段
    • 布尔型
    • 变长字符
    • 继承 Model 类属性
    • 表明 app_模型类名
    • 表 列 字段
  • 15 ORM-基本操作-创建数据
        • python3.7 mysql 部署 问题
    • 只执行 增量 文件
    • 对象 初始化 再 save
    • 引進模型類
  • P16 ORM-查询操作
  • 模型 類 數組 循環 索引 切片 的 操作
    • 類數組 [ , ...... ]
    • 不再是 类的 实例化对象 object
    • 取值 用 字典 取 key 的 这种方式
    • 元组 用 索引取值
    • .all 的 排序 返回 object
    • 灵活 组合 顺序 不用想
    • locals 把 视图函数 的 局部变量 传到 视图里
    • 结构 的 元素 表现形式 要注意 object 字典 元组
    • 17 ORM-查询操作
      • 条件查询
    • P46 8.04-项目部署-uwsgi
          • CentOS7安装uwsgi遇到的坑
    • P47 8.05-项目部署-nginx
          • 看日志
    • P48 8.06-项目部署-nginx
    • 关联查询
      • on_delete参数的各个值的含义:
    • Django常用的QuerySet操作
    • 前后端分离跨域方案
      • 跨域请求存在诸多安全问题,例如CSRF攻击等,
      • 解决方案
      • Django中如何使用CORS
          • 打开cmd,执行命令:pip install django-cors-headers
          • 修改django项目中的setting.py,
    • centos django uwsgi 指定版本
        • 系统版本
        • 编译:
        • 安装:
        • 然后进行软链接、系统便能够识别uwsgi命令
    • 使用Django生成验证码 并发送qq邮箱
    • https://www.bilibili.com/video/BV1vK4y1o7jH?from=search&seid=7358572781939588281

      1 了解简介

      开发知识点-Django_第2张图片
      开发知识点-Django_第3张图片
      开发知识点-Django_第4张图片
      开发知识点-Django_第5张图片
      flask 轻

      手机游戏

      开发知识点-Django_第6张图片
      请求响应 路由

      MTV设计结构

      HTTP状态的 cookie session

      开发知识点-Django_第7张图片
      开发知识点-Django_第8张图片
      开发知识点-Django_第9张图片
      开发知识点-Django_第10张图片
      开发知识点-Django_第11张图片
      请添加图片描述
      开发知识点-Django_第12张图片
      开发知识点-Django_第13张图片
      开发知识点-Django_第14张图片
      开发知识点-Django_第15张图片
      开发知识点-Django_第16张图片
      解释器 版本

      开发知识点-Django_第17张图片在这里插入图片描述
      在这里插入图片描述
      开发知识点-Django_第18张图片在这里插入图片描述
      开发知识点-Django_第19张图片

      开发知识点-Django_第20张图片

      开发知识点-Django_第21张图片

      2 Django项目结构

      开发知识点-Django_第22张图片
      完善的 内部组件

      开发知识点-Django_第23张图片
      开发知识点-Django_第24张图片
      开发知识点-Django_第25张图片
      开发知识点-Django_第26张图片
      开发知识点-Django_第27张图片
      开发知识点-Django_第28张图片
      开发知识点-Django_第29张图片
      请添加图片描述
      开发知识点-Django_第30张图片
      开发知识点-Django_第31张图片
      ctrl shift T 新启终端

      请添加图片描述
      开发知识点-Django_第32张图片
      开发知识点-Django_第33张图片
      服务

      地址 协议 状态码

      前台服务 启动效果

      开发知识点-Django_第34张图片
      开发知识点-Django_第35张图片
      开发知识点-Django_第36张图片
      开发知识点-Django_第37张图片
      开发知识点-Django_第38张图片
      开发知识点-Django_第39张图片
      开发知识点-Django_第40张图片
      默认数据库 存储 文件

      开发知识点-Django_第41张图片
      开发知识点-Django_第42张图片
      开发知识点-Django_第43张图片
      开发知识点-Django_第44张图片
      开发知识点-Django_第45张图片
      开发知识点-Django_第46张图片
      开发知识点-Django_第47张图片
      开发知识点-Django_第48张图片

      项目目录
      配置文件
      路由文件
      上线项目 运行文件
      开发知识点-Django_第49张图片

      内置功能 运行规则 flask 就无

      注意 格式
      开发知识点-Django_第50张图片
      开发知识点-Django_第51张图片

      开发知识点-Django_第52张图片

      绝对路径


      项目 绝对 路径
      开发知识点-Django_第53张图片

      开发知识点-Django_第54张图片
      在这里插入图片描述
      开发知识点-Django_第55张图片
      开发知识点-Django_第56张图片
      开发知识点-Django_第57张图片
      区分 虚拟网站 (一个 服务器 挂 好几个 网站 )
      开发知识点-Django_第58张图片
      在这里插入图片描述

      开发知识点-Django_第59张图片

      开发知识点-Django_第60张图片
      ctrl shift d 新建终端


      开发知识点-Django_第61张图片
      开发知识点-Django_第62张图片
      开发知识点-Django_第63张图片
      开发知识点-Django_第64张图片
      应用
      开发知识点-Django_第65张图片
      中间件
      开发知识点-Django_第66张图片
      配置 主路由文件

      模板

      开发知识点-Django_第67张图片

      开发知识点-Django_第68张图片
      语言 配置
      时区
      开发知识点-Django_第69张图片

      东八区 UTC/GMT+08:00

      开发知识点-Django_第70张图片
      开发知识点-Django_第71张图片

      开发知识点-Django_第72张图片
      开发知识点-Django_第73张图片




      3 url 地址 和视图函数

      开发知识点-Django_第74张图片

      协议 域名 ip 端口 路由 ?查询字符串 # 锚点

      开发知识点-Django_第75张图片
      开发知识点-Django_第76张图片
      开发知识点-Django_第77张图片
      开发知识点-Django_第78张图片


      开发知识点-Django_第79张图片
      开发知识点-Django_第80张图片
      服务 在 主路由 中 配置好 参数 中 视图函数 写好

      请求来了 就会有 相应的 响应

      开发知识点-Django_第81张图片

      来个伪代码 顶替一下 视图函数
      开发知识点-Django_第82张图片

      开发知识点-Django_第83张图片
      把 http 请求 抽象成 HTTPrequest 对象
      给 request 函数

      开发知识点-Django_第84张图片
      开发知识点-Django_第85张图片

      相对导入

      开发知识点-Django_第86张图片
      开发知识点-Django_第87张图片
      开发知识点-Django_第88张图片

      4 路由配置

      开发知识点-Django_第89张图片
      开发知识点-Django_第90张图片
      开发知识点-Django_第91张图片
      开发知识点-Django_第92张图片
      开发知识点-Django_第93张图片
      开发知识点-Django_第94张图片
      开发知识点-Django_第95张图片
      开发知识点-Django_第96张图片
      开发知识点-Django_第97张图片
      开发知识点-Django_第98张图片
      开发知识点-Django_第99张图片
      开发知识点-Django_第100张图片
      开发知识点-Django_第101张图片
      开发知识点-Django_第102张图片
      %s int + 字符串 %d

      开发知识点-Django_第103张图片
      path 中 在 数组中 从上到下 匹配

      开发知识点-Django_第104张图片
      开发知识点-Django_第105张图片
      开发知识点-Django_第106张图片
      开发知识点-Django_第107张图片
      开发知识点-Django_第108张图片
      开发知识点-Django_第109张图片
      开发知识点-Django_第110张图片

      \d 一到两位
      \w+ 字符
      开发知识点-Django_第111张图片
      开发知识点-Django_第112张图片
      在这里插入图片描述
      开发知识点-Django_第113张图片
      开发知识点-Django_第114张图片
      开发知识点-Django_第115张图片
      在这里插入图片描述
      开发知识点-Django_第116张图片
      开发知识点-Django_第117张图片

      精准匹配

      开发知识点-Django_第118张图片
      在这里插入图片描述
      开发知识点-Django_第119张图片

      path <> path转换器

      repath 升级版





      5 请求及响应

      开发知识点-Django_第120张图片
      开发知识点-Django_第121张图片
      开发知识点-Django_第122张图片
      开发知识点-Django_第123张图片

      请求 路由 协议
      开发知识点-Django_第124张图片
      开发知识点-Django_第125张图片
      开发知识点-Django_第126张图片
      开发知识点-Django_第127张图片
      开发知识点-Django_第128张图片
      开发知识点-Django_第129张图片
      开发知识点-Django_第130张图片
      增量开发

      开发知识点-Django_第131张图片
      开发知识点-Django_第132张图片
      开发知识点-Django_第133张图片
      开发知识点-Django_第134张图片
      开发知识点-Django_第135张图片

      开发知识点-Django_第136张图片

      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      开发知识点-Django_第137张图片
      开发知识点-Django_第138张图片
      开发知识点-Django_第139张图片
      在这里插入图片描述
      开发知识点-Django_第140张图片
      开发知识点-Django_第141张图片
      开发知识点-Django_第142张图片
      开发知识点-Django_第143张图片
      开发知识点-Django_第144张图片
      开发知识点-Django_第145张图片
      开发知识点-Django_第146张图片
      开发知识点-Django_第147张图片
      开发知识点-Django_第148张图片

      开发知识点-Django_第149张图片
      开发知识点-Django_第150张图片





      6 GET请求和POST请求

      开发知识点-Django_第151张图片
      开发知识点-Django_第152张图片
      开发知识点-Django_第153张图片
      开发知识点-Django_第154张图片
      开发知识点-Django_第155张图片

      查询字符串

      防止 明文传递 敏感数据
      开发知识点-Django_第156张图片
      参数字典
      get取值 默认值

      开发知识点-Django_第157张图片
      开发知识点-Django_第158张图片
      开发知识点-Django_第159张图片

      开发知识点-Django_第160张图片
      开发知识点-Django_第161张图片
      开发知识点-Django_第162张图片
      500 响应

      在这里插入图片描述
      开发知识点-Django_第163张图片
      开发知识点-Django_第164张图片
      在这里插入图片描述
      开发知识点-Django_第165张图片

      开发知识点-Django_第166张图片
      开发知识点-Django_第167张图片
      开发知识点-Django_第168张图片
      开发知识点-Django_第169张图片
      开发知识点-Django_第170张图片

      开发知识点-Django_第171张图片
      开发知识点-Django_第172张图片
      开发知识点-Django_第173张图片
      开发知识点-Django_第174张图片
      开发知识点-Django_第175张图片
      开发知识点-Django_第176张图片
      开发知识点-Django_第177张图片

      开发知识点-Django_第178张图片
      开发知识点-Django_第179张图片
      开发知识点-Django_第180张图片

      开发知识点-Django_第181张图片





      7 Django设计模式及模板层

      在这里插入图片描述
      在这里插入图片描述
      开发知识点-Django_第182张图片
      开发知识点-Django_第183张图片

      Controller — 主路由
      开发知识点-Django_第184张图片
      开发知识点-Django_第185张图片
      开发知识点-Django_第186张图片

      引擎 数据怎么来 怎么调用

      把 Templates 位置 配置到 DIRS 里


      开发知识点-Django_第187张图片
      开发知识点-Django_第188张图片
      在这里插入图片描述
      开发知识点-Django_第189张图片
      开发知识点-Django_第190张图片
      开发知识点-Django_第191张图片
      开发知识点-Django_第192张图片
      开发知识点-Django_第193张图片
      开发知识点-Django_第194张图片
      开发知识点-Django_第195张图片
      开发知识点-Django_第196张图片
      开发知识点-Django_第197张图片
      开发知识点-Django_第198张图片
      开发知识点-Django_第199张图片
      开发知识点-Django_第200张图片





      8 模板层-变量和标签

      在这里插入图片描述
      开发知识点-Django_第201张图片
      开发知识点-Django_第202张图片
      开发知识点-Django_第203张图片
      开发知识点-Django_第204张图片
      开发知识点-Django_第205张图片
      开发知识点-Django_第206张图片
      开发知识点-Django_第207张图片
      开发知识点-Django_第208张图片
      在这里插入图片描述
      开发知识点-Django_第209张图片
      开发知识点-Django_第210张图片
      开发知识点-Django_第211张图片
      开发知识点-Django_第212张图片
      开发知识点-Django_第213张图片
      开发知识点-Django_第214张图片
      开发知识点-Django_第215张图片
      开发知识点-Django_第216张图片
      开发知识点-Django_第217张图片
      开发知识点-Django_第218张图片

      ctrl alt L 格式化

      开发知识点-Django_第219张图片

      局部变量 locals
      开发知识点-Django_第220张图片
      开发知识点-Django_第221张图片
      开发知识点-Django_第222张图片

      开发知识点-Django_第223张图片
      开发知识点-Django_第224张图片

      开发知识点-Django_第225张图片
      开发知识点-Django_第226张图片
      开发知识点-Django_第227张图片
      开发知识点-Django_第228张图片
      开发知识点-Django_第229张图片
      在这里插入图片描述
      在这里插入图片描述
      开发知识点-Django_第230张图片
      开发知识点-Django_第231张图片
      开发知识点-Django_第232张图片
      开发知识点-Django_第233张图片





      9 模板层-过滤器和继承

      在这里插入图片描述
      在这里插入图片描述
      开发知识点-Django_第234张图片
      开发知识点-Django_第235张图片
      开发知识点-Django_第236张图片
      在这里插入图片描述
      开发知识点-Django_第237张图片

      开发知识点-Django_第238张图片
      开发知识点-Django_第239张图片
      开发知识点-Django_第240张图片
      开发知识点-Django_第241张图片
      开发知识点-Django_第242张图片
      开发知识点-Django_第243张图片
      HTML 转义 <> 进行 转义
      开发知识点-Django_第244张图片
      开发知识点-Django_第245张图片
      开发知识点-Django_第246张图片
      在这里插入图片描述
      开发知识点-Django_第247张图片


      开发知识点-Django_第248张图片
      开发知识点-Django_第249张图片
      开发知识点-Django_第250张图片
      开发知识点-Django_第251张图片
      开发知识点-Django_第252张图片
      开发知识点-Django_第253张图片
      开发知识点-Django_第254张图片

      继承 重写

      开发知识点-Django_第255张图片
      开发知识点-Django_第256张图片
      开发知识点-Django_第257张图片
      开发知识点-Django_第258张图片
      开发知识点-Django_第259张图片

      开发知识点-Django_第260张图片
      开发知识点-Django_第261张图片
      开发知识点-Django_第262张图片
      开发知识点-Django_第263张图片





      10 url反向解析

      开发知识点-Django_第264张图片
      在这里插入图片描述
      开发知识点-Django_第265张图片
      开发知识点-Django_第266张图片
      开发知识点-Django_第267张图片
      开发知识点-Django_第268张图片
      开发知识点-Django_第269张图片
      在这里插入图片描述
      开发知识点-Django_第270张图片
      开发知识点-Django_第271张图片
      在这里插入图片描述
      开发知识点-Django_第272张图片

      开发知识点-Django_第273张图片
      开发知识点-Django_第274张图片
      开发知识点-Django_第275张图片
      开发知识点-Django_第276张图片
      开发知识点-Django_第277张图片
      在这里插入图片描述
      开发知识点-Django_第278张图片

      开发知识点-Django_第279张图片
      开发知识点-Django_第280张图片
      动态 解析
      开发知识点-Django_第281张图片
      开发知识点-Django_第282张图片
      开发知识点-Django_第283张图片
      开发知识点-Django_第284张图片
      开发知识点-Django_第285张图片

      开发知识点-Django_第286张图片





      11 静态文件

      开发知识点-Django_第287张图片
      开发知识点-Django_第288张图片
      开发知识点-Django_第289张图片
      开发知识点-Django_第290张图片
      开发知识点-Django_第291张图片
      开发知识点-Django_第292张图片
      开发知识点-Django_第293张图片
      开发知识点-Django_第294张图片

      注意 元组 中的 逗号
      开发知识点-Django_第295张图片
      在这里插入图片描述
      开发知识点-Django_第296张图片
      开发知识点-Django_第297张图片
      开发知识点-Django_第298张图片
      开发知识点-Django_第299张图片
      开发知识点-Django_第300张图片

      开发知识点-Django_第301张图片
      开发知识点-Django_第302张图片
      开发知识点-Django_第303张图片

      开发知识点-Django_第304张图片
      开发知识点-Django_第305张图片

      开发知识点-Django_第306张图片
      在这里插入图片描述
      开发知识点-Django_第307张图片
      开发知识点-Django_第308张图片
      开发知识点-Django_第309张图片
      开发知识点-Django_第310张图片

      开发知识点-Django_第311张图片

      开发知识点-Django_第312张图片
      开发知识点-Django_第313张图片

      开发知识点-Django_第314张图片

      在这里插入图片描述
      在这里插入图片描述
      开发知识点-Django_第315张图片
      开发知识点-Django_第316张图片
      开发知识点-Django_第317张图片
      在这里插入图片描述

      12 Django 应用及分布式路由

      开发知识点-Django_第318张图片开发知识点-Django_第319张图片
      解耦企业业务 每个文件夹 都是 独立的 MTV

      开发知识点-Django_第320张图片
      开发知识点-Django_第321张图片
      在这里插入图片描述
      在这里插入图片描述

      创建之后 注册 一下

      开发知识点-Django_第322张图片
      开发知识点-Django_第323张图片
      开发知识点-Django_第324张图片
      开发知识点-Django_第325张图片
      开发知识点-Django_第326张图片
      开发知识点-Django_第327张图片

      开发知识点-Django_第328张图片
      开发知识点-Django_第329张图片
      开发知识点-Django_第330张图片
      开发知识点-Django_第331张图片
      开发知识点-Django_第332张图片
      开发知识点-Django_第333张图片
      开发知识点-Django_第334张图片

      开发知识点-Django_第335张图片
      开发知识点-Django_第336张图片
      开发知识点-Django_第337张图片

      开发知识点-Django_第338张图片
      开发知识点-Django_第339张图片
      开发知识点-Django_第340张图片

      13 模型层及ORM介绍

      开发知识点-Django_第341张图片
      开发知识点-Django_第342张图片
      开发知识点-Django_第343张图片
      在这里插入图片描述
      在这里插入图片描述

       
      npm run lint -- --fix  
      
      pip install pymysql
      
      

      开发知识点-Django_第344张图片
      开发知识点-Django_第345张图片

      开发知识点-Django_第346张图片
      开发知识点-Django_第347张图片
      在这里插入图片描述
      开发知识点-Django_第348张图片
      开发知识点-Django_第349张图片
      开发知识点-Django_第350张图片
      开发知识点-Django_第351张图片
      在这里插入图片描述
      开发知识点-Django_第352张图片
      开发知识点-Django_第353张图片
      开发知识点-Django_第354张图片
      开发知识点-Django_第355张图片
      开发知识点-Django_第356张图片
      开发知识点-Django_第357张图片
      在这里插入图片描述
      开发知识点-Django_第358张图片
      开发知识点-Django_第359张图片
      开发知识点-Django_第360张图片
      开发知识点-Django_第361张图片

      同步表结构



      开发知识点-Django_第362张图片
      开发知识点-Django_第363张图片

      默认 初始化 id 自增

      开发知识点-Django_第364张图片
      开发知识点-Django_第365张图片
      开发知识点-Django_第366张图片
      在这里插入图片描述
      开发知识点-Django_第367张图片
      开发知识点-Django_第368张图片

      14 ORM-基础字段及选项

      开发知识点-Django_第369张图片
      开发知识点-Django_第370张图片
      开发知识点-Django_第371张图片
      开发知识点-Django_第372张图片
      开发知识点-Django_第373张图片
      在这里插入图片描述
      开发知识点-Django_第374张图片
      开发知识点-Django_第375张图片
      开发知识点-Django_第376张图片
      开发知识点-Django_第377张图片
      开发知识点-Django_第378张图片
      在这里插入图片描述

      django 模型models 常用字段

      
      
              
      1、models.AutoField  
             自增列 = int(11)
             如果没有的话,默认会生成一个名称为 id 的列
             如果要显式的自定义一个自增列,必须设置primary_key=True。
       
      2、models.CharField  
             字符串字段
        必须设置max_length参数
       
      3、models.BooleanField   
             布尔类型=tinyint(1)
        不能为空,可添加Blank=True
       
      4、models.ComaSeparatedIntegerField  
             用逗号分割的数字=varchar
        继承CharField,所以必须 max_lenght 参数
       
      5、models.DateField
             日期类型 date
        DateField.auto_now:保存时自动设置该字段为现在日期,最后修改日期
             DateField.auto_now_add:当该对象第一次被创建是自动设置该字段为现在日期,创建日期。
       
      6、models.DateTimeField  
             日期时间类型 datetime
        同DateField的参数
       
      7、models.Decimal  
             十进制小数类型 = decimal
             DecimalField.max_digits:数字中允许的最大位数
             DecimalField.decimal_places:存储的十进制位数
       
      8、models.EmailField  
        一个带有检查 Email 合法性的 CharField
       
      9、models.FloatField  
             浮点类型 = double
       
      10、models.IntegerField  
             整形
       
      11、models.BigIntegerField  
             长整形
        integer_field_ranges = {
          'SmallIntegerField': (-32768, 32767),
          'IntegerField': (-2147483648, 2147483647),
          'BigIntegerField': (-9223372036854775808, 9223372036854775807),
          'PositiveSmallIntegerField': (0, 32767),
          'PositiveIntegerField': (0, 2147483647),
        }
       
      12、models.GenericIPAddressField  
              一个带有检查 IP地址合法性的 CharField
       
      13、models.NullBooleanField  
             允许为空的布尔类型
       
      14、models.PositiveIntegerFiel  
             正整数
       
      15、models.PositiveSmallIntegerField  
             正smallInteger
       
      16、models.SlugField  
             减号、下划线、字母、数字
       
      17、models.SmallIntegerField  
             数字
        数据库中的字段有:tinyint、smallint、int、bigint
       
      18、models.TextField  
              大文本。默认对应的form标签是textarea。
       
      19、models.TimeField  
             时间 HH:MM[:ss[.uuuuuu]]
       
      20、models.URLField  
              一个带有URL合法性校验的CharField。
       
      21、models.BinaryField  
             二进制
             存储二进制数据。不能使用filter函数获得QuerySet。
       
      22、models.ImageField   
             图片
             ImageField.height_field、ImageField.width_field:如果提供这两个参数,则图片将按提供的高度和宽度规格保存。
             该字段要求 Python Imaging 库Pillow。
             会检查上传的对象是否是一个合法图片。
       
      23、models.FileField(upload_to=None[, max_length=100, ** options])
             文件
             FileField.upload_to:一个用于保存上传文件的本地文件系统路径,该路径由 MEDIA_ROOT 中设置
             这个字段不能设置primary_key和unique选项.在数据库中存储类型是varchar,默认最大长度为100
       
      24、models.FilePathField(path=None[, math=None, recursive=False, max_length=100, **options])
             FilePathField.path:文件的绝对路径,必填
             FilePathField.match:用于过滤路径下文件名的正则表达式,该表达式将用在文件名上(不包括路径)。
             FilePathField.recursive:True 或 False,默认为 False,指定是否应包括所有子目录的路径。
             例如:FilePathField(path="/home/images", match="foo.*", recursive=True)
                               将匹配“/home/images/foo.gif”但不匹配“/home/images/foo/bar.gif”     
        
      
      2. django 模型models 字段常用参数
       
      1、null
              如果是True,Django会在数据库中将此字段的值置为NULL,默认值是False
       
      2、blank
        如果为True时django的 Admin 中添加数据时可允许空值,可以不填。如果为False则必须填。默认是False。
             null纯粹是与数据库有关系的。而blank是与页面必填项验证有关的
       
      3、primary_key = False
         主键,对AutoField设置主键后,就会代替原来的自增 id 列
       
      4、auto_now 和 auto_now_add
        auto_now   自动创建---无论添加或修改,都是当前操作的时间
        auto_now_add  自动创建---永远是创建时的时间
       
      5、choices
            一个二维的元组被用作choices,如果这样定义,Django会select box代替普通的文本框,
            并且限定choices的值是元组中的值
            GENDER_CHOICE = (
                  (u'M', u'Male'),
                  (u'F', u'Female'),
            )
            gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
       
      6、max_length
              字段长度
       
      7、default
              默认值
       
      8、verbose_name  
             Admin中字段的显示名称,如果不设置该参数时,则与属性名。
       
      9、db_column  
             数据库中的字段名称
       
      10、unique=True  
            不允许重复
       
      11、db_index = True  
           数据库索引
       
      12、editable=True  
            在Admin里是否可编辑
       
      13、error_messages=None  
            错误提示
       
      14、auto_created=False  
            自动创建
       
      15、help_text  
            在Admin中提示帮助信息
       
      16、validators=[]
               验证器
       
      17、upload-to
              文件上传时的保存上传文件的目录
      

      开发知识点-Django_第379张图片

      布尔型

      变长字符

      开发知识点-Django_第380张图片
      开发知识点-Django_第381张图片
      开发知识点-Django_第382张图片
      开发知识点-Django_第383张图片

      开发知识点-Django_第384张图片
      开发知识点-Django_第385张图片
      开发知识点-Django_第386张图片
      开发知识点-Django_第387张图片
      开发知识点-Django_第388张图片
      开发知识点-Django_第389张图片
      开发知识点-Django_第390张图片
      开发知识点-Django_第391张图片
      开发知识点-Django_第392张图片
      开发知识点-Django_第393张图片

      继承 Model 类属性

      开发知识点-Django_第394张图片
      开发知识点-Django_第395张图片

      开发知识点-Django_第396张图片
      开发知识点-Django_第397张图片
      开发知识点-Django_第398张图片
      在这里插入图片描述
      开发知识点-Django_第399张图片

      表明 app_模型类名

      开发知识点-Django_第400张图片

      开发知识点-Django_第401张图片
      开发知识点-Django_第402张图片

      表 列 字段

      开发知识点-Django_第403张图片
      开发知识点-Django_第404张图片

      开发知识点-Django_第405张图片
      开发知识点-Django_第406张图片
      开发知识点-Django_第407张图片
      开发知识点-Django_第408张图片

      15 ORM-基本操作-创建数据

      开发知识点-Django_第409张图片
      开发知识点-Django_第410张图片
      开发知识点-Django_第411张图片
      开发知识点-Django_第412张图片
      开发知识点-Django_第413张图片

      python3.7 mysql 部署 问题

      开发知识点-Django_第414张图片

      • 不要看 这个解决方案 有问题 还是 decode

      只执行 增量 文件

      开发知识点-Django_第415张图片
      在这里插入图片描述

      开发知识点-Django_第416张图片

      开发知识点-Django_第417张图片
      在这里插入图片描述
      开发知识点-Django_第418张图片
      开发知识点-Django_第419张图片
      开发知识点-Django_第420张图片
      开发知识点-Django_第421张图片

      对象 初始化 再 save

      开发知识点-Django_第422张图片
      在这里插入图片描述

      开发知识点-Django_第423张图片
      开发知识点-Django_第424张图片
      开发知识点-Django_第425张图片

      引進模型類

      开发知识点-Django_第426张图片
      开发知识点-Django_第427张图片
      开发知识点-Django_第428张图片
      开发知识点-Django_第429张图片
      开发知识点-Django_第430张图片
      开发知识点-Django_第431张图片
      开发知识点-Django_第432张图片
      开发知识点-Django_第433张图片

      P16 ORM-查询操作

      开发知识点-Django_第434张图片
      开发知识点-Django_第435张图片
      开发知识点-Django_第436张图片
      开发知识点-Django_第437张图片
      开发知识点-Django_第438张图片

      模型 類 數組 循環 索引 切片 的 操作

      模型類對象 取中的 屬性

      开发知识点-Django_第439张图片
      开发知识点-Django_第440张图片
      开发知识点-Django_第441张图片

      類數組 [ , … ]

      开发知识点-Django_第442张图片
      开发知识点-Django_第443张图片
      开发知识点-Django_第444张图片
      开发知识点-Django_第445张图片
      开发知识点-Django_第446张图片
      开发知识点-Django_第447张图片

      不再是 类的 实例化对象 object

      开发知识点-Django_第448张图片
      开发知识点-Django_第449张图片

      取值 用 字典 取 key 的 这种方式

      开发知识点-Django_第450张图片

      元组 用 索引取值

      开发知识点-Django_第451张图片
      开发知识点-Django_第452张图片
      开发知识点-Django_第453张图片
      开发知识点-Django_第454张图片

      .all 的 排序 返回 object

      开发知识点-Django_第455张图片

      灵活 组合 顺序 不用想

      开发知识点-Django_第456张图片
      开发知识点-Django_第457张图片
      开发知识点-Django_第458张图片
      开发知识点-Django_第459张图片

      locals 把 视图函数 的 局部变量 传到 视图里

      开发知识点-Django_第460张图片
      开发知识点-Django_第461张图片
      开发知识点-Django_第462张图片
      开发知识点-Django_第463张图片
      开发知识点-Django_第464张图片
      开发知识点-Django_第465张图片
      开发知识点-Django_第466张图片

      结构 的 元素 表现形式 要注意 object 字典 元组

      17 ORM-查询操作

      开发知识点-Django_第467张图片

      条件查询

      开发知识点-Django_第468张图片
      开发知识点-Django_第469张图片
      开发知识点-Django_第470张图片

      开发知识点-Django_第471张图片

      P46 8.04-项目部署-uwsgi

      在这里插入图片描述
      开发知识点-Django_第472张图片
      开发知识点-Django_第473张图片
      开发知识点-Django_第474张图片
      开发知识点-Django_第475张图片
      开发知识点-Django_第476张图片
      开发知识点-Django_第477张图片
      开发知识点-Django_第478张图片
      在这里插入图片描述

      CentOS7安装uwsgi遇到的坑
      错误原因:没有装 python-dev
      注意: cnetos系统下,并不是交python-dev,而是叫python-devel
      由于我的python版本是3.6.7的,所以我这里安装的是python36-devel
      
      yum install python36-devel
      yum install uwsgi
      
      
      通过 yum search python3 可以搜索出python3有关的包
      

      开发知识点-Django_第479张图片

      	然后可以进行安装 uwsgi      这么解决   by:aming   2021/09/28
      

      开发知识点-Django_第480张图片
      在这里插入图片描述
      开发知识点-Django_第481张图片

      在这里插入图片描述
      开发知识点-Django_第482张图片
      开发知识点-Django_第483张图片
      在这里插入图片描述
      开发知识点-Django_第484张图片
      开发知识点-Django_第485张图片
      开发知识点-Django_第486张图片
      开发知识点-Django_第487张图片
      开发知识点-Django_第488张图片
      开发知识点-Django_第489张图片
      在这里插入图片描述
      开发知识点-Django_第490张图片
      在这里插入图片描述
      开发知识点-Django_第491张图片
      开发知识点-Django_第492张图片
      开发知识点-Django_第493张图片
      开发知识点-Django_第494张图片
      开发知识点-Django_第495张图片

      P47 8.05-项目部署-nginx

      在这里插入图片描述开发知识点-Django_第496张图片
      开发知识点-Django_第497张图片
      开发知识点-Django_第498张图片

      Kill -9

      开发知识点-Django_第499张图片
      开发知识点-Django_第500张图片
      开发知识点-Django_第501张图片
      开发知识点-Django_第502张图片
      开发知识点-Django_第503张图片



      在这里插入图片描述

      开发知识点-Django_第504张图片
      开发知识点-Django_第505张图片
      开发知识点-Django_第506张图片
      在这里插入图片描述
      开发知识点-Django_第507张图片
      开发知识点-Django_第508张图片
      开发知识点-Django_第509张图片
      开发知识点-Django_第510张图片
      开发知识点-Django_第511张图片
      开发知识点-Django_第512张图片

      ​    
      ​  
      ​      location / {
      ​           include uwsgi_params;
      ​           uwsgi_pass 127.0.0.1:xxxx;  #端口要和uwsgi里配置的一样
      ​           uwsgi_param UWSGI_SCRIPT quwan_app.wsgi;  #wsgi.py所在的目录名+.wsgi
      ​           uwsgi_param UWSGI_CHDIR /www/wwwroot/www.xxxx.top/; #项目路径
      ​        }
      ​          location /static/ {
      ​          alias /www/wwwroot/www.xxxx.cn/static/media/; #静态资源路径
      ​          }
      ​    
      ​    
      


      在这里插入图片描述

      开发知识点-Django_第513张图片
      开发知识点-Django_第514张图片
      开发知识点-Django_第515张图片

      看日志

      在这里插入图片描述
      在这里插入图片描述
      开发知识点-Django_第516张图片

      kill掉 端口 进程 和 ini启动的 进程

      开发知识点-Django_第517张图片

      开发知识点-Django_第518张图片
      开发知识点-Django_第519张图片
      开发知识点-Django_第520张图片

      P48 8.06-项目部署-nginx

      开发知识点-Django_第521张图片
      在这里插入图片描述
      开发知识点-Django_第522张图片
      开发知识点-Django_第523张图片
      开发知识点-Django_第524张图片
      开发知识点-Django_第525张图片开发知识点-Django_第526张图片




      开发知识点-Django_第527张图片

      开发知识点-Django_第528张图片
      在这里插入图片描述
      开发知识点-Django_第529张图片
      开发知识点-Django_第530张图片
      开发知识点-Django_第531张图片
      开发知识点-Django_第532张图片
      开发知识点-Django_第533张图片
      开发知识点-Django_第534张图片
      开发知识点-Django_第535张图片
      开发知识点-Django_第536张图片
      开发知识点-Django_第537张图片
      开发知识点-Django_第538张图片
      开发知识点-Django_第539张图片
      开发知识点-Django_第540张图片
      开发知识点-Django_第541张图片
      开发知识点-Django_第542张图片
      开发知识点-Django_第543张图片
      在这里插入图片描述
      开发知识点-Django_第544张图片
      开发知识点-Django_第545张图片
      开发知识点-Django_第546张图片
      开发知识点-Django_第547张图片
      开发知识点-Django_第548张图片
      开发知识点-Django_第549张图片
      开发知识点-Django_第550张图片
      开发知识点-Django_第551张图片
      开发知识点-Django_第552张图片

      gradlew processDebugManifest --stacktrace

      python -m django --version

      pip freeze > requirements.txt
      

      在这里插入图片描述

      留意:

      使用Python项目管理插件新建项目成功之后,会自动在项目j源码目录里创建一个虚拟环境,虚拟环境目录一般都是以项目名_venv形式命名的。

      进入虚拟环境方法:

      在命令行输入 source 项目路径/项目名_venv/bin/activate 如:

      source /www/wwwroot/myblog/myblog_venv/bin/activate
      

      项目管理器默认使用pip安装项目根目录requirements.txt内的模块,这也是之前我强调把环境依赖包文件放到项目目录下的原因,如有其他模块需要安装请手动进入虚拟环境安装。

      #把APP静态资源收集到指定的目录下,这里我收集到static目录下
      STATIC_ROOT  = os.path.join(BASE_DIR, 'static')
      

      之后在SSH终端进入项目虚拟环境:

      source /www/wwwroot/myblog/myblog_venv/bin/activate
      

      开发知识点-Django_第553张图片

      出现项目名_venv这个标记,才说明已经成功进入虚拟环境。

      然后我们使用下面的命令收集静态文件:

      python manage.py collectstatic
      

      关联查询

      on_delete参数的各个值的含义:

      
      
      on_delete=None,               # 删除关联表中的数据时,当前表与其关联的field的行为
      on_delete=models.CASCADE,     # 删除关联数据,与之关联也删除
      on_delete=models.DO_NOTHING,  # 删除关联数据,什么也不做
      on_delete=models.PROTECT,     # 删除关联数据,引发错误ProtectedError
      # models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
      on_delete=models.SET_NULL,    # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
      # models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
      on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
      on_delete=models.SET,         # 删除关联数据,
       a. 与之关联的值设置为指定值,设置:models.SET(值)
       b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
      
       
      

      开发知识点-Django_第554张图片

      Django常用的QuerySet操作

       Django常用的QuerySet操作
       
      
      在这里我根据是否支持链式调用分类进行介绍
      
      1. 支持链式调用的接口
      all
      使用频率比较高,相当于SELECT * FROM table 语句,用于查询所有数据。
      
      filter
      使用频率比较高,根据条件过滤数据,常用的条件基本上字段等于、不等于、大于、小于。当然,还有其他的,比如能修改成产生LIKE查询的:Model.objects.filter(content__contains="条件")。
      
      exclude
      与filter是相反的逻辑
      
      reverse
      将QuerySet中的结果倒叙排列
      
      distinct
      用来进行去重查询,产生SELECT DISTINCT这样的SQL查询
      
      none
      返回空的QuerySet
      
      2. 不支持链式调用的接口
      get
      比如Post.objects.get(id=1)用于查询id为1的文章:如果存在,则直接返回对应的Post实例;如果不存在,则抛出DoesNotExist异常。所以一般情况下,要使用异常捕获处理:
      
      1 try:
      2     post = Post.objects.get(id=1)
      3 except Post.DoesNotExist:
      4 #做异常情况处理
      create
      用来直接创建一个Model对象,比如post = Post.objects.create(title="一起学习")。
      
      get_or_create
      根据条件查找,如果没查找到,就调用create创建。
      
      update_or_create
      与get_or_create相同,只是用来做更新操作。
      
      count
      用于返回QuerySet有多少条记录,相当于SELECT COUNT(*) FROM table 。
      
      latest
      用于返回最新的一条记录,但要在Model的Meta中定义:get_latest_by= <用来排序的字段>。
      
      earliest
      同上,返回最早的一条记录。
      
      first
      从当前QuerySet记录中获取第一条。
      
      last
      同上,获取最后一条。
      
      exists
      返回True或者False,在数据库层面执行SELECT (1) AS "a" FROM table LIMIT 1的查询,如果只是需要判断QuerySet是否有数据,用这个接口是最合适的方式。
      
      不要用count或者len(queryset)这样的操作来判断是否存在。相反,如果可以预期接下来会用到QuerySet中的数据,可以考虑使用len(queryset)的方式来做判断,这样可以减少一次DB查询请求。
      
      bulk_create
      同create,用来批量创建记录。
      
      in_ bulk
      批量查询,接收两个参数id_ list和filed_ name。可以通过Post.objects. in_ bulk([1, 2, 3])查询出id为1、2、3的数据,返回结果是字典类型,字典类型的key为查询条件。返回结果示例: {1: , 2: ,3:}。
      
      update
      用来根据条件批量更新记录,比如: Post.objects.filter(owner__name='123').update(title='测试更新')。
      
      delete
      同update,这个接口是用来根据条件批量删除记录。需要注意的是,和delete都会触发Djiango的signal
      
      values
      当我们明确知道只需要返回某个字段的值,不需要Model实例时,用它,用法如下:
      
      1 title_list = Post.objects.filter(category_id=1).values('title')
      返回的结果包含dict的QuerySet,类似这样: 
      
      values_list
      同values,但是直接返回的是包含tuple的QuerySet:
      
      1 titles_list = Post.objects.filter(category=1).values_list('title')
      返回结果类似: 
      
      如果只是一个字段的话,可以通过增加flat=True参数,便于我们后续 处理:
      
      1 title_list = Post.objects.filter(category=1).values_list('title',flat=True)
      2 for title in title__list:
      3     print(title)
      2.1进阶接口
      除了上面介绍的常用接口外,还有其他用来提高性能的接口,在下面介绍。 在优化Django项目时,尤其要考虑这几种接口的用法。
      
      defer
      把不需要展示的字段做延迟加载。比如说,需要获取到文章中除正文外的其他字段,就可以通过posts = Post.objects.all() .defer('content'),这样拿到的记录中就不会包含content部分。但是当我们需要用到这个字段时,在使用时会去加载。代码:
      
      1 posts = Post.objects.all().defer('content')
      2 for post in posts:  #此时会执行数据库查询
      3     print (post.content)  #此时会执行数据查询,获取到content
      当不想加载某个过大的字段时(如text类型的字段),会使用defer,但是上面的演示代产生N+1的查询问题,在实际使用时千万要注意!
      
      注意:上面的代码是个不太典型的 N+1查询的问题, 一般情况下 由外键查询产生的N+1问题比较多,即一条查询请求返回N条数据,当我们操作数据时,又会产生额外的请求。这就是N+1问题,所有的ORM框架都存在这样的问题。
      
      only
      同defer接口刚好相反, 如果只想获取到所有的title记录,就可以使用only,只获取title的内容,其他值在获取时会产生额外的查询。
      
      select_related
      这就是用来解决外键产生的N+1问题的方案。我们先来看看什么情况下会产生这个问题:
      
      posts = Post.objects.all ()
      for post in posts:  #产生数据库查询
          print (post.owner)  #产生额外的数据库查询
      代码同上面类似,只是这里用的是owenr(是关联表)。它的解决方法就是用select_ related接口:
      
      post = Post.objects.all() .select_related('category')
      for post in posts: # 产生数据库查询,category数据也会一次性查询出来
          print (post.category)
      当然,这个接口只能用来解决一对多的关联关系。对于多对多的关系,还得使用下面的接口。
      
      prefetch_related
      针对多对多关系的数据,可以通过这个接口来避免N+1查询。比如,post和tag的关系可以通过这种方式来避免:
      
      posts = Post.objects.all().prefetch_related('tag')
      for post in posts:#产生两条查询语句,分别查询post和tag
          print(post.tag.al1())
      3.常用的字段查询
      contains
      包含,用来进行相似查询。
      
      icontains
      同contains,只是忽略大小写。
      
      exact
      精确匹配。
      
      iexact
      同exact,忽略大小写。
      
      in
      指定某个集合,比如Post.objects.filter(id__in=[1, 2, 3])相当于SELECT FROM table WHERE IN (1, 2, 3);。
      
      gt
      大于某个值。比如:Post.objects.filter(id__gt=1)
      
      注意:是__gt
      
      gte
      大于等于某个值。
      
      lt
      小于某个值。
      
      lte
      小于等于某个值。
      
      startswith
      以某个字符串开头,与contains类似,只是会产生LIKE '<关键词>%'这样的SQL。
      
      istartswith
      同startswith, 忽略大小写。
      
      endswith
      以某个字符串结尾。
      
      iendswith
      同endswith,忽略大小写。
      
      range
      范围查询,多用于时间范围,如Post.objects.filter(created_time__range= ('2018-05-01','2018-06-01'))会产生这样的查询: SELECT .. . WHERE created_ time BETWEEN '2018-05-01' AND '2018-06-01' ;。
      
      关于日期类的查询还有很多,比如date、year和month等,具体等需要时查文档即可。
      
      这里你需要理解的是,Django之所以提供这么多的字段查询,其原因是通过ORM来操作数据库无法做到像SQL的条件查询那么灵活。
      
      因此,这些查询条件都是用来匹配对应SQL语句的,这意味着,如果你知道某个查询在SQL中如何实现,可以对应来看Django提供的接口。
      
      3.1 进阶查询
      除了上面基础的查询语句外,Django还提供了其他封装,来满足更复杂的查询,比如 SELECT ... WHERE id = 1 OR id = 2 这样的查询,用上面的基础查询就无法满足。
      
      F
      F表达式常用来执行数据库层面的计算,从而避免出现竞争状态。比如需要处理每篇文章的访问量,假设存在post.pv这样的字段,当有用户访问时,我们对其加1:
      
      post = Post.objects.get(id=1)
      post.pv = post.pv+1
      post.save()
      这在多线程的情况下会出现问题,其执行逻辑是先获取到当前的pv值,然后将其加1后赋值给post .pv.最后保存。
      
      如果多个线程同时执行了post = Post.objects.get(id=1),那么每个线程里的post .pv值都是一样的, 执行完加1和保存之后,相当于只执行了一个加1,而不是多个。
      
      这时通过F表达式就可以方便地解决这个问题:
      
      from ajango.ab. models import F
      post = Post.objects.get(id=1)
      post.pv = F('pv') + 1
      post.save():
      这种方式最终会产生类似这样的SQL语句: UPDATE table SET pv = pv +1 WHERE ID = 1。 它在数据库层面执行原子性操作。
      
      Q
      Q表达式就是用来解决前面提到的那个OR查询的,可以这么用:
      
      from django.db.mode1s import Q
      Post.objects.filter(Q(id=1) | Q(id=2))
      或者进行AND查询:
      
      Post.objects.filter(Q(id=1) & Q(id=2))
      Count
      用来做聚合查询,比如想要得到某个分类下有多少篇文章,简单的做法就是:
      
      category = Category.objects.get(id=1)
      posts_count = category.post_set.count()
      但是如果想要把这个结果放到category上呢?通过category.post_count可以访问到:
      
      from django.db.models import Count
      categories = Category.objects.annotate(posts_count=Count('post'))
      print(categories[0].posts_count)
      这相当于给category动态增加了属性post_count,而这个属性的值来源于Count('post'),最后可以用int取整。
      
      Sum
      同Count类似,只是它是用来做合计的。比如想要统计所有数据字段的总和,可以这么做:
      
      from django.db.models import Sum
      Post.objects.all().aggregate(a=Sum('字段'))
      #输出类似结果:{'a':487}为字典
      python中对字典中键值对的获取:
      
      for i in book:
          print(i)#键的获取
          print(book[i])#值的获取
      上面演示了QuerySet的annotate和aggregate的用法,其中前者用来給QuerySet结果増加属性,后者只用来直接计算结果,这些聚合表达式都可以与它们结合使用。
      
      除了Count和Sum外,还有Avg、Min和Max等表达式,均用来满足我们对SQL査洵的需求。
      

      开发知识点-Django_第555张图片
      开发知识点-Django_第556张图片

      • 语法
      • 路径导向
        开发知识点-Django_第557张图片
      • 蟒蛇—> google
      • 双态 动态 静态 自动记忆管理(java 有 C没有)
        开发知识点-Django_第558张图片
      • 符号处理 后端平行处理
      • 语法形态
      • 数值应用 运算
      • 连续 分散
      • 语法适合 特别学术需求

      开发知识点-Django_第559张图片

      • 框架转换
        开发知识点-Django_第560张图片
        开发知识点-Django_第561张图片
      • 空白键 缩排 跳行 有意义 (其他语言得 “ ;”{ }“)
      • \ 转义字符
        开发知识点-Django_第562张图片
        开发知识点-Django_第563张图片
      • 模组 变量
      • 区分大小写

      在这里插入图片描述开发知识点-Django_第564张图片
      开发知识点-Django_第565张图片

      开发知识点-Django_第566张图片在这里插入图片描述开发知识点-Django_第567张图片开发知识点-Django_第568张图片开发知识点-Django_第569张图片开发知识点-Django_第570张图片在这里插入图片描述开发知识点-Django_第571张图片开发知识点-Django_第572张图片开发知识点-Django_第573张图片开发知识点-Django_第574张图片开发知识点-Django_第575张图片开发知识点-Django_第576张图片开发知识点-Django_第577张图片开发知识点-Django_第578张图片开发知识点-Django_第579张图片开发知识点-Django_第580张图片

      前后端分离跨域方案

      跨域请求存在诸多安全问题,例如CSRF攻击等,

      浏览器针对这个安全问题会有一个同源策略,必须是我们上面说到的同源请求,才能顺利发出请求。

      解决方案

      1.JSONP,比较原始的方法,
        本质上是利用html的一些不受同源策略影响的标签,
        诸如:、、、

      2.CORS,Cross-Origin Resource Sharing,是一个新的 W3C 标准,
        它新增的一组HTTP首部字段,允许服务端其声明哪些源站有权限访问哪些资源。
        换言之,它允许浏览器向声明了 CORS 的跨域服务器,发出 XMLHttpReuest 请求
        ,从而克服 Ajax 只能同源使用的限制。
        在我们的django框架中就是利用CORS来解决跨域请求的问题。

      Django中如何使用CORS

      打开cmd,执行命令:pip install django-cors-headers

      开发知识点-Django_第581张图片

      修改django项目中的setting.py,
         INSTALLED_APPS = [
             'django.contrib.admin',
             'django.contrib.auth',
            'django.contrib.contenttypes',
            'django.contrib.sessions',
            'django.contrib.messages',
             'django.contrib.staticfiles',
             'corsheaders',#这是我们的主角,放在新建的其他项目之前
             'app01',
        ]
        MIDDLEWARE = [
            'django.middleware.security.SecurityMiddleware',
            'django.contrib.sessions.middleware.SessionMiddleware',
            'corsheaders.middleware.CorsMiddleware', #注意顺序,必须放在这儿
            'django.middleware.common.CommonMiddleware',
            'django.middleware.csrf.CsrfViewMiddleware',
            'django.contrib.auth.middleware.AuthenticationMiddleware',
            'django.contrib.messages.middleware.MessageMiddleware',
            'django.middleware.clickjacking.XFrameOptionsMiddleware',
        ]
      
      CORS_ALLOW_CREDENTIALS = True
      CORS_ORIGIN_ALLOW_ALL = True
      #允许所有的请求头
      CORS_ALLOW_HEADERS = ('*')
      
      pip freeze > requirements.txt
      

      服务器 中 重新 安装 依赖

       pip install -r requirements.txt
      

      开发知识点-Django_第582张图片

      • 更新 settings 文件

      开发知识点-Django_第583张图片
      在这里插入图片描述

      centos django uwsgi 指定版本

      系统版本

      在这里插入图片描述
      在这里插入图片描述

       wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
      

      在这里插入图片描述

       tar zxvf uwsgi-latest.tar.gz 
      

      编译:

      python  uwsgiconfig.py --build
      

      这里的python 即指定uwsgi项目运行的python环境,在这之前,我做了软链接指向了我的python3.7环境

      开发知识点-Django_第584张图片

      安装:

       python3 setup.py install
      

      开发知识点-Django_第585张图片
      在这里插入图片描述
      在这里插入图片描述

      然后进行软链接、系统便能够识别uwsgi命令

      ln -s   uwsgi目录   /usr/bin/uwsgi
      
       ln -s /root/myProject/uwsgi/uwsgi-2.0.17.1/uwsgi /usr/bin/uwsgi
      

      之后再用uwsgi去运行项目时、会自动调用上面编译的环境。

      开发知识点-Django_第586张图片

      使用Django生成验证码 并发送qq邮箱

      一、登录QQ邮箱–>设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

      开发知识点-Django_第587张图片
      开发知识点-Django_第588张图片

       
      # 设置邮件域名 发送邮件服务器:smtp.qq.com
      EMAIL_HOST = 'smtp.qq.com'
      # 设置端口号,为数字  使用SSL,端口号465587
      EMAIL_PORT = 25
      # 设置发件人邮箱
      EMAIL_HOST_USER = 'xxxxxxx'
      # 设置发件人授权码
      EMAIL_HOST_PASSWORD = 'xxxxxxxx'
      # 设置是否启用安全连接
      EMAIL_USE_TLS = True
      
       # redis连接
      REDIS_CON = redis.StrictRedis(host='localhost', port=6379)
      
       # 随机验证码
      def vercode(user):
          res1 = ''
          for i in range(4):
              num = random.randint(0, 9)
              res1 += str(num)
              REDIS_CON.set(f'{user}', res1)
              REDIS_CON.expire(f'{user}', 10)
          return res1
      
      class Send_Email(View):
          def get(self, request):
              re_send = request.GET.get('email')
              sbj = '测试邮箱发送验证码'
              msg = f'您的验证码为:{vercode(re_send)}'
              from_send = EMAIL_HOST_USER
              # subject 标题 message 内容 from_email 发送人 recipient_list 接收人(多个)
              res = send_mail(subject=sbj, message=msg, from_email=from_send, recipient_list=[re_send])
              if res == 1:
                  return render(request, 'send_email.html')
              else:
                  return render(request, 'send_email.html')
      
      class register(View):
          def get(self, request):
              code = request.GET.get('code')
              email = request.GET.get('email')
              if email:
                  scode = REDIS_CON.get(email)
                  if scode:
                      if code == scode.decode('utf-8'):
                          print('验证成功')
                      else:
                          print('验证码不正确')
                  else:
                      print('验证码已失效')
              else:
                  print('邮箱不正确')
              return HttpResponse('ok')
      
      
       <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>发送邮箱</title>
          <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
      </head>
      <body>
      邮箱:<input type="text" name="email" id="email_id">
      <input type='submit' value="发送邮箱" onclick="send()">
      </body>
      <script>
          function send() {
              $.ajax({
                  url:'http://127.0.0.1:8000/app01/send_email/',
                  method:'get',
                  data:{
                      'email':document.getElementById('email_id').value
                  }
              })
          }
      </script>
      </html>
      
      

      你可能感兴趣的:(django,python,后端)