Django
MVC
-一种软件架构风格
-不是标准
-将数据操作,业务处理,界面展示进行了拆分
-核心思想:解耦合
-model
-模型,封装数据的交互操作
-CRUD
-view
-视图
-用来将数据呈现给用户
-controller
-控制器
-接受用户输入
-用来协调model和view的关系,并对数据进行操作,筛选
-流程
-控制器接受用户请求
-调用模型,获取数据
-控制器将数据展示到视图中
MTV
-本质上就是MVC,变种
-model
-template
-模板,只是一个html,充当的是MVC中view的角色,用来做数据展示
-views
-视图函数,相当于controller
SQLite
-轻量级的嵌入式数据库
-特点是小
-常用场景
-Android,ISO,wp
-数据库常规操作相似度和mysql达百分之九十五
快捷键
-万能键
-alt + enter
-参数提示
-control + p
-重命名,重构
-shift + f6
-快捷生成return
- .re
-复制一行,插入到下面
-control + d
-移动一行
-alt + shift + ↑↓
实现一个请求
-注册一个路由
-URLs中
-url
-参数 匹配规则 正则
-视图函数
-对应的是views中的一个函数
-没有括号
-去views实现对应的视图函数
-第一个参数是request
-永远记得返回response
html快捷键
-ul>li
-ul5
-ul>li5
模板配置
-两种
-在APP中进行模板配置
-只需在APP的根目录创建templates文件夹即可
-如果想让代码自动提示,我们应该标记文件夹为模板文件夹
-在项目目录中进行模板配置
-需要在项目目录中创建templates文件夹并标记
-需要在settings中进行注册
-在开发中使用第二种
-模板可以继承,复用
路由优化配置
-项目如果逻辑过于复杂,可以进行拆分
-拆分为多个APP
-继续拆分路由器urls
-在APP中创建自己的urls
-urlpatterns路由规则列表
-在根urls中进行子路由的包含
-子路由使用
-根路由规则 + 子路由的规则
models使用了ORM技术
-object relation mapping 对象关系映射
-将业务逻辑进行了一个解耦合
-object.save()
-object.delete()
-关系型数据库
-DDL
-通过models定义实现 数据库表的定义
-数据操作
-增删改查CRUD
-存储
-save()
-查询
-查所有 objects.all()
-查单个 objects.get(pk=xx)
-更新
-基于查询的
-查好的对象,修改属性,然后save()
-删除
-基于查询的
-调用delete()
连接mysql驱动
-mysqlclient
-python2,3都能直接使用
-致命缺点
-对mysql安装有要求,必须制定位置存在配置文件
-python-mysql
-python2 支持很好
-python3 不支持
-pymysql
-python2,python3都支持
-它还可以伪装成前面的库
django shell
-集成了python环境的shell终端
-通常在终端中做一些调试工作
##如何看待bug
-看日志
-先看第一条
-再看最后一条
-梳理思路
-程序在哪一个位置和预期出现偏差
表关系
-一对一
-一对多
-多对多
过滤器
-filter
-返回符合筛选条件的数据集
-exclude
-返回不符合筛选条件的数据集
-连续使用
-链式调用
状态码
-2XX
-请求成功
-3XX
-转发或重定向
-4XX
-客户端错误
-5XX
-服务器错误
获取单个对象
-查询条件没有匹配对象,会抛异常,DoesNotExist
-如果查询条件对应多个对象,会抛异常,MultipleObjectsReturned
-first和last
-默认情况下可以正常从QuerySet中获取
-隐藏bug
-排序混乱时,可能会出现获取同一个对象
-显式,手动写排序规则
切片
-和python中的切片不太一样
-QuerySet[5:15]获取第五条到第十五条的数据
-相当于sql中limit和offset
缓存集
-filter,exclude,all都不会真正的去查询数据库
-只有我们在迭代结果集,或者获取单个对象属性的时候,它才会去查询结果
-懒查询
-为了优化结构和查询
查询条件
-属性__运算符=值
-gt
-lt
-gte
-lte
-in 在某一集合中
-contains 类似于模糊查询like
-startswith
-endswith
-exact
-前面同时添加i,ignore忽略
-iexact
-icontains
-istartswith
-iendswith
-django中查询条件有时区问题
-关闭django中自定义的时区
-在数据库中创建对应的时区表
F
-可以获取我们属性的值
-可以实现一个模型的不同属性的运算操作
-还可以支持算术运算
Q
-可以对条件进行封装
-封装后可以支持逻辑运算
-与 & and
-或 | or
-非 ~ not
模型成员
-显性属性
-开发者手动书写的属性
-隐形属性
-开发者没有书写,ORM自动生成的
-如果你把隐性属性手动声明了,系统就不会为你产生隐性属性了
标签
-{% %}标识符
-标签分为单标签和成对标签
-成对标签切记不能省略,开始标签和结束标签
结构标签
-block
-块
-用来规划布局(挖坑)
-首次出现,代表规划
-第二次出现,代表填充以前的规划
-第三次出现,代表填充以前的规划,默认动作是覆盖
-如果不想覆盖,可以添加{{block.super}}
-这样就实现了增量式操作
-extends
-继承
-可以获取父模板中的所有结构
-block + extends
-化整为零
-include
-包含
-可以将页面作为一部分,嵌入到其他页面中
-include + block
-由零聚整
-三个标签也可以混合使用
-能用block + extends搞定的,就尽量不要使用include
-如果我们继承自一个父模板,子模板自己直接重写页面结构是不生效的,只能在既有坑中进行填充
静态资源
-动静分离
-创建静态文件夹
-在settings中注册STATICFILES_DIRS=[]
-在模板中使用
-先加载静态资源{% load static %}
-使用{%static ‘xxx’%} xxx 相对路径
-坑点
-仅在debug模式中可以使用
-以后需要自己单独处理
urls
-路由器
-按照列表的书写顺序进行匹配
-从上到下匹配,没有最优匹配的概念
-路由规则编写
-我们通常直接指定以^开头
-在结尾处直接添加反斜线
-路由路径中的参数使用()进行获取
-一个圆括号对应视图函数中的一个参数
-参数
-路径参数
-位置参数
-按照书写顺序匹配
-关键字参数
-按照参数名称匹配
-参数个数必须和视图函数中参数个数一致(除默认的request以外)
反向解析
-根据根路由中注册的namespace和在子路由中注册的name,这两个参数来动态获取路径
-在模板中使用{% url ‘namespace:name’ %}
-如果带有位置参数{% url ‘namespace:name’ value1 value2 [valuen…]%}
-如果带有关键字参数{% url ‘namespace:name’ key1=value1 key2=value2 [keyn=valuen…]%}
locals
-内置函数
-将局部变量,使用字典的方式进行打包
-key是变量名,value是变量中存储的数据
错误页面定制
-在模板中重写对应错误状态码页面
-关闭debug
-实现原则
-就近原则
双R
-request
-response
会话技术
-出现场景
-服务器如何识别客户端
-http在web开发中基本都是短连接,无状态的
-请求生命周期
-从request开始
-到response结束
-种类
-cookie
-客户端会话技术
-数据存储在客户端
-键值对存储
-支持过期时间
-默认cookie会自动携带,本网站所有
-cookie
-通过httpresponse
-cookie默认不支持中文
-可以加盐
-加密
-解密
-session
-服务端会话技术
-数据存储在服务器中
-默认session存储在内存中
-django中默认会把session持久化到数据库中
-django中session的默认过期时间是14天
-主键是字符串
-数据是使用了数据安全加密
-使用的base64
-在前部添加了一个混淆串
-session依赖于cookie
-token
-服务端会话技术
-自定义的session
-如果web页面开发中,使用起来和session基本一致
-如果使用在移动端或客户端开发中,通常以json形式传输,需要移动端自己存储token,需要获取token关联数据的时候,主动传递token
-对比
-cookie使用更简洁,服务器压力更小,数据不是很安全
-session服务器要维护session,相对安全
-token拥有session所有优点,自己维护略微麻烦,支持更多的终端
CSRF
-防跨站攻击
-防止恶意注册,确保客户端是我们自己的客户端
-使用了cookie中csrftoken进行验证,传输
-服务器发送给客户端,客户端将cookie获取过来,还要进行编码转换(数据安全)
-如何实现
-在存在csrftoken标签的页面中,响应会自动设置一个cookie,csrftoken
-当我们提交的时候,会自动验证csrftoken
-验证通过,正常执行以后流程,验证不通过,直接403
算法
-编码解码
-base64
-urlencode
-摘要算法,指纹算法,杂凑算法
-MD5,SHA
-MD5默认是128位的二进制
-32位的十六进制
-32位的Unicode
-单向不可逆的
-不管输入多长,输出都是固定长度
-只要输入有任意变更,输出都会发生巨大的变化
-加密
-对称加密
-一把钥匙
-DES,AES
-加密解密效率高
-钥匙一旦丢失,所有数据就全完了
-非对称加密
-两把钥匙,成对的
-公钥和私钥
-RSA,PGP
-安全性最高
-算法复杂,需要时间长
-支付宝,微信都是RSA
迁移
-分两步实现
-生成迁移文件
-执行迁移文件
-迁移文件的生成
-根据models文件生成对应的迁移文件
-根据models和已有迁移文件差别,生成新的迁移文件
-执行迁移文件
-先去迁移记录查找,哪些文件未迁移过
-app_label+迁移文件名字
-执行未迁移文件
-执行完毕,记录执行过的迁移文件
-重新迁移
-删除迁移文件
-删除迁移文件产生的表
-删除迁移记录
模型关系
-1:1
-应用场景
-用于复杂表的拆分
-扩展新功能
-django中OneToOneField
-使用的时候,关系声明还是有细微差别的
-实现
-使用外键实现的
-对外键添加了唯一约束
-数据删除
-级联表
-主表
-从表
-谁声明关系谁就是从表
-在开发中如何确认主从
-当系统遭遇不可避免毁灭时,只能保留一张表,这个表就是主表
-默认特性(CASECADE)
-从表数据删除,主表不受影响
-主表数据删除,从表数据直接删除
-PROTECT受保护
-开发中为了防止误操作,通常设置此模式
-主表如果存在级联数据,删除动作受保护,不能成功
-主表如果不存在级联数据,可以删除成功
-SET
-SET_NULL
-允许为空
-SET_DEFAULT
-存在默认值
-SET()
-指定值
-级联数据获取
-主获取从 隐性属性 默认就是级联模型的名字
-从获取主 显性属性,就是属性的名字
-1:M
-ForeignKey
-主从获取
-主获取从 隐性属性 级联模型_set
-student_set Manage的子类
-all
-filter
-exclude
-manager上能使用的函数都能使用
-从获取主
-显性属性
-M:N
-实际上最复杂
-开发中很少直接使用多对多属性,而是自己维护多对多的关系
-产生表的时候会产生单独的关系表
-关系表中存储关联表的主键,通过多个外键实现
-多个外键值不能同时相等
-级联数据获取
-从获取主
-使用属性,属性是一个manager子类
-主获取从
-与从获取主完全一样
-级联数据
-add
-remove
-clear
-set
模型继承
=django中模型支持继承
-默认继承是会将通用字段放到父表中,特定字段放在自己的表中,中间使用外键连接
-关系型数据库关系越复杂,效率越低,查询越慢
-父类表中也会存储过多的数据
-使用元信息来解决这个问题
-使模型抽象化
-抽象的模型就不会再数据库中产生映射了
-子模型映射出来的表直接包含父模型的字段
在企业开发中
-model–>sql
-sql–>model
-django也提供了很好的支持
-python manage.py inspectdb
-可以直接根据表生成模型
-元信息中包含一个属性,manage = False,表示该模型不被迁移系统管理
-如果自己的模型不想被迁移系统管理,也可以使用manage=False
缓存
-提升服务器响应速度
-将执行过的操作数据存储下来,在一定时间内,再次获取数据的时候,直接从缓存中获取
-比较理想的方案,缓存使用内存级缓存
-django内置缓存框架
AOP(面向切面编程)中间件
-实现统计功能
-统计ip
-统计浏览器
-实现权重控制
-黑名单
-白名单
-实现反爬
-反爬虫
-实现频率控制
-界面友好化
-应用交互友好化
-调用顺序
-中间件注册的时候是一个列表
-如果我们没有在切点处直接返回,中间件会依次执行
-如果直接进行了返回,后续中间件就不再执行了
-切点
-process_request
-process_view
-process_template_response
-process_response
-process_exception
-切面
项目需求分析
-主页面显示
-最简单的,数据查询,显示
-商品数据展示
-级联查询,排序
-用户系统
-核心系统
-购物车系统
-商品和用户的关系
-订单系统
-购物车数据转换成订单
-支付系统
-接口调用
-扩展
-地址管理系统
-积分系统
-会员级别
-评价系统
-优惠券系统
-数据安全
-过滤器
-反爬
-权限
-用户角色
-部署
-动静分离部署
开始开发
-基本工程搭建
-前端静态搭建
-model–>DB
-业务逻辑开发
-前后端共同开发
-ajax
前端基础架构
-base模板
-导入通用资源
-reset.css
-前端适配
-推荐百分比不推荐固定尺寸
-适配单位
-px
-em 相对单位
-默认相对于父级元素
-默认大小1em=16px
-rem 相对单位
-相对于根级元素
-默认大小1rem=16px
-弹性盒模型
-响应式布局
-项目中
屏幕宽度的十分之一作为rem的单位
数据展示
-建立数据
-先建表
-插入数据
-数据查询
用户表设计
-username
-password
-email
-phone
-icon
-is_active
-is_delete
高级密码安全工具
-不再使用单一的算法实现
-至少使用两种以上的算法
-算法中融入时间数列
-将输入数据进行哈希处理
-哈希处理之后拼接时间戳
-中间使用特定拼接符号
-将拼接好的数据进行编码
-验证策略
-将输入进行相同的哈希策略
-将数据库中的密码进行解码处理
-去除时间数列的混淆
-比较哈希码
版本升级之后,策略不兼容
-第一版本,注册之后,密码是明文
-第二版本,注册之后,密码是hash值
-第三版本,注册之后,密码是hash值+时间数列
-假定目前处于第三版本,需要同时兼容第一第二版本
-对请求的参数添加版本号,没添加的就是旧版本
-对于低版本使用特定认证,认证完,在会话中将低版本的版本号存储下来
-小米低版本兼容
-除了密码外,又添加了短信验证码
用户激活,认证
-途径
-邮件
-短信
-人工审核
-邮件
-发送邮件
-收件人地址
-发件人信息
-用户名
-密码
-服务器
-邮件服务器
-端口
-内容
-点击邮件中的链接就可以激活
-链接中存在用户的唯一标识
-标识存在过期时间
-标识存在使用次数限制
错误信息
-先将错误信息存储下来
-在错误显示页面获取错误信息
-保证错误信息只能出现一次
-获取到数据之后,直接删除
购物车
-购物多对多的关系
-用户
-商品
-订单
-订单和已购买商品是一对多的关系
-表关系
-订单表
-属于哪个用户
-订单商品表
-购物车里
-地址
-每个订单对应一个地址
-一个地址可以对应多个订单
-订单会级联收货地址表
-优惠券
-添加购物车
-需要用户
-如果用户未登录,直接跳转登陆
-需要商品
-传递商品唯一标识
-添加的合法性
-此数据不存在,创建购物车数据
-此数据存在,直接将数量加一
小技能
-js获取jquery对象属性
-attr
-可以获取任意属性
-prop
-只能获取内置属性
项目中多块逻辑拥有相同操作
-封装一个函数
-装饰器
-中间件
浏览器行为
-重定向
-跨域
购物车全选
-默认状态
*全选按钮是选中
**内部所有商品都是选中的
-*全选按钮未选中
-**内部商品中只要存在未选中的,全选就应该是未选中
-点击全选
-*原状态是选中
**-全选和所有商品都变成未选中
*-原状态是未选中
**-全选和所有商品都变成选中
-点击单个商品
-*商品由选中变成未选中
-**全选一定变成未选中
-*商品由未选中变成选中
-**那全选的默认状态就是未选中
-**可能变成选中
支付
-官方文档
-常见的支付
-支付宝
-企业资质
-营业执照
-微信
-要求同支付宝
-要认证,一次200,一年收一次
-银联
-支付宝支付
-蚂蚁金服开放平台
部署
-默认django中自带开发者服务器
-runserver
-路由处理功能,动态资源处理
-如果是debug的话,静态资源处理功能
-功能健壮,性能是比较低的,仅适用于开发
-部署不会使用单一服务器
-apache
-nginx
-http服务器
-处理静态资源
-反向代理
-uWSGI HTTP服务器
-gunicorn HTTP服务器
-邮件服务器
-流媒体服务器
部署云服务器
-从零开始
-安装云服务器系统
-ubantu 16.04
-安装一套开发环境
-python
-2.x
-3.x
-pip
-注意版本兼容
-virtualenv
-版本不兼容
-workon_home
-source xxx
-mysql
-apt 直接安装
-redis
-源码安装
-make & make test
-utils/install_server.sh
-nginx
-添加钥匙
-添加源
-update,install
-准备进行部署
-安装项目所需依赖
-pip install -r xxx.txt
-修改配置文件到指定路径
-从静态文件开始部署
-动态资源
-处理好数据
-创建库,创建表
-插入数据
-坑点
-邮件发送
-25端口是非安全端口,阿里不允许使用
-使用安全SSL端口,465/994
统计用户
-自己统计
-通过中间件
-百度统计
-友盟统计
视图函数
-FBV
-function base view
-CBV
-class base view
-类视图
-继承自View
-注册的时候使用as_view()
-入口
-不能使用请求方法的名字作为参数的名字
-只能接受类中已经存在的属性作为参数的名字
-定义了一个view
-创建了一个类视图对象
-保留,拷贝传递进来的属性和参数
-调用dispatch方法
-分发
-如果请求方法在我们的允许列表中
-从自己这个对象中获取请求方法名字小写对应的属性,如果没有找到,会给一个默认的http_method_not_allowed
-如果请求方法不在我们允许的列表中,直接就是http_method_not_allowed
-之后将参数传递,调用函数
-默认实现了options
-获取接口信息,可以获取接口都允许的请求
-简化版流程
-as_view
-dispath
-调用实现请求方法对应的函数名
-TemplateView
-多继承的子类
-继承自View
-分发
-函数dispatch
-ContextMixin
-接收上下文
-从视图函数传递到模板的内容
-函数get_context_data
-TemplateResponseMixin
-将内容渲染到模板中
-template_name
-template_engine
-response_class
-content_type
-函数render_to_response
-ListView
-MultipleObjectTemplateResponseMixin
-TemplateResponseMixin
-获取模板名字
-首先根据template_name
-如果没找到
-自己根据应用的名字,关联模型的名字,_list.html去查找
-App/book_list.html
-BaseListView
-MultipleObjectMixin
-ContextMixin
-get_queryset
-model
-View
-默认实现了get,渲染成了response
-DetailView
-SingleObjectTemplateResponseMixin
-TemplateResponseMixin
-重写了获取模板名字的方法
-BaseDetailView
nginx
-反向代理
-可以代理任意服务器
-uwsgi
-runserver
-gunicorn
-参数
-proxy_pass
-负载均衡
-upstream模块
-只需将咱们的服务器记录在内部即可
-负载均衡调度算法
-权重
-down
-back
-ip_hash
远程撸代码
-使用pycharm中SFTP
-本质上就是FTP
RESTful
-软件架构风格,是一种思想
-用在客户端和服务端这种模型中
-实现的就是前后端分离
-理解
-表现层状态转换
-表征性状态转移
-缺少主语 资源(resource)
-客户端要实现状态转换 通过请求谓词
-GET
-POST
-PUT
-DELETE
-PATCH
-api设计原则
-协议http(s)
-专属域名或前缀
-可以包含版本
-在querystring中包含过滤信息
-路径通常是名词复数
-传输格式JSON
-尽量带有超链接
-认证使用OAuth2.0
-简单实现
-针对一个接口的不同请求方式进行不同的处理
-GET/collection/
-GET/collection/id/
-POST/collection/
-POST/collection/id
-DELECT/collection/id
-接口测试,模拟请求
-pycharm自带的
-postman
-httpie
重量级RESTful
-django-rest-framework
-REST难点
-模型序列化
-正向序列化
-将模型转化成JSON
-反向序列化
-将JSON转换成模型
-序列化器
-Serializer
-helloREST
-序列化器
-视图函数
-viewsets.ModelViewSet
-CBV
-视图集合
-路由
-routers.DefaultRouter
-记得在INSTALLED_APPS添加rest_frameword
-runserver
-所有api变成可视化
-超链接
-对数据集合实现了
-路由/users/,/groups/
-get
-post
-对单个数据实现了
-路由 /users/id/,/groups/id/
-get
-post
-put
-delete
-patch
-viewsets做了视图函数的实现
-router做了路由的注册
-双R
-request
-rest_framework.request
-将django里的request作为了自己的一个属性_request
-属性和方法
-content_type
-stream
-query_params
-data
-同时兼容POST/PUT/PATCH
-user
-可以直接在请求上获取用户
-相当于在请求上添加一个属性,用户对象
-auth
-认证
-相当于在请求上添加了一个属性,属性值是token
-response
-ApiView
-renderer_classes
-渲染的类
-paeser_classes
-解析转换的类
-authentication_classes
-认证的类
-throttle_classes
-节流的类
-控制请求频率的类
-permission_classes
-权限的类
-content_negotiation_class
-内容过滤的类
-metadata_class
-元信息的类
-versioning_class
-版本控制的类