Python 后端第二弹

(一)闭包和 lamda 表达式前端

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

 

   5. 在上古编程时代尚未内的说法,咱们经过闭的方式向里面传递参数。这样就实现了一个和类差很少的功能python

(二)浏览器传来的 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 ^^^^
    

      

     

     

(五)摘要算法服务器

  

  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 这个设计的存储模式。   

相关文章
相关标签/搜索