Python 后端第二弹

时间:2022-01-11 16:07:55

(一)闭包和 lamda 表达式

  1. 一切变量的保存都需要占用内存。当一个内存空间不再可能被内存访问时,就会被 Python 虚拟机回收,将重新分配给其他变量。
  2. 不能被访问:
  • 变量被 del 语句删除
  • 一般情况下函数中定义的变量在函数运行时被分配给内存空间,在函数运行结束后不再可能被访问
  • 对象不再被任何变量引用时,它不可能被访问
  • 关于函数运行分配内存的说明
    • 每个函数运行时都要分配给它一定的内存空间
    • 同一个函数多次执行,不一定每次都分配了同样的内存 空间
    • 如果函数执行过一次后,其内存空间没有完全被回收。则再次运行时分配的内存应当避开这些没有被回收的空间,另外开辟一块
    • 在并发(或并行)执行多个函数时,无论他们是否是同一个函数名,无论他们是否来自于同一段代码定义,每个函数都分配有独立的一块内存空间
  •  闭包机制
    • 对于“闭包”可以从三个方面理解
      • 语法上:闭包是指利用函数定义嵌套,外层函数限制内层函数定义的*变量
      • 实现上:闭包是通过利用函数可以作为返回值(或函数的参数)的特性以及内存管理机制,保持对一个已经执行完毕的函数的变量进行访问。(由于访问被保持,所以这些变量的内存并不会被回收)
      • 意义上:闭包函数所“包”的变量能且仅能被这个函数访问,这样就保持了数据的纯净,防止数据被污染(被其他代码访问或修改)
    • 简单来说:设有一对有嵌套关系的函数定义。内层函数中有可以访问外层函数变量的代码。通过保持对内存函数的访问已经执行完的外层函数的变量不被删除

     

       5. 在上古编程时代还没有内的说法,我们通过闭的方式向里面传递参数。这样就实现了一个和类差不多的功能

    (二)浏览器传来的 Query

      浏览器客户端传来 Query 的方法可以有两种,一种是用 GET 方法,另外一种是用 POST 方法

      GET 方法没有body,依靠的是路由传参,我们直接解析出 path query 就可以

      GET

      • 请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的: 
      • GET 请求可被缓存
      • GET 请求保留在浏览器历史记录中
      • GET 请求可被收藏为书签
      • GET 请求不应在处理敏感数据时使用
      • GET 请求有长度限制
      • GET 请求只应当用于取回数据
      • /test/demo_form.asp?name1=value1&name2=value2

      POST

      • POST 请求不会被缓存
      • POST 请求不会保留在浏览器历史记录中
      • POST 不能被收藏为书签
      • POST 请求对数据长度没有要求
      • POST /test/demo_form.asp HTTP/1.1
        Host: w3schools.com
        name1=value1&name2=value2

     

     

    (三)类方法存在的意义

    1. 类方法是类名直接可以调用的方法,在函数的前面用 @classmethod 来修饰。类方法必须传入 def fun(cls): ,它的主要使用目的是在实例存在以前操作模板,还可以用类方法产生实例。比如说我们常用的 all() fund_by(slef.id = user.id) 函数
    2. 实例对象可以调用类方法实例方法
    3. 静态方法是共享的,放在哪儿都无所谓,讲道理的话通常把静态方法放在 class 的外面

     

     

    (四)包和模块

    • 包就就是一个文件夹,里面必须有__init__.py 文件,这样才是一个包。包其实理解为一种抽象和封装。比如我把一些列的基本操作封装成函数,然后对函数进一步抽象封装成了类,我们还把不同功能的 .py 文件封装成一个模块
    • .py 文件我们叫做一个模块
    • 如何导入呢?   
    • # import math
      # from math import sin 这是模块的导入方法
      
      # 如何在模块中导入呢? 这个时候我们可以使用点语法
      
      # from routes.routes_simpleto import routes_dict as ^^^^
      

        Python 后端第二弹

       

       

    (五)摘要算法

      

    1. 摘要算法/用处/常见套路
      • 摘要算法是一种能产生特殊输出格式的算法
      • 给定任意长度的数据生成定长的密文
      • 摘要结果是不可逆的, 不能被还原为原数据
      • 理论上无法通过反向运算取得原数据内容
      • 通常只被用来做数据完整性验证
      • 或者是用来加密用户密码
      • 常用的摘要算法主要有 md5 和 sha1

      2.  md5 的输出结果为 32 字符

         sha1 的输出结果为 40 字符

      我们储存在数据库中的密码最好不要是明文,如果被别人偷到数据库就麻烦了。我们通过摘要算法把密码映射成一个定长的字符串。但是如果被别人偷到了字符串,还是可以在短时间内背包里破解。或者通过彩虹表等东西直接查询。

    import hashlib # 要加密的是 'gua' # 用 ascii 编码转换成 bytes 对象
    pwd = 'gua'.encode('ascii') # 创建 md5 对象
    m = hashlib.md5(pwd) # 返回摘要字符串, 这里是 c9c1ebed56b2efee7844b4158905d845
    print(m.hexdigest()) # # 创建 sha1 对象
    s = hashlib.sha1(pwd) # 返回摘要字符串, 这里是 4843c628d74aa10769eb21b832f00a778db8b17e
    print(s.hexdigest())

    我们的解决方案是通过加盐的方法,增加盗取者破译的时间成本。加盐就是在生分的字符串上加入一些无意义的字段,比如:

    YIHI&*……%……&c9c1ebed56b2efee7844b4158905d845
    def salted_password(self, password, salt):
        def md5hex(ascii_str):
            return hashlib.md5(ascii_str.encode('ascii')).hexdigest()
        hash1 = md5hex(password)
        hash2 = md5hex(hash1 + salt)
        return hash2
    

      

     

     

    (五)Web 后端传递数据的原理

      Web整个机制就像是人与机器在对话一样,不过只是比较机械的对话。用户给出一封信(HTTP 协议格式的信),服务器解析它并且机械地组织一封响应的信。(HTTP 协议)我们对 Web 页面的访问是通过对路由的识别解析来完成的(Very important),无论是前端通过超级连接来访问,还是在前端页面 form 表单中的 action = "/" 路径,还是在服务器来给浏览器的回信的时候加上 Location 字段来进行重定向都是通过路由来访问的。如果我们把后端的框架搭建好,那么编写路由函数就成了后端编程的主要工作。上古时期前端提交数据,就是用的 form 表单,然后依靠表单中的 action 数据实现路由跳转。今天的 Web 技术已经实现了 Ajax 技术,可以异步提交数据,和 Javascript 配合不用跳转页面就可以拿到数据。

     

     

    (六 )数据库

      数据库分为关系型数据库和非关系型数据库。关系新数据库约束比较复杂,早期主要是给银行设计的,为了保证数据的安全,如 MySQL。最近十几年 NoSQL 型的数据库也是十分的流行,如:MongoDB。我们在后端编程使用数据库的时候会把数据库的一些 API 封装成我们最初设计的 Model 类的样子,所以加入数据库我们的后端操作方式基本没有改变,还是在使用 Model 这个设计的存储模式。