Python
CPython
浏览器请求头上能够看到server: ... Cpython3.*
CPython指的就是Python, Python在实现过程当中使用的是C语言开发的. 也可以叫做CPython而已.
Jython,指的是Java语言的python编译器的实现, 在JVM中跑的..
概念
函数和方法的概念
函数和方法的概念总是容易弄混淆
一般而言, 通过类创建的对象, 在执行过程当中, 传入self, 则叫做方法.
在执行过程当中不传入self, 则叫做函数.
一般而言, 通过类生成的实力对象调用的都是方法(静态方法是函数). 其他则是函数.
class Test():
def one(self):
print('123')
@property
def two(self):
print('123')
test = Test()
# test.one在执行过程当中, 传入self.则叫做方法.(虽然self在后边没有用到).
test.one()
# test.two, 虽然two是类的方法,但是也属于函数(静态方法.self可以省去)
test.two()
包, 模块, 库概念
包就是pack, 具有__init__.py文件
模块就是.py文件
库, 可以理解为许许多多个pack包组成的一个整体架构.
这几个概念大--->小依次为:
库 ==> 包 ==> 模块 ==> 类 => 方法or函数
还有容易弄混淆的概念是 库, 框架.
框架和库都是一堆包组成的东西.
框架一定是库,但库不一定是框架.
可以从用途方面去理解.
框架: 我这里的东西, 绝对能帮你完整的完成项目.
库: 我这里有许多东西, 能帮助你解决一些项目中遇到的问题.
方法
format()
Python新版本,字符串格式化不仅可以使用%, 还可以使用format.
使用方法如下:
"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序
'hello world'
"{0} {1}".format("hello", "world") # 设置指定位置
'hello world'
"{1} {0} {1}".format("hello", "world") # 设置指定位置
'world hello world'
而且相对于%而言, {}可以进行数字格式化. 方式你与%相类似.
locals()
locals()函数, 表示当前函数下的所有局部变量.
在使用locals()函数的时候, 可以将当前函数内所有变量都保存为字典形式
在通常的前后端调用时候, 一般使用context作为字典来传输数据.
a = 1
b = 2
context = {
'a' = a,
'b' = b,
}
return render('123.html',context)
如果需要传输所有的函数的时候, 则可以通过local函数来传输.
a = 1
b = 2
return render('123.html', locals())
相比较于重新组织上下文, locals()函数更加方便简洁.
但是相对而言, local的易读性并没又重新组织上下文来的好.
getattr()
如果只有类属性的字符串形式的数据, 可以使用getattr方法来获得属性
class Person():
def __init__(self):
self.name = '小张'
p = Person()
print(p.name)
print(getattr(p, "name"))
callable()
如果需要判断一个函数是否可以调用, 可以用callable()
print(callable('asdf'))
def test():
pass
print(callable(test))
# =========输出结果
# >:False
# >:True
直接赋值, copy, 与 deepcopy区别
直接赋值:其实就是对象的引用(别名)。
浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
深拷贝(deepcopy): copy 模块的 deepcopy 方法,拷贝父对象,及其子对象。
例如:当对象A为字典, 字典内包含另一个对象B.
当使用浅拷贝, 更改B.则 原本的B对象内容会随之而改变.
当使用深拷贝, 更改B,则 原本的B对象内容不会发生改变, 因为此子对象同样拷贝了一份.
python常用的数据结构
列表套字典, 或者字典套列表.
更复杂的结构应想办法简化.
Django
ORM
pk和id
调用选择集后的pk属性和id属性区别:
在使用 查询结果的pk或者id属性的时候, 大多时候并没又区别.
pk primary key , 查询主键
id 查询id,
当主键为id 的时候, 则没有区别.
当主键不为id的时候, 则pk则查询主键.
print(user.pk)
print(user.id)
关于values于values_list的运作机制.
permissions = users.role.values('permission__url')
再查询 用户下的 所有角色 下面的所有权限的时候, 可以使用values..跨表查询方式('对应表格__所查属性')
不管是values还是valueslist, 都是 遍历 所得QuerySet. 形成字典或者列表方式.
ORM distinct去重.
django通过ORM获取数据可直接使用distinct去除列表或者字典的重复内容.
ORM 对象添加和更新
django orm取出对象后, add 方法在一次性添加多个属性的时候,添加* .
但是set的时候并不需要
ORM filter exclude
在使用ORM查询数据库的时候,可以直接使用filter(字段__in=[列表])来取出对应值的对象.
例如:
book_some = Book.objects.filter(id__in=[1, 2, 3, 4, 5])
Python 实例方法再调用的时候,如果函数支持则可以通过传入instance来传入实例...
像是django中formmodel, 可以通过传入orm实例生成表单. 或者传入具体orm对象, 使用formmodels对比该对象与接受参数的区别,进行修改.
模型类的名称以及所在app
获取一个模型类的字符串名称以及所在app名称的方式, 使用
from app01.model import Book
print(Book)
print(Book._meta.model_name)
print(Book._meta.app_label)
# =========输出结果
# >:<class 'app01.models.Book'>
# >:book
# >:app01
字段属性-值,获取
在获取字段显示属性的时候, 如果该字段值对应选项, 直接获取的时候则显示相对应的序号.
如果想直接获得选项的值, 可以使用语法:
object.get_group_display()
group_choice=[(1,'一组'),]
object.get(group) # 1
object.get_group_display() # '一组'
modelform
limit_choice_to的用法.
在使用 多对多的表结构 构建form 的时候使用, 在modelform中显示的时候限制其显示内容
相当于在formmodel中增加一个filter过滤
template
查找顺序
在任何应用中, 如果没有指明路径的时候. 查找模板文件的顺序依次为:
- 项目中的总'template'文件夹
- 根据应用的注册顺序, 依次查找app中的'template'文件夹
- 之后在去找.项目中隐藏的模板文件, 例如'admin.html','404.html'等.
模板中限制date显示方式
例如:
{{ book.date | date:'Y-m-d' }}
模板表单的as_p
不管是使用modelform还是另外生成的表单.
在前端使用的时候, 通过使用as_p, 可以把所有的表单段, 以p标签渲染.
响应的还有as_ul, as_table
表单验证
不管是在html标签还是django的模板中, 表单属性都有一个novalidate.
用来阻止表单再上传之前的, 来自浏览器的验证.
通常情况下需要添加该属性, 自定义验证过程.避免出现验证混乱 .
url路由使用两种方法:
- 第一种
url('^test/',view.test)
- 第二种
url('^test/',([
url('^test01',view.test01),
url('^test02',view.test02),
],None,None))
第一种方式属于最简单的一种方式, 第二种方式,属于路由分发.其中两个None,分别代表应用,以及命名空间
向前端传输非转义字符串
如果需要向前端传输非转义的字符串, 则可以通过mark_safe(字符串)
调用路径: django.utils.safestring.mark_safe
自带认证组件
在使用django自带认证组件, 又自定义了用户模型类的时候,需要再setting 设置"AUTH_USER_MODEL"="应用名.用户模型类"
中间件:
django中继承MiddlewareMixin编写的中间件类.
需要根据请求的各种状态编写对应的状态. 其中的五个方法分别是:
- process_request : 请求进来时,权限认证 。
- process_view : 路由匹配之后,能够得到视图函数
- process_exception : 异常时执行
- process_template_responseprocess : 模板渲染时执行
- process_response : 请求有响应时执行
根据中间件所影响的过程, 书写中间件内容.
如果中间件类没有没有书写以上5种方法,或者方法名称错误.
则对应的方法不起作用.
不通的Django版本上, 可能要求不一样, 不过一般来说. 中间件需要接受response并且返回response
request
动态赋值?
在django2.2之后, request函数无法动态赋值,
起码在编写rbac验证过程当中, 在中间件的 响应级别中, response赋值无效.
最后只能通过session传输数据.
原生的request.
当请求方式为get方式的时候, 没有request.body请求体
只有当请求方式为post的方式的时候, 才有request.body请求体.
请求体中放的是原生数据, 为byte格式.
且这个时候, 如果编码方式为urlencode的时候.django能够将post请求体中的内容翻译所需要的数据. 如果不为urlencode,如 json等格式的时候, 则request不能识别,之后通过body取出, decode解码, json.loads转为json格式.
Django原生request解析器里面并不支持对json数据的解析. 如果一定要解析的话, 需要使用json模块.
为了更方便的发送接收数据, 所以才需要使用restframework.
restframework
restful
一切皆是资源. 对数据的增删改查使用请求方式区别.
在请求资源的时候, 请求资源和请求单条资源的时候, url是一样的. 不过在处理方法的时候, 采用不同的请求方式来判定
例如:
请求书籍资源 books
url: 请求方式 请求内容 视图 返回内容
books/ get 请求所有资源 books 返回请求的所有资源
books/ post 增加一条数据 books 返回所增加的单条数据内容
books/(/d+) get 请求单条数据 bookdetail 返回请求的单条数据
books/(/d+) put 更改单条数据 bookdetail 返回此单条数据所更改的内容
books/(/d+) delete 删除单条数据 bookdetail 返回空
restframework
- APIView
- 使用APIView的时候, 构建新的request. 需要使用原有request的时候需要_request. 构建新的dispatch请求方式分发.
- 获取数据的时候,request.get或者request.data. data中包含了所有格式的数据, 根据情况序列化为需要的数据.
- restframework里面还封装的response, 是直接提交数据给前端. 替换django.http.response
- Serializers
- Serializers, 主要适用于对于数据的序列化. 可以将QuerySet或者model对象转化为json字符串,或者将json字符串序列化为一条记录.(model操作需要对应modelSerializer)
- 对数据格式的请求或者读取的时候直接使用serializer即可直接获取数据类型, 免却for循环.
- 在使用serializer的时候可以进行二次封装. 直接封装成序列化类. 即可在使用的时候 直接调用.不需要重复设定
- 在使用serializer的时候可以使用,formserializer, 与之前的formmodel一一对应. 能更好的完成post或者put请求的数据修改和返回.
- 在使用serializer生成hiperLink的时候, 需要传入参数content='request':request.
- 在序列化单条记录(model)的时候, 返回单个字典 {} . 在序列化多条数据的时候(QuerySet),返回列表套字典格式数据. [{},{}]
restframework
认证, 权限, 频率, 三组件之间. 频率是如何工作的? 查看源码
Web
浏览器历史
网景公司netscape开发的javascript, 提出的同源策略.
在ie浏览器大火之前,大多数人用的是netscape的浏览器(netscape navigator), 商用.
url路径的设定
在判断url路径的时候, 一般情况url'index/'和'index'并没有什么区别. 两者都能访问到视图.
但是从最优效率来讲.url后不添加/效率更高, 一方面是出于开发过程中更方便, 再者是路径输入的时候, 很少会在后面添加/
严格意义上来讲, 在正常访问'index/'的时候, 浏览器地址最后没添加/, 访问不到.
但是通常框架会设置重定向. django中settings参数为 APPEN_SLASH . 默认为True. 当设置False的时候, 地址不添加/则无法访问'index/'
在使用Slash的时候, 用户的浏览器会产生一次重定向. url为'index/', 当用户请求'index', 则会产生重定向到'index/'.
会影响用户体验. 则, 在书写url地址的时候应尽量避免末尾使用/
在服务器端, 或者通过301跳转.
或者直接通过nginx反向代理,则可以避免前端跳转.
css
权重
在书写式样的时候, 通过添加!important 设权重为最高.
表格元素缩写
table 没有缩写,代表表格元素
- 表头部分
thead (table head) 字面意思, 表格头部, 表头部分. 其中放置整个表头部分
th (table head) 缩写了大部分内容.与表格中的td相似, 但是进行了加粗处理. 一般放在table>tr>th. - 表格内容
tr (table row) 表格行. 一行的内容.
td (table data) 表格数据, 表格内单元格的数据内容.
通常情况下
一个table表格内, 一tr的th, 其余的tr全都是td - 在表格内部也可以通过使用th来代替td,用以着重加粗该单元格内容.
- 其他标签缩写
hr (horizontal rule) 水平分割线
form表格的时候.
select+option作为已有属性的单选, 如果属于多选情况下就不能使用这种方式
需要添加相对应的multiple属性.
javascript中.
console.log是最常用的调试语法.
console.log(arg) 在控制台显示该变量
console.log(typeof arg) 在控制台显示该变量类型
var data=JSON.parse(are) 解析该数据为json格式.
跨域请求
jsonp (JSON with Padding) 使用json实现跨域请求
因为浏览器的同源策略, 会拦截下脚本文件的内的外域请求. (1.拦截请求.)
当使用script标签发送请求的时候, 就可以得到响应. 但是需要有同名变量接受. (2.命名问题)
当与外域服务器端协商好后, 采用同一个变量名头之后. 可以 接受变量.以及相对应的数据.(3.常约定为callbacks)
在浏览器使用jquery封装好ajax的script请求的时候. 通常约定了callbacks传输变量名. 然后服务器端用传输过来的变量名放置内容.最后,浏览器再使用该变量名接受数据.
在通常使用的过程当中. 通过自定义一个单一的所发送的变量名, 往往不如使用jquery自动拼接的变量名更安全. 所以对于jsoncallback属性可以不设置.直接使用success来接受变量.
请求头中,Ajax中, 数据传输的类型书写:
contentType, 指的是, 传输到服务器的内容是什么类型的.该选项决定传输过去的数据将以什么样的编码格式进行编码.
dataType, 指的是, 期望接受到的数据是什么类型的. 该选项决定接受到的数据将以什么样的形式进行解码.
例如: 当dataType为json的时候.
如果接受到数据, 且成功解析为json格式,则成功显示.
如果解析
服务器端设置CORS()跨域资源共享(Cross-Origin Resource Sharing)
服务器端设置设置同域策略头.
跨域请求的时候, 也可以通过服务器端的设置, 设置响应头, 以避免浏览器拦截.
django中设置响应头需要通过response响应体设置: response['Access-Control-Allow-Origin'] = '所允许访问IP地址'
通过设置之后, 响应头会添加该'Access-Control-Allow-Origin'字段并指向请求地址.
HTML数据传输过程中的数据类型
在django中的reqeust, 数据传输编码是URLencode方式编码的.
在传输页面文本的时候, 则不会采用编码,直接使用文本方式传输内容."text/html"
在django中, 如果网站传输方式为Get或者Post请求, 这个时候浏览器会对数据进行编码, 编码方式为"application/x-www-form-urlencoded", 也是默认的编码格式urlencode. 可以通过reqeust.get或者request.post取值.
- Python中处理json数据
但是如果是通过Json数据格式传输的话, 则编码方式是(text/plain纯文本)方式.在python中获取到的字符串属于bytes类型, 无法直接通过reqeust方式取值.
处理bytes类型数据需要先将数据由bytes类型,用decide解码为字符串类型, 一般编码格式为('utf8'). 然后再使用json函数的loads方法读取这个json字符串,转化成python能够识别出来的字典形式. - 容易混淆的概念
HTMLEncode编码格式, 是通过把网页页面中不容许出现的字符进行编码,通常是编码以下字符:"<"、">"、"&"、"""、"'"等
UrlEncode编码格式, 是将指定的字符串按URL编码规则,包括转义字符进行编码。
其他
Linux 查询端口号
netstat 查询端口号, -tlp 可以查询所有占用当前网络端口的进程id, 相应可以kill掉不需要进程
- t 忽略长地址
- l 正在监听的套接字
- p 查看该进程pid和name
Data
修改表结构
在已经存在的数据库数据表中修改结构--- 添加新字段 的时候, 通常要设置新增加字段的默认值. 否则则容易出现问题,可以在增加字段后再取消掉.
添加关联表
已有表添加关联表需要设置 null=True. 关联之后再取消.
rbac权限验证
在相对应角色的权限中,url路径的表示上, 例如修改和删除对应不同的id, 则需要通过正则表达式来表示内容.
例如:
/user/
/user/edit/(d+)
/user/delete/(d+)
/user/add