zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    android ioctl fuzz,android 本地提权漏洞 android root
    syscall 中断号
    EAT/IAT Hook
    VC中如何获取当前时间(精度达到毫秒级)
    Js表单验证控件-02 Ajax验证
    Js表单验证控件(使用方便,无需编码)-01使用说明
    字符串对比
    KindEditor编辑器For DotNet控件
    模板引擎开发(三)-自定义标签的处理
    Flash AS实现时钟效果(全脚本实现)
  • 原文地址:https://www.cnblogs.com/Doner/p/11581228.html
Copyright © 2011-2022 走看看