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)

1569330723369

1569330732031

原文地址:https://www.cnblogs.com/Doner/p/11581228.html