导图社区 七天学习
book七天学习笔记,从七天应该学习什么详细介绍,包括model、模型继承、静态资源、文件上传、requests等。
编辑于2022-11-11 11:07:30 北京市django_book七天学习
django第一天
mtv
本质上就是mvc的变种
模式
model
template
是一个模板充当view角色用来战死和数据
views
视图函数
相当于controller
基于pyton重量级框架,最开始用来做新闻站点
集成了太多,帮开发者做了很多选择,内置了很多功能,所以是重量级
视频教程中使用的是1.11.xx
LTS(长期支持版本)
以后学2.2 LTS现在应该已经出了
虚拟环境
mkvirtualenv
选择python版本
deactive
退出虚拟环境
workon
rmvirtualenv
删除虚拟环境
django
安装
pip install django==1.11.1
创建项目
django-admin startproject XXX
项目结构
XXX
manage.py
管理文件, 通过这个文件调用内部执行命令
__init__
settings
项目全局配置文件
中文
子主题 1
urls
跟路由
wsgi
以后用来线上部署的文件,前期用不到
启动项目
python manage.py runserver
使用开发者服务器启动项目
默认会运行在本机的8000端口
还可以添加参数
ip :端口
建立一个应用
python manage.py startApp XXX
XXX接口
__init__
views
model
admin
后台管理
apps
应用配置
test
单元测试
miragtions
迁移目录
新建应用
将应用注册到django的settings的 INSTALLED_APP中
请求流程
浏览器-urls
urls-views
views-model
model-views
views-response
编写求情
编写路由
urlpatterns
url(p1,p2)
p1正则表达式
p2对应的视图函数
编写试图函数
本质上还是一个函数
第一个参数是request
返回第一个参数必须是request
HTTPResponse
render
渲染
简写
链接数据库
默认在django中是继承数据库的
sqlite3默认
轻量级数据库,不需要用户名密码
修改数据库
在settings的 datebase中修改
实际上都是关系型数据库
mysql
驱动
mysqlicent
mysql-python
pymysql
会伪装
pip install pymysql
再工程目录的___init__文件中加入
import pymysql
pymysql.install_as_mysqldb()
user
password
host
port
name
engine
迁移
生成迁移
python manage.py makemrigeratinos
执行迁移
python manage.py mrigrate
数据操作
增删改查
存储数据
创建对象,save()
数据查询
模型。object。all()
模型。object.get()
更新
基于查询
save()
删除
基于查询
delete()
显示在模板中
先挖坑
{{var}}
再填坑
渲染模板的时候传一个上下文
上下文是一个字典
key是var,value是值
模板的兼容性很强
不传的话不会报错
多传入也会自动优化掉
浏览器是不认模板的,在到达浏览器之前已经进行了转化, 将模板语言转换成了html
for支持
数据级联
foreignKey
一对多
多记录外键
一获取多
多的一个set
grade.student_set.all()
student_set是object的一个实例
多获取一
就是一的一个属性
django第二天
model
模型
django中
数据操作映射
定义数据结构
定义类
表
属性
字段
定义模型
继承自Model
class Mate:元信息
db_table 表名
定义字段
字段类型
TextField
CharField
integerField
floatField
BooleanField
DecimaField
NulBooleanField
AutoField
FieField
ImageField
字段约束
max_length
default
unique
index
primary_key
db_column
别名
映射到数据库中
生成迁移文件
执行迁移
数据库已经配置完毕为前提
默认配置的sqlLite
也可以自主配置mysql
引擎
数据库名
用户名
密码
主机
端口
驱动,伪装
ROM
object Relational Mapping
对象关系映射
经业务逻辑和sql语句进行解耦
核心思想解耦
可以理解未翻译机
CRUD
CREATE
save
创建对象
直接实例化对象,设置属性
person=Person()
person.p_age='12'
person.svae()
创建对象,传入属性
Person.objects.crate(p_name='12'....)
自己映射方法创建
person=Person(p_age='12'...)
在manage中映射方法创建(想制定默认值)
在model中设置类方法,因为没有了__init__方法
@calssmothed
create(cls,p_name ,p_age=12,....)
return cls(p_name=p_name,p_age=p_age...)
在view中People().create() 创建了带有默认值的方法
更新
基于查询
save
删除
基于查询
delete
查询
查询句柄
objects
隐性属性
Manage实例
操作都封装到这里
获取查询结果列表queryset
all
可以加切片
相当月sql中的limit 和offset
切片第一个参数是offset,第二个参数是limit
但是下标不能是负数
[5:15]
地6个开始, 数15个
fitter
里面写条件
.filter(p_age__lt=12)
如果字段中有datatime类型的可以用
filter(p_time__year=2017)
但是使用时需要注意,要关闭django中定义的时区
USE_ZT=False
exclude
order_by
-id
values
每个对象被转换成了字典
或者可以说转换成json很方便
可迭代
切片
不支持负数
相当于limit_offset
懒查询
观察者模型
发布者订阅者
广播
最终都是转换成sql
获取单个对象
get
不存在会抛出异常DoesNotExist
存在多于一个MuitlpleObjectsRurned
使用这个函数记得捕获异常
last
first
坑点
可能出现第一个和最后一个一样的
所以需要进行order_by排序后再操作
内置函数
count
查询queryset中的数量
。count()
if user.count()
exists
就是等号 精确等于
条件
属性__操作符=临界值
gt
gte
lt
lte
in
exact
startwith
like
endwith
like
contains
ignore
iexact
icontains
忽略大小写的匹配
跨关系查询
一对多
根绝多中的属性获取一的信息
一。objects。filter(多__属性名=123)
多对一
聚合函数
People.objects.aggregate(Max(‘p_age’))
F对象
模型中自己的属性来比较
Student.objects().fitler(c_boy_num__lt=F('c_girl_num')+10))
Q对象
支持条件的与或非
&
|
~
Student.objects()fitler(Q('c_boy_num=10')&Q('c_girl_num__gl=10'))
manager
实际上是objects的一个实例
a_m=Model.Manager()
如果在model类中重写了,view就不能再用objects了,只能用a_m
集成Manager
class AinmalManager(model.Manager)
def get_queryset(self)
return supper(AnimualManager,self).get_queryset().filter(isdelete=False)
def create_animal(self,a_name='chicken'):
a=self.model()
a.a_name=a_name
returen a
class Animal(modle.Model)
objects=AinmalManager()
确认有没有这个对象
if student.exists
django第三天
Template
MTV中的Template
V和T之间是多对多的
充当数据展示的角色
在Django中使用的就是Django模板
模板组成
静态资源
可以再template目录平级创建静态资源文件夹static
css
js
img
等
创建后要在setting中注册才能使用
STATICFILES_DIR = [os.path.join(BASE_DIR,'static')]
在settings中定义好STATICFIELD_DIR后,一般采用 在页面中{%load static%}的写法导入静态文件
使用时直接
herf="{%static 'css/base_home.css' %}"
这样写是相对路径,而且是标签式的写法,方便切规范
动静分离
1创建静态资源文件夹,项目级别下
2在settings中创建静态资源的路径
3{%load static%}
使用{%static ‘XXX’%}
坑点
仅在debug模式下可以使用
以后需要自己单独处理
模板语法
变量
{{var}}
变量名遵循命名规范
来源
视图中传递过来
标签中,逻辑创建
标签
模板的点语法
model中的属性
model中定义的方法
但是不能带参数很遗憾
可以实现但是比较复杂, 一般都是调用不含参数的
索引
sutdent.1.s_name
字典属性
{%exp%}
分为单标签和双标签
双标签必须要闭合
结构标签
block
块,坑
用来规划布局
用来规划,填充页面的
首次出现时规划
第二次出现时填充
子模板继承父模板的时候重写(第二次)
第三次出现,也是填坑,但是会覆盖
如果不想被覆盖就使用block.super
这样就实现了增量操作
如果要加载静态资源文件,也可以写,比如在head部分创建代码块儿
extends
继承
获得父模板中的所有结构
面向对象的体现
能提高模板的复用
{% extend “index.html”%}
如果子页面继承自一个父模板, 子模板自己重新的页面接口是不生生效的, 只能在已有的坑中写
include
包含
将其他模板作为一部分,嵌入到我们的页面中
bolck+extends
化整为零
include+XXX
由零聚一
能用block + extends 搞定的 就不用include ,因为include效率慢
功能标签
if
分支
判断
if-else
if-elif-else
for
for i in xxx
empty
forloop
ifequal/ifnotequal
判断相等/不相等
endifequal
{% ifequal forloop.conter 5%}
ifnotequal
withratio
整除
过滤器
|
将前面的输入做为后面的输出
upper
转成大写
lower
转成小写
safe
确认安全
进行渲染
{{code|safe}}
谨慎使用,code后台传过来的js语句参数, 想让他被前段渲染
因为code有可能存在xss漏洞
{%autoescept off/on%}
code
{%endautoescept%}
add
加
加是加负数
{{count | add:2}}
链接参数
{{student | join "="}}
等号链接
格式化日期
{{veldate | date=“y-m-d”}}
带参数的管道符
注释
单行{##}
多行{% comment %}
{%endcomment%}
上面的注释不在会在前段html中出现,如果使用<!-- 注释的话 ,会在html中显示出来
模板加载
加载模板
渲染模板
请求状代码
2XX
成功
3XX
重定向转发
4XX
客户端错误
5XX
服务端错误
创建了文件夹后可以用pycharm的功能设置成模板文件夹,这样py代码就能快捷键关联上模板了
views
视图函数v
相当于Controller作用
控制器 接受用户输入
协调模板模型,对数据进行处理
一般有两种返回
json
网页形式
路由器
urls
urlpatterns
里面的都是从上到下匹配 ,没有最优匹配的概念
我们通常以^开头,结尾直接加$,保证开头结尾
url
根路由中,我们会使用include形式将整个子路由添加进来
第一个参数 正则匹配的路径
第二个参数,包含那个路由
第三个参数是namespace
在子路由中
前两个参数是一样的
第三个参数是name
以后会根据namespace:name动态获取路由
接受参数
路径参数
位置参数
使用圆括号包含规则
一个圆括号代表一个参数
url(r"^two/(\d+)/", include("two.urls"))
收到的参数是字符串
代表视图函数上的一个参数
参数个数和视图函数上的参数一一对应(除request)
关键字参数
可以在圆括号地址参数名字(?P<name>\d+)
视图函数中存在和圆括号中name对应的参数
参数不区分顺序
个数也需要保持一致,一一对应
请求参数
反向解析
在根路由中写namespace,在子路由中写name
在模板中使用
动态获得路径值
{%url%}
{%url 'namespace:name'%}
如果存在位置参数
{%url ‘namespace:name' value1 value2 value3%}
如果存在关键字参数
{%URl’namespace:name' key1=value1 key2=value2...%}
规则
按照书写顺序,从上到下匹配
没有最优陪陪的概念,匹配到了就停止了
视图函数
双R
request
django框架根绝http请求报文自动生成的一个对象
包含客户端请求的各种信息
path
请求的完整路径
method
GET
POST
encoding
utf-8
POST
GET
QueryDict
类字典接口,也是健值存储
key-value
一个key可以对应多个值
get()
获取值列表中最后一个值
request.GET.get()
getlist()
获取key对应的值列表
request.GET.getlist()
FIES
COOKIES
session
is_ajax()
判断请求是否是ajax的,通常在移动端和js 端,移动端发来的请求也会被认为是ajax
META
元信息
客户端d的所有信息
ip
response
知识点
locals()函数
以字典的形式返回当前位置的全部参数
grade_list=Grade.objects.all()
return render(request,“html.html”,content=locals())
很方便
django第四天
views
双R
Request
Response
服务器针对客户端的请求作出相应
开发者自己创建的
相应分类
HTML响应
基类是HTTPResponse
HTTPResponseRedirect重定向
302
简写方式是redirect
路由地址
reverse python代码中的反向解析
url=reverse(‘namespace:name’)
return HttpResponseRedirect(url)
reverse(‘namespace:name’)
位置参数
reverse(‘namespace:name’,args=(value1,value2...))
关键字参数
reverse(‘namespace:name’,kwargs={key1:value1,key3:value2 。。。})
状态码
301
永久性 转移
400
不好的请求
403
没有权限,被禁止的
404
没找到
405
请求方法不被支持
500
服务器内部错误
Json响应
jsonResponse
返回结果中创建一个字典date={}
return JsonResponse(date=date)
只是在init的时候,将数据序列化为JSON
属性和方法
content
encoding
status_code
charset
编码格式
content_type
MIME类型
互联网传输宽展类型
标识浏览器以什么扩展形式打开我们的内容
大类型/小类型
init 初始化内容
write
直接写出文本
会返回到前端
flush
只要有写的操作都要有flush
set_cookie(key,value,maxage=xx,exprise=xxx
设置
request.set_signed_cookie(key,value,盐)
加密的盐
response.get_signed_cookie(‘key’,盐)
解密加盐
加密解密可能用于加密中文,因为cookie不支持中文
response.delete_cookie(key)
删除
对session的操作
request.session['username']=username
储存在服务器中,可以在数据库中查看
data是通过base64加密的信息
前面有混淆字符串
request.session.get('username')
django中session默认过期时间是14天
=结尾的很可能是base64加密,可以解码试试
session依赖于cookie
cookie清除,session自然失效
session_key 会存在cookie中叫sessionId
所以清除cookie的时候也要清除session,要不然会产生垃圾数据
request.session.flush()
cookie中的sessionid和 数据库中的session一起删掉
cookie使用更简洁,服务器压力更小,数据不是很安全
session使用简介,服务器要维护session,相对安全
token拥有session的所有优点,但是自己维护略微麻烦,支持更多的终端
错误页面自定义
创建错误码对应的模板
就近原则查找
关闭debug
会话技术
为什么会有会话技术
服务器为了识别客户端
web开发中绝大多数都是短链接
请求生命周期从request开始到response结束
让客户端记住自己
会话技术的实现
cookie
客户端会话技术
数据都在客户端
以键值对存储
支持过期时间
默认会携带本网站的所有cookie
cookie不能夸域名,不能夸浏览器
cookie默认不支持中文
session
服务端会话技术
数据都存储在服务端
支持过期
在django被持久化到了数据库中
默认做了数据安全,使用base64
依赖于cookies
stoken
会话技术
自定义的session
数据存储在服务器中
如果用web网站开发中,效果基本等同于session
如果使用在移动端或者客户端开中,通常以json形式传输,需要移动端自己存储token,需要获取token关联数据的时候,主动传递token
主要应用场景是移动端和专用客户端开发中, 不支持cookie的设备中
常见算法
编码
base64
摘要,指纹,杂凑
单项不可逆
输出长度固定
输入变更一点点,输出发生很大的变更
MD5,SHA
hashlib
加密
对称加密
一把钥匙
非对称加密
一对钥匙
公钥
私钥
RSA,PgP
生成随机串
ip=request.META.get('REMOTE_ADDR')
hashlib.new('md5',(ip+c_time+r).encode('utf-8')).hexdigest()
CSRF
防跨站攻击
django中内置CSRF的插件
实现机制
页面中存在{%csrf_token%}时
在渲染的时候,会向Response中添加一个csrftoken的cookie
在提交的时候,会被添加到请求体中,会被验证有效性
django第五天
model
Model---》db
迁移
生成迁移
python manager.py makemirgrations
根据既有models迁移文件和模型进行比对,生成新的迁移文件
执行迁移
python manager.py migrate
去查询执行记录,数据库中modle_migrateions(applabel+迁移文件名)比对,直接过滤掉已执行的迁移文件
执行未执行的迁移文件并记录
重新迁移
删除迁移文件
删除文件产生的表/表变更
删除迁移记录
迁移原理
DB--》Modle
python manage.py inspectdb
可以直接生成model
生成时需要把model.py删除,执行命令后会自己重新生成一个model.py文件
python manage.py inspectdb>models.py
生成的Model拥有原信息 manage=False
意思是不被migrations文件管理,
模型关系
1:1
OneToOenField
确认主从关系
谁声明关系谁就是从表
一般相对主要的就是主表
底层实现
从表中声明外键,并添加唯一约束
获取
从获取主
显性属性
idcard.id_person
主获取从
隐性属性
preson.idcard
默认就是从表模型名小写
删除
从表数据删除
主表数据不受影响
主表数据删除
OneToOneField(Person,null=True,blank=True,blank=True,on_delete=models.PROTECT)
默认CASECADE
默认是级联删除
PROTECT
受保护的
开发中为防止误操作,通常会设置为此模式
但存在级联的时候删除主表数据会有异常,主表数据也删除失败
不存在级联的时候删除成功
SET
SET_NULL
允许删除主表,删除主表时,附表的绑定关系字段置NULL
前提允许为NULL
SET_DEFAULT
设置为默认值
前提是存在默认值
SET()
自己指定值
常见应用场景
拆大表
200字段大表拆分
扩展
已有的表中增加字段,比如增加一个token表,绑定到user表中OneToOenField
1:M
直接使用外键实现
主从,多是从
级联数据获取
从获取主
显性属性
主获取从
隐性属性
默认是级联数据模型_set
student_set
也是manager的子类
mananger上能用的都能用
也是Manager的一个子类
filter
exclude
all
切片
。。。
数据删除
同一对一
M:M
ManyTOManyField
两张以上表的关系
使用多对多之后会产生额外的关系表
表中使用多个外键实现
多个外键作为关系表的主键
数据获取
两张表的结构是完全一样的
从获取主
Manager对象
fiter
all
exclude
操作级联数据
add
goods.g_coustoum.add(coustoum)
remove
clear
set
显性属性
主获取从
隐性属性
coustoum.goods_set.add(goods)
manager对象
和其他manager一样
小知识点, 动态创建
类在一个def中创建的, 而且,类的父类是作为一个参数传递来的
模型继承
默认一个模型在数据库中映射一张表,通用字段放在附表中, 特定字段放在自己的表中,中间使用外键链接。
如果模型存在继承的时候,父模型产生表映射并不是我们想要的
子模型对应的表会通过外键和父表产生关联
关系型数据库性能
数据量越大越低
关系越多越复杂性能越低
抽象模型,使用元信息
在model的原信息中添加abstact=Ture
class Meta abstact=Ture
抽象的模型不会在数据库中产生映射表
子模型拥有父模型中的所有字段
静态资源
使用的时候注意资源的位置
STATICFILE_DIRS
使用{%load static ‘相对路径’ %}
文件上传
客户端
必须使用POST
客户端指定enctype=‘multiplepart/form-data’
意思是打成多块儿碎的上传
原生
文件复制
从request.FILES中获取到上传上来的文件
icon=request.FILES.get("icon")
with open(“/home/rock/GP1/Day05/ModelToSQL/static/img/icon.jpg” ,‘wb’)as cave_file:
with可以自动帮我们创建资源释放资源
wb指的是写二进制文件
for part in icon.chunks(): save_file.wirte(part) save_file.flush()
chunks
文件打成一一块儿块儿的
打开一个文件,从上传来的文件进行读取,想打开的文件中进行写入
每次写入记得flush
Django内置
imageField,图片上传存储
依赖于pillow库
一个第三方库处理图片的
不然会报错
子主题 3
templete中
view中
request.POST.get('username')
request.FILE.get('icon')
配置使用
settings中指定MEDIA_ROOT
是给媒体建立的目录
MEDIA_ROOT=os.path.join(BASE_DIR,'static/upload')
指定字段的upload_to
u_icon= models.imageField(upload_to=‘icons')
相对于MEDIA_ROOT的路径
支持时间格式化
%Y
u_icon = models.ImageField(upload_to='%Y%m%d/icons'
u_icon = models.ImageField(upload_to='%Y/%m/%d/icons'
%m
%d
%h
。。。
requests
请求库
实际上是urllib封装的库
python内置模块
使用场景
爬虫
MCS架构
添加了中间层服务器
django第六天
缓存
是什么
存储中间数据的一种介质
有什么目的
环节服务器读写的压力
提升服务器响应速度
提升用户体验
特性
较少的代码
对缓存后端封装一次性操作
有点类似于ORM的感觉
可扩展性
应该存在通用基类
好处
怎么用
使用时需要注意的点
Django中内置了缓存框架的实现
基于数据库
创建缓存表
python manage.py createcachetable[table_name]
和session配置有点像
配置缓存信息
CACHES中
缓存实现
指定缓存实现后端
指定缓存位置
默认缓存超时时间
版本信息
key的统一前缀
基于磁盘
基于文件系统的
基于磁盘
磁盘性能是短板
基于内存的
不能夸电脑
基于Memercache
是内存级数据库
支持数据类型比较单一
settings中缓存配置
CACHES={ 'default':{ 'BACKEND':'django.core.chche.backends.bd. databaseCache', 'LOCATION':'my_cache_table', 'TIMTOUT':'60', 'OPTIONS':{ 'MAX_ENTRIES':'300', }, 'KEY_PREFIX':'rock', 'VERSION':'1', } }
@cache_page(30)
使用装饰器来用缓存,加在要缓存的view函数上
有三个参数
缓存时间
位置
过期时间
可以使用settins中的默认
缓存底层
获取
form django.core.chche import caches chche=caches['cache_name']
操作
Django—redis-chche
pip install django-redis-caches
settings
CACHES={ 'default':{ 'BACKEND':'django_redeis. RedisCache', 'LOCATION':'redis://127.0.0.1:6379/1', 'TIMTOUT':'60', 'OPTIONS':{ 'CLIENT_CLASS':'django_redis.client.DefaultClient', }, } }
使用redis实现了django-chche的扩展
操作缓存的api没有发现任何变更
变更的就是连接缓存的配置
缓存使用
使用系统封装的
装饰器封装在视图函数上
模板中也可以缓存
使用cache原生操作
set
add
remove
clear
setmany
getmany
delete
deletemany
缓存操作的api跟操作字典基本一致
核心点就是key 的选择
用视图函数的名字
所有人公用一个缓存
ip
cookie或者session
基于用户的缓存
多缓存
settings
CACHES={ 'default':{ 'BACKEND':'django_redeis. RedisCache', 'LOCATION':'127.0.0.1:6379/1', 'TIMTOUT':'60', }, 'redis_backend':{ 'BACKEND':'django_redeis. RedisCache', 'LOCATION':'127.0.0.1:6379/1', 'TIMTOUT':'60', 'OPTIONS':{ 'CLIENT_CLASS':'django_redis.client.DefaultClient', }, } } }
写多套配置,定义不同的名字
存入缓存的时候获取不同的缓存对象
caches['cache_name]
caches['redis_backend']
@chche_apge(30,cache='cache_name')
第一个参数缓存时间, 第二个参数使用settings中的哪一个缓存模式
中间件
django内置的一个底层插件
从属于面向切面变成
在不修改源代码 的情况下,动态去添加一些业务逻辑
中间件的典型实现,装饰器
中间件就是使用类装饰器
面向切面编程(aop)
切点
process_request(self,request)
在执行试图前被调用,每个请求上都会调用,不主动进行返回或者返回HTTPResponse对象
process_vew(self,request,veiw function,view args,view_kwargs):
调用视图之前执行,每个请求都会调用,不主动进行返回或者返回HTTPResponse对象
process_template_response(self,request,response):
在视图刚好执行完成后进行调用,每个请求都会调用,不主动进行返回或者返回HTTPResponse对象
process_response(self,request,response):
所以响应返回浏览器之前调用,每个请求都会调用,不主动进行返回或者返回HTTPResponse对象
process_exception(self,request,excepton):
当试图抛出异常时调用,不主动进行返回或返回HTTPResponse对象
def process_exception(self,request,exception): print(request,exception)
可以记录错误信息
出现错误时可以处理
重定向等
切面
切点处切开可以获得的数据
实现,使用
process_request
日志统计打印
优先级调度
黑白名单
反爬虫,频率控制
N时间内,只能请求一次
可以结合缓存实现,cache.get(ip)如果有 十秒后再来访问,如果没有,在缓存里写一下数据,timeout时间
单位时间内最多访问N次
需要记录每一次请求的时间
数据结构选型
key-value value=[]
在判断之前进行简单的数据清洗
requests=chche.get(ip,[])
在这之前也可以判断这个ip是否在缓存黑名单,
比如控制一分钟之内不能访问十次,清洗就是 while time.time()-requests[-1]>60, 就requests.(pop)
在判断单位时间请求次数的时候,判断的是列表长度
如len(requests)>10 就说明单位时间内超过10次了,可以加入缓存黑名单
书写方式
自定义中间件
创建目录存放中间件
工程目录下创建一个middleware目录
目录中创建python文件
在文件中导入中间件基类
from django.utils,deprecation import MiddlewareMixin
实现对应的切点函数
在类中根据功能需求,创建切入需求类,重写切入点方法
class LearnAOPPO(MiddlewareMixin):
def porcess_request(self,request):
print('request 的路径‘,request.GET.path)
注册中间件
在settings 中进行配置,MIDDLEWARE中添加middleware.文件名类名
MIDDLEWARE=[ 'middleware.LearnMiddle.HelloMiddle' ]
中间件的执行顺序
从上到下逐个执行的
当我们在切点处切开的时候,后续中间件不再执行
process_view
CSRF
首先判断了两种豁免条件
判断请求方法是否安全
POST请求如何验证CSRF
在request.POST.get("csrftokenmiddleware")
验证和请求对应的token是否正确
porcess_response
跨域处理
IP和端口不一致就是跨域,只要有一个不一样就是不一样
跨域的行为校验是浏览器的行为
实现跨域
在服务器端添加属性
允许所有域名访问
在客户端伪装
对相应进行统一处理
分页器
为了提升用户体验并减小服务器的负担
原生实现
偏移加限制
students=Student.objects.all()[per_apge*(page-1):page*per_page]
page 和 per_page都是前端get求情传过来的
第几条,到第几条结束
offset,limit
封装实现
paginator
分页器对象
需要使用数据源和每一页的数据量来构建
可以获取某一页的数据
获取所有页码
可以获取多少数据,多少页
paginator=Paginator(student,per_apge)
student就是一个queryset
page_object = paginator.page(page)
分页器的两个必须要的参数就是page和page_object
之后吧page_object= 发送到前端去渲染
前端在模板中渲染page_object.的方式
page
具体一页的一个载体
可以获取当前第几页
可以获取对象列表
可以获取兄弟信息
是否有上一页
是否有下一页
上一页页码
下一页页码
是否有其他页
验证码
防止恶意用户验证是一个正常请求
原生绘图
pillow
image
画布
尺寸
颜色
模式
RGB
imageDraw
画笔
属于哪个画布
画完东西在哪
封装了画笔的画法
文字
点
线
弧
imageFont
字体
画笔的辅助工具
字体
设置绘制样式
需要将画布转化成二进制流,并添加格式限定
内存流
bytesIO
将图片存到内存流中
从流中获取导数据值
通过HTTPResponse返回图片内容
content_type
MIME
或联网邮件扩展类型
标识打开我们数据的一个应用程序
标识成image/png
验证码的验证
客户端验证
服务端验证
在验证码生成的时候,存储验证码
在提交的时候去验证验证码的有效性
验证码的刷新策略
浏览器缓存策略
是以url为标识的
解决方案
每次给不同的地址
对地址进行一个参数拼接,每次传递不同的参数
django第七天
富文本
先安装插件
pip install django-tinymce
在settings中配置
INSTALLED_APPS添加 tinymce应用
添加默认配置 TINYMCE_DEFAULT_CONFIG={ ‘theme':'advanced', 'width':800, 'height':600, }
使用
创建模型类
子主题 2
from tinymce.models import HTMLField class Blog(models.Model): sBlog=HTMLField()
在视图中使用
使用文本域盛放内容
<from method='post' action='url'> <textarea></textarea> </form> 在head中添加script <script src='/static/tiny_mce/tiny_mce.js'></script> <script> tinyMCE.int({ 'mode':'textareas','theme':'advanced', 'width':800,'height':600 }) </script>
项目
虚拟环境技术
虚拟机
虚拟容器
Docker
部署各种开发环境
虚拟环境
veituralenv
python专用的虚拟环境
分割不同的django版本可以用
前端
MTV
HTML5
android
ios
rn
mysql的一些操作
mysql -uroot -prock120
create database GPAXF charset=utf-8
exit
在数据迁移
过程
1设计表
哪些表
表字段
表关系
2sql创建
3创建首页测试路由
4创建首页测试视图
5完善静态资源
static
css
bootstrop.css
导入bootstrop 和 bootstrop.min 的css 和map文件
bootstrop.map.css
写在head里面,加载时
reset.css
js
jquery.js
jquery.min.js
bootstrop.js
bootstrop.min.js
轮播框架
swiper
swiper.jquery.js
swiper.jquery.min.js
js的加载写在body最下方,注意页面开始要加载{%load static%}
image
fonts
uploads
6settings配置
STATICFIES_DIRS
MEDIA_ROOT=os.path.join(BASE_DIR,'static/uploads')
7在templates中创建 base.html
规划
头部中 ext_css
header
content
footer
body中 ext_js
导入通用资源
head中
reset.css
重置边框编剧的css
bootstrop.css
swpoer.css
一个轮播的样式
再head中添加bootsrtop 的viewport元数据标签
友好移动数据
body最后的js中
jquery.js
bootstrop.js
base.js
屏幕宽度的十分之一作为rem的基础单位
为了手机适配用
每一级主页面都要有base类
例如base_main
{%extends ‘base.html'%}
{%block ext_js%} {{block.super}} <script type='text/javascript' src=''> {%endblock%}
加上block.super 确保是增量操作,不要覆盖
base_order