python装饰器
装饰器高阶函数高阶函数满足下面一个条件
接受一个或多个函数作为参数
输出一个函数
函数也是对象,是可调用对象
函数可以作为普通变量,也可以作为函数的参数、返回值
def counter(base):
def inc(step=1):
base += step
return base
return inc
def counter(base):
def inc(step=1): # 有没有闭包?
nonlocal base # 形参base也是外部函数counter的local变量
base += step
return base
return inc
c1 = counter(5)
print(c1())
print(c1())
print(c1())
f1 = counter(5)
f2 = counter(5)
print(f1 == f2) # 相等吗? 不相等
柯里化
指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以 ...
python魔术方法
魔术方法一、实例化
方法
意义
__new__
实例化一个对象,该方法需要返回一个值,如果该值不是cls的实例,则不会调用__init__ 该方法永远都是静态方法
class A:
def __new__(cls, *args, **kwargs):
print(cls)
print(args)
print(kwargs)
return None
def __init__(self,name):
self.name = name
a = A(1,2)
print(a)
#输出
<class '__main__.A'>
(1, 2)
{}
None
__new__ 方法很少使用,即使创建了该方法,也会使用return super().__new__(cls) 基类obejct的__new__ 方法来创建实例并返回。
二、可视化
方法
意义
__str__
str()函数、format()函数、print()函数调用,需要返回对象的字符串表达,如 ...
pymysql
pymysql驱动与mysql通信就是典型的cs模式。Server就是服务端,使用客户端先建立连接,数据库编程时,这个客户端就变成了程序。
mysql基于TCP协议之上开发,传输的数据必须遵循mysql的协议。
封装好mysql协议的包,习惯上称为驱动程序。
MYSQL的驱动
MySQLdb
最有名的库,对Mysql的C Client封装实现,支持Python2,不更新了,不支持python3
mysqlclient
在mysqldb的基础上,增加了对python3的支持
Mysql官网Connector
Mysql官网 https://dev.mysql.com/downloads/connector/
pymsql
语法兼容mysqldb,使用纯python写的mysql客户端库,支持python3
cpython2.7、3.4
mysql5.5+、mariadb5.5
pymysql使用安装
pip install pymsql
pip isntall simplejson
simplejson处理json文件方便。
创建数据库和表CREATE DATABAS ...
WSGI APP
WSGI APP函数必须两参数,一个是envirn 字典wsgiserver封装成请求字典,另一个是start_response ,然后调用app,
wsgi 原理:
客户端(网站)发送请求报文到 wsgi Server,wsgiserver会将请求封装成environ 字典,还会提供start_response函数,然后通过Django调用app函数,函数必须有两个参数,一个是enviro字典,另一个是start_response 函数(两个参数,一个是status状态码,另一个是二元组比如:start_response(‘200 OK’,[(‘Content-Type’,’text/html;charset=utf-8’)])),在app函数返回前,必须调用start_response(返回响应头),生成响应body体,然后返回给wsgi,wsgi生成响应报文,返回给客户端。
WSGI
WSGI (Web Server Gateway Interface) 主要规定了服务器端和应用程序间的接口
WEB server主要负责HTTP协议请求和响应,但不一定支持 ...
Django项目构建
Django项目构建概述Django采用MVC架构设计的开源的WEB快速开发框架。
优点:
MVC设计模式
大而全的重架构,自带ORM、Template、Form、Auth核心组件,便于快速开发
简介的url设计
实用的管理后台Admin
周边第三方插件丰富(drf)
缺点:框架重、同步阻塞
Django的设计目标就是一款大而全,便于企业快速开发项目的框架,因此企业广泛采用。
项目构建启动pycharm 点击 create new project. 选择建立新的虚拟环境(每个项目独立开发,所以需要独立的虚拟环境),选择基于开发的解释器版本。
本次开发依然采用Pycharm社区版,看似缺少了一些功能,但实际开发够用了。
安装DjangoDjango的安装参考 https://www.djangoproject.com/download/
Python版本依赖,参考 https://docs.djangoproject.com/en/3.2/faq/install/#what-python-version-can-i-use-with-django
长期支持版本是企业的选择,由于 ...
DjangoORM
Django ORMORMORM,对象关系映射,对象和关系之间的映射。这样就 可以使用面向对象的方式来操作数据库中的表。
关系模型和Python对象之间的映射
table => class ,表映射为类
row => object ,行映射为实例
column => property ,字段映射为属性
举例,有表student,字段为id int,name varchar,age int
映射到python为
class Student:
id = ?某类型字段
name = ?某类型字段
age = ?某类型字段
最终得到实例
class Student:
def __init__(self):
self.id = ?
self.name = ?
self.age = ?
Model模型字段类型
字段类
说明
AutoField
自增的整数字段,如果不指定,django会为模型类自动增加主键字段
BooleanField
布尔值字段,True和False,对应表单控件C ...
Django查询
Django查询查询集如果查的是一批数据,那么返回的是一个结果的集合
他是django.db.models.query.QuerySet的实例
他是可迭代对象
1、惰性求值创建查询集不会带来任何对数据库的访问,直到调用方法使用数据时,才会访问数据库。
在迭代、序列化、if语句、切片、len()、repr()、bool()中都会立即求值
参考:
https://docs.djangoproject.com/en/3.2/ref/models/querysets/#when-querysets-are-evaluated
2、缓存参考 https://docs.djangoproject.com/en/3.2/topics/db/queries/#caching-and-querysets
每一个查询集都包含一个缓存,来最小化对数据库的访问。
新建查询集,缓存为空。首次对查询集求值时,会发生数据库查询,Django会把查询的结果存在这个缓存中,并返回请求的结果,接下来对查询集求值将使用缓存的结果。
通过日志,观察下面的2个例子是要真正生成的语句了。
from employee.mod ...
Django中间件及源码解读
Django中间件及源码解读洋葱模型中间件和视图,如同洋葱一层层包裹着最中心的视图想要见到视图函数或返回给浏览器端很不容易,需要在来路和去路都要经过这些中间件。
get_response非常重要,表示去调用下一层的对象。对象可能是下一级中间件,也可能是洋葱心儿——视图。
在阅读wsgi.py源码中,进入 django.core.handlers.wsgi.WSGIHandler 类,可以看到 __init__ 中加载了中间件,在 __call__ 中调用了get_response。
中间件定义Django1.10版本开始,中间件帮助文档已经不能很好的体现其技术原理了。在官网切换到1.8版本帮
助,看到下面内容 https://docs.djangoproject.com/en/1.8/topics/http/middleware/
再看看目前的版本的文档 https://docs.djangoproject.com/en/3.2/topics/http/middleware/
从文档中可以看出保留process_view、process_exception、process_templ ...
Session和Cookie
Session和Cookie浏览器端和服务器端身份认证的一种方式。简单讲,就是为了让服务端确定你是谁。
无状态,无连接
无连接:Http1.1之前,都是一个请求一个连接,连接用完即刻断开,其实是无连接。
有连接:是因为他基于TCP协议,是面向对象的,需要3次握手、4次断开
短连接:而tcp的连接创建销毁成本高,对服务器有很大影响。所以,自http1.1开始,支持keep-alive,默认页开启,一个连接打开后,会保持一段时间(可以设置),浏览器再访问该服务器就使用这个TCP连接,减轻了服务器压力,提高了效率
无状态:服务器端没有记录每一次客户端请求相关的任何状态数据,服务器无法确定2次请求之间的联系,即使是前后2次同一个浏览器也没有任何数据能够判断出是同一个浏览器的请求,后来可以通过cookie、session来判断
cookie技术
键值对信息
是一种客户端、服务器端传递数据的技术
一般来说cookie信息是在服务器端生成,返回给浏览器端的
浏览器端可以保持这些值,浏览器对同一域发起每一请求时,都会把cookie信息发送给服务器端
服务端收到浏览器端发过来的cookie,处理这 ...
ModelSerializer
ModelSerializer参考: https://www.django-rest-framework.org/api-guide/serializers/#modelserializer
ModelSerializer是Serializer的子类除了具有Serializer的功能外:
根据Model类,自动生成字段
为序列化器自动生成校验器
为序列化器提供了简单的create()和update()方法实现,所以可以直接save()
注意虽然感觉上序列化器sava(create、update),但是真正操作数据库是通过Model类
序列化器需要解决2个问题
依照哪个Model类
需要哪些字段
from rest_framework import serizlizers
from .models import Employee
class EmployeeSerizlizer(serializers.ModelSerializer):
class Meta:
model = Employees #参照谁,谁save
fields ...