wsfenxiang
1.使用python发邮件
-
申请一个邮箱,例如:126
-
开启POP3服务,顶部菜单栏中找到设置.
- 开启服务
- 开启客户端授权码,再次输入一个新的密码.
-
通过代码发送邮件
import smtplib from email.mime.text import MIMEText from email.utils import formataddr msg = MIMEText('邮件内容', 'plain', 'utf-8') msg['Subject'] = "邮件标题" msg['From'] = formataddr(["自己名字", '自己邮箱']) msg['To'] = formataddr(["老板", '老板邮箱']) server = smtplib.SMTP_SSL("smtp.126.com", 465) server.login("邮箱账户", "客户端授权码") server.sendmail('自己邮箱', ['要发送的邮箱', ], msg.as_string()) server.quit()
2.python相关书籍
入门:
- python核心编程/python cookbook
进阶:
- 流畅的python
高级:
- python源码剖析(py2.5 c语言)+ (现在可以看source源码下下来)
其他(之后看,挺好的,用于理解网络)
- 图解HTTP/图解TCP
- 大型网站架构(李智慧)
3.内存管理机制(垃圾回收机制)
-
对象分类:
-
定长的: int/float
#define _PyObject_HEAD_EXTRA \ struct _object *_ob_next; \ struct _object *_ob_prev; typedef struct _object { _PyObject_HEAD_EXTRA // 用于构造双向链表 Py_ssize_t ob_refcnt; // 引用计数器 struct _typeobject *ob_type; // 类型 } PyObject;
-
多个元素组成 : str/list/dict/set/tuple
typedef struct { PyObject ob_base; Py_ssize_t ob_size; /* Number of items in variable part */ } PyVarObject;
-
-
内存管理机制
-
引用计数器为主
def func(): 每次创建对象,会在内存中开辟空间,引用计数器默认为1; a = 123 在创建一个变量指向原来a开辟的内存,引用计数 +1; b = a func() 当引用计数器为0,则表示它时垃圾,可以进行回收.
-
循环引用的问题
当Python中对于 str/list/dict/set/tuple 类创建对象时,会将对象放到一个双向链表中. a = "asdf" b = [11,22] c = {'k1':123} 如果链表中达到700个对象,会对双向链表中的所有元素进行扫描. 如果有循环引用,则两个都-1,最后扫描完毕,将链表中的所有元素一分为二: 1. 引用计数器为0的对象, 回收. 2. 引用计数器不为0的对象,就将它放到另外一个双向链表中(总共有3个链表). (还有分代)
-
4.通过python代码操作MySQL
- pymysql/MySQLdb
- pymysql支持py2/py3
- MySQLdb py2
- ORM框架
- django orm ( 自己对数据连接有优化机制 )
- SQLAlchemy ( 自带数据库连接池 )
5. 数据库连接池 DBUtils
import pymysql
from DBUtils.PooledDB import PooledDB, SharedDBConnection
POOL = PooledDB(
creator=pymysql, # 使用链接数据库的模块
maxconnections=10, # 连接池允许的最大连接数,0和None表示不限制连接数
mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
maxcached=5, # 链接池中最多闲置的链接,0和None不限制
maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
ping=0,
# ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='pooldb',
charset='utf8'
)
def index(request):
# 去连接池中获取连接
conn = POOL.connection()
cursor = conn.cursor()
cursor.execute('select * from tb1')
result = cursor.fetchall()
conn.close()
https://www.cnblogs.com/wupeiqi/articles/8184686.html
6.跨域
-
跨域?
由于浏览器具有同源策略的限制,所以在浏览器发送ajax请求时,由于当前的域名和ajax访问的域名不同,而被阻止. -
cors(本质:加了个响应头)
中间件方式:
不是同源的网站(ajax)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>无配齐的网站</h1> <input type="button" value="按钮1" onclick="sendMsg1();" /> <input type="button" value="按钮2" onclick="sendMsg2();" /> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <script> function sendMsg1() { $.ajax({ url: '/info/', type:'GET', success:function (arg) { console.log('请求成功',arg); } }) } function sendMsg2() { $.ajax({ url: 'http://127.0.0.1:8001/api/', type:'GET', success:function (arg) { console.log('请求成功',arg); } }) } </script> </body> </html>
访问第一个网站
from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^info/', views.info), ] from django.shortcuts import render,HttpResponse # Create your views here. def index(request): return render(request,'index.html') def info(request): return HttpResponse('info func')
异源处理:
urlpatterns = [ url(r'^api/', views.api), ] from django.shortcuts import render,HttpResponse def api(request): return HttpResponse('baidu.api')
普通模式:
def api(request): ret = HttpResponse('baidu.api') ret['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8000' return ret
但是因为,如果有很多的异源的网站,不能一一处理吧,太麻烦.
方式1 : 写装饰器, 装饰器也要写多个
方式2 :
中间件模式:
建立目录: md cors.py from django.utils.deprecation import MiddlewareMixin class CORSMd(MiddlewareMixin): def process_response(self,request, response): response['Access-Control-Allow-Origin'] = "*" return response settings.py中: MIDDLEWARE = [ ...... 'md.cors.CORSMd', ]
-
jsonp
用巧妙方式绕过了同源策略(劣势:只能发get请求)
- ajax阻止,但是script标签的src不阻止,伪造成src
- 不足:不知道什么时候来的?
- 返回的函数名包一下 函数一致,执行了,说明请求完了
主站:
url(r'^index/', views.index)
def index(request):
return render(request,'index.html')
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>无配齐</h1>
<input type="button" value="按钮2" onclick="sendMsg2();" />
<script>
function sendMsg2() {
var tag = document.createElement('script');
tag.src = 'http://127.0.0.1:8001/api/?callback=x1';
document.head.appendChild(tag);
document.head.removeChild(tag);
}
function x1(arg) {
console.log(arg);
}
</script>
-
删除,不一一添加了,太多了
-
上面的增加script = 下面在script中调用函数了
<head> <script>xxxxxxx("in func")<\script> <\head>
异源:
url(r'^api/', views.api),
def api(request):
func_name = request.GET.get('callback')
return HttpResponse('%s("baidu.api")' %func_name)