学习环境
- Ubuntu
- 虚拟机(双系统安装)
- 系统就是软件
- 光盘安装(淘汰)
- U盘安装(推荐)
- 硬盘安装
- python开发环境
- CentOS
- python2.7
- python3.4
- Ubuntu
- python2.7
- python3.5
- python虚拟环境
- python特有
- 隔离不同的python环境
- 隔离不同项目的依赖
- 数据库
- 关系型数据库MySQL
- apt install mysql-server
- apt install mysql-workbench
- 非关系型数据库(NoSQL)
- Redis
- MongoDB
- 关系型数据库MySQL
- MySQLWorkbench
- VNC
- Google Chrome
- Sougou
- CentOS
- 完美解码(离线播放器)
安装Ubuntu
- 打开VMware
- 新建一个虚拟机,选系统为Ubuntu64
- 配置用户名,密码
- 安装的时候要想提升速度,把虚拟机的网络断掉(在右下角)
电脑
- 明确需求(开发,打游戏,出差...)
- 明确预算(9000,15000)
- 开发
- SSD 固态硬盘
- CPU(i7 7xxx),8系列,标压U,台式机CPU(95w)
- 内存DDR4 2666,(8G起步,16G足够)
- 显卡(GTX1050起步)游戏,运算,(机器学习)
- 神舟,炫龙...
虚拟机
- 用户 rock
- 密码 rock1204
- MySQL 用户root,密码rock1204
- 右击可以解除锁定
Ubuntu
- 安装
- 导入环境集成好的虚拟机
- 如果是安装
- 安装VMwareTools
- 打开终端 control + alt + t
常用操作
- sudo 普通用户借用超级管理员(root)权限去执行权限
- vmware-install.pl
- ./ .当前目录/
- 看提示,背单词(每天5个,365*5,商务英语,专业英语)
- 有道词典
- 工作区
- 默认支持4个
- 快捷键 win+s
- control + alt + 方向
- 软件和更新
- 将软件源修改为 aliyun 软件源
虚拟环境
-
安装pip
- CentOS yum install pip
- Ubuntu apt install python-pip
- 记得最前面添加 sudo
-
包管理工具
- apt apt-get(旧版本中,通用,兼容)
- apt update 更新源中的软件包
- apt install xxx 安装指定的软件xxx
- apt remove xxx 卸载软件(仅卸载安装的软件)
- apt autoremove xxx 卸载软件(会卸载软件和没有用依赖包)
- apt apt-get(旧版本中,通用,兼容)
-
easy_install 和 apt install virtualenv
- apt install virtualenv
- sudo !! sudo使用超级管理员权限执行指令,!! 代表上一条指令
统一管理 pip install virtualenvwrapper
-
pip python专用的包管理工具
- pip install xxx 安装某一个软件
- 可以指定下载源 -i
- pip install xxx -i https://pypi.douban.com/simple
- pip uninstall xxx 卸载某一个软件
- pip list 列出我们所有的依赖包
- pip freeze 列出我们自己安装的所有依赖包
- pip install xxx 安装某一个软件
-
配置虚拟环境
- 在~/.bashrc中添加导出 export WORKON_HOME=/home/xxx/.virtualenvs
- 添加激活 source xxx virtualenvwrapper.sh的路径(使用 whereis 或 find进行查找)
- 创建workon_home
- 刷新环境 source ~/.bashrc
-
虚拟环境使用
- 创建虚拟环境 mkvirtualenv ENV_NAME
- mkvirtualenv ENV_NAME -p PythonPath
- 退出虚拟环境 deactivate
- 进入虚拟环境 workon ENV_NAME
- 删除虚拟环境 rmvirtualenv ENV_NAME
- 创建虚拟环境 mkvirtualenv ENV_NAME
-
虚拟环境中的安装包是隔离的
- 在哪个虚拟环境中安装,只有哪个虚拟环境中存在,其它虚拟环境不受影响
Note
安装Django
- pip install django==1.11.7
- 测试环境
- import django
- django.get_version()
开启Django项目
- django-admin startproject XXX
- 运行 python manage.py runserver
- python manage.py runserver 0.0.0.0:8000 允许本机的所有ip被外网访问
- python manage.py runserver 9000 使用本机运行,但端口是9000
- 默认运行在本地,使用的端口8000
- 创建应用 python manage.py startapp XXX
Django项目结构
- manage.py
- 管理整个项目
- XXX/settings.py
- 项目配置文件
- XXX/urls.py
- 路由器,接收用户请求,分发给视图函数(控制器)
- XXX/wsgi.py
- 网关接口,通常用在线上环境部署(开发过程中不会接触)
settings.py
- DEBUG 是否打开DEBUG
- ALLOWED_HOSTS 允许访问的主机
- INSTALLED_APPS 安装了的应用
- DATABASES 数据库配置
- LANGUAGE_CODE 中文 zh-hans
- TIME_ZONE 中国 Asia/Shanghai
Pycharm打开
- 解压
- 目录结构中会有 bin
- 进入bin
- bin 中pycharm.sh
- 执行 ./pycharm.sh
- 如果想在终端中的位置,那就配置到环境变量中
PyCharm
- alt + enter
- 万能键,代码不会写了,爆红了,爆黄了
- 数据库连接工具
- 支持常见关系型数据库
- sqlite3
- 在数据库上右击,add as source(Database)
- 在PyCharm右侧就会有sqlite3的入口了
- 第一次使用的时候需要下载驱动
- 支持常见关系型数据库
Django
- urls - > views -> templates -> 用户
- 实际书写顺序,都是从后往前写
- 最开始定制模板
- 创建视图函数,渲染模板
- 添加路由
数据动态加载
- 前提得有数据,数据存在数据库中
- 定义数据模型,和数据库中的表对应
- 定义表
- 迁移
- 生成迁移,将模型转换成数据库对应的中间映射数据(数据库并没有发生任何变更)
- 执行迁移,将中间映射的产物执行到数据库中(数据库结构发生改变)
- 动态数据请求
- models定义
- 映射到数据库中,填写数据
- views接收请求,获取数据,渲染模板
- views注册到urls(路由器)中
- 在模板中展示数据 使用for
模板语法
- {% for item in items %} 表达式
- {{ var }} 变量
数据库
- ForeignKey
- 外键,属于数据库约束
- 外键默认是可重复,对应另外一张表的主键
网络状态码
- 2xx 都是成功
- 3xx 都是不干活的
- 301 转发
- 4xx 错误,客户端错
- 5xx 错误,服务器内部错误
数据库连接
- 数据库连接需要驱动
- mysql
- pymysql
- python-mysql
- mysqlclient (对mysql安装config有要求)
ORM
- Object Relational Mapping 对象关系映射
- 数据库和对象对应关系
- 理解ORM认为它是一个翻译机
- 操作数据的时候,只需要操作对象就可以了
- 不关注具体的数据存储逻辑
- 如果修改的是模型中的方法,非数据库字段 (models.XXXField),不需要重新迁移
- 如果修改了字段和表相关的任何信息,都需要重新迁移
DB
- var
- 可变长度
- text
Template
- 使用的时候有两种位置
- 第一种是自己的应用下,好处是不需要注册,不好的地方,有多个应用的时候不能复用页面
- 第二种是放在工程的目录下,好处是如果有多个应用,可以调用相同的页面,需要注册
- 路径是绝对路径 os.path.join(BASE_DIR, 'templates')
URLS
- 默认跟路由器urls在应用中
- 在实际开发中,我们通常在自己的应用中创建自己的urls
- 在根urls中将应用的urls包含进来
- 使用的时候,路径就变成 /根路径/自己的路径/
数据查询
- 过滤器
- filter 获取符合条件的
- exclude 去除 符合条件的
- 条件句写法
- 属性__运算符=临界值
- gt 大于
- lt 小于
- gte 大于等于
- lte 小于等于
- startswith 大小写敏感的(字母a和A不一样),sqlite 大小写不敏感
- endswith
- contains
- exact
- iexact i代表ignore (忽略),忽略大小写
- icontains
- istartswith
- iendswith
- 属性名=值 (忽略大小写)
- 缓存集
- 查询的时候允许使用多个filter,多个exclude
- 但是只有第一次回去数据库查询,后续操作是对已有结果集的筛选
Q对象
- 查询条件的封装
- 支持逻辑运算 与或非 & , | , ~
- 优点
- 可以在查询的时候,更好的定位结果集的范围
对象属性
- 显示属性
- 开发者手动定义的,直接看的到的
- 隐式属性
- 系统根据需求,自动创建的对象
- objects 它是model.Manager对象
- 当我们手动创建了Manager对象的时候,它就不会自动生成了
Manager
- 创建模型
- 自己书写方法创建
- 创建对象的时候可以对字段指定默认值
- get_queryset 获取结果集的方法
- get_queryset().filter().exclude
模型继承
- 默认模型就是允许继承的,但是默认的继承处理方式不是很合理
- 默认在父类中定义的字段会存在父类的表中,子类的数据通用部分会存在父表中,子类特有数据会在子表中,子类通过外键进行级联
- 默认方式比较垃圾,效率比较低
- 数据库优化策略
- 避免IO
- 避免关系过多级联
- 开发中,需要将父类抽象化,在元信息中使用abstract=True
- 抽象化的父类不会再数据库生成表了
- 子类会将父类中的通用数据,复制到子表中
django_migration
- 作用,用来记录数据库迁移的
- 每次迁移都会在数据库中进行一个记录
- 每次生成迁移的时候,都会去库中进行检索上一次的迁移记录
- 如果我们复用数据库的时候,需要删除迁移记录
模型关系
- 1:1
- OneToOneField
- 通过外键实现
- 对外键添加唯一约束
- 人和身份证
- 在身份证中声明关系(身份证关联到人)
- 默认情况下,删除人,关联的身份证会自动被删除
- 删除身份证,人不受影响的
- 主表 (Person) 从表 (IDCard),声明关系的表就是从表
- 级联数据获取
- 从获取主, 关系是直接声明的,它是一个显性属性
- 主获取从, 关系字段是隐性属性,对象.关系模型名 (小写)
- 1:M
- 级联数据获取
- 从获取主,(多获取一),显性属性,直接获取
- 主获取从, 一获取多,隐性属性,和model.Manager同源
- 也支持查询的各种过滤
- 对象.关联对象_set. all
- all ,exclude,last,first,filter,get
- 级联数据获取
- N:M
- 底层是通过两个外键实现,两个外键存在关系表中
- UNIQUE(XX,YY) 存储的数据不能同时相等 1,1 1,2 2,1 2,2
- 删除数据的时候会删除自己的数据和关系表中的数据
- 级联数据获取
- 通过商品获取购买者(从获取主),也是一个集合,类似model.Manager 也可以进行filter,exclude,all
- 通过购买者获取所有商品(从主获取从),隐性属性 对象.关联对象_set. all fliter exclude
-
on_delete
- CASECADE 默认,默认删除级联数据
- PROTECT 保护模式,当存在级联数据的时候,删除会抛出,保护异常,不存在级联数据的时候,是允许删除的
- SETXXX
- NULL 值本身允许为空
- DEFAULT 字段本身有默认值
- 具体值 具体值