精华内容
下载资源
问答
  • web python 中,前端HTML无法加载外部引入的CSS、JavaScript、JQuery、img等情况和JQ的$语法报错 网上查阅了相关资料,尝试了解决办法: 不把样式文件放在HTML文件夹里,单独放在外面的static文件夹,服务器启动后...

    在web python 中,前端HTML无法加载外部引入的CSS、JavaScript、JQuery、img等情况和JQ的$语法报错

    网上查阅了相关资料,尝试了解决办法:
    不把样式文件放在HTML文件夹里,单独放在外面的static文件夹,服务器启动后在加载页面的时候会自动取寻找static文件夹下面的样式文件(注意文件夹名称一定要是static)
    样式文件放在外面static文件夹内
    本人经过网上的这种类似的方法尝试,发现并没有成功,无论将static文件夹放在哪里,均不能加载到样式文件
    没有办法,为了能够加载样式文件等外部引入的资源,本人将资源文件上传到服务器端,通过HTTP请求的方式来获取加载资源文件。
    通过HTTP请求加载资源文件
    **注意:**这样是能够成功加载,页面效果也能够出来,但是不能实现本地部署,即不能在断网的情况下展示效果,一定要有网络环境。一般在公司可以将资源文件上传到公司服务器以求暂时解决问题。

    补充问题:
    在python中引用JQuery,JQuery的$语法会与python自身语法产生冲突,因而为避免冲突,在使用JQuery的$符号时,要改写成$$或者JQuery即可,如上截图中框出js部分。

    展开全文
  • Python中协程最初使用yield来实现, 当程序运行到yield语句时就会将控制权交出来去执行其他的函数, 在Python3之前只能通过原生yield、greenlet以及Gevent第三方库来实现协程, 在Python3 之后引入了yield from, ...

    ** 0.深拷贝和浅拷贝的区别?**

    1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。好处:只拷贝引用,不增加内存
    2. copy.deepcopy 深拷贝 拷贝对象及其子对象 好处:可用于备份,源数据被修改它不会被影响
      可变类型(list,dict):浅拷贝只拷贝第一层,深拷贝会拷贝所有层
      不可变类型(int,string,float,tuple):深浅拷贝都一样,只拷贝引用
      注意:
      可变类型里嵌套不可变类型或不可变里面嵌套可变类型:浅拷贝只拷贝引用,而深拷贝为保证数据的独立性,它会从最外层到不可变类型都复制一遍
      作用:浅拷贝可以节省内存空间,pytho中大多数都是浅拷贝。可以根据需求进行浅拷贝还是深拷贝。例如是备份重要数据,不想被修改就采用深拷贝。(因为浅拷贝指向同一个地址,不会增加内存,相当于桌面快捷方式一样.)

    1.*args, ** kwargs是什么意思?

    *args: 可变位置参数。
    *kwargs: 可变关键字参数。

    2.谈一谈Python中的装饰器

    Python中的装饰器其实也是一种函数, 它可以在不修改原函数代码情况下扩展原函数功能。装饰器函数与普通函数不同之处就在于装饰器函数返回了一个函数对象,装饰器利用了闭包的原理来实现。主要用于日志插入,权限管理等等。

    3.Python的垃圾回收机制以及内存管理

    垃圾回收机制:
    Python的垃圾回收机制以引用计数为主, 标记清除、分代回收为辅。引用计数指:Python在内部维护了针对每一个对象的引用计数, 当一个对象创建或者被引用时,其引用计数将加1,当一个对象被销毁或作用域失效时, 其引用计数将减1。只有对象的引用计数为0时,这个对象将会被回收。引用计数的优点:简单、具有实时性。缺点:对象循环引用时将永远不会被销毁。对于对象循环引用的状况Python使用标记清除来解决,Python在内部实现了一个循环检测器, 不停的检测对象是否存在循环引用,如果两个对象互相循环引用并且不包含其他第三者对象时, 其将会被收回。在Python参考手册中有写道:
    当一个对象无法获取时, 那么这个对象有可能被当成垃圾销毁了。Python将所有对象分成了三代, 对象存活时间越长就越晚被回收, 反之则越早被回收。
    内存管理:
    Python使用了内存池机制来管理内存,其内存以金字塔的形式对内存功能进行划分,-1、-2层主要用于对操作系统进行操作, 0层中是C的malloc,、free等等内存分配和释放函数。1、2层是一个内存池, 当对象小于265K时将直接由这片内存池进行分配内存,否则将调用第0层中的C函数来分配内存,当小于265K的对象被销毁时, 其内存也不会被销毁, 只是返回给了内存池以便二次利用。2层是对Python对象进行操作。

    4.Python多线程

    Python中多线程由于有GIL的影响, 导致在任意时间内只有一个线程在运行,所以Python的多线程在处理计算密集型任务上效果反而不如单线程, 只有在处理IO密集型任务上多线程才能发挥实力,在等待IO过程中Python C源码会释放GIL, 最终会导致线程在等待IO过程中会被暂停去执行其他的线程。python中GIL主要是由于历史原因导致Cpython虚拟机中的GIL难以移除,同时GIL的存在保证了多线程之间数据完整性以及状态同步。

    5.说明os、sys模块不同,并列举常用的模块方法

    os: 提供了对使用操作系统函数的高度封装
    sys: 提供由解释器访问或者维护的变量以及与解释器交互的一些函数

    os模块只负责程序与操作系统交互, 提供了访问操作系统底层的接口封装。
    sys模块负责程序与解释器交互, 提供了一系列的函数用于操控Python运行的环境设置。
    os模块常用方法:
    os.getcwd() # 获取当前运行路径
    os.remove() # 删除指定的文件
    os.walk() # 生成指定目录下的文件夹以及文件
    os.makedirs() # 生成多成目录
    os.mkdir() # 生成目录
    os.rmdir() # 删除指定目录
    os.removedir() # 删除多层目录
    os.listdir() # 列出指定目录下所有的文件夹以及文件
    os.path.join() # 将分离的各部分组合成一个路径名
    os.path.getsize() # 获取指定文件大小
    os.path.exists() # 查看指定目录或者文件是否存在
    os.path.isabs() # 查看指定目录是否为绝对路径

    sys模块常用方法:
    sys.argv# 命令行参数列表
    sys.exit() # 退出程序并返回指定的整数
    sys.maxunicode # 最大的Unicode值
    sys.modules # 系统导入的模块名称
    sys.path # python搜索模块时的路径
    sys.stdout # 标准输出
    sys.stdin # 标准输入
    sys.stderr # 错误输出

    6.什么是lambda表达式?它有什么好处?

    lambda也是函数的一种, 在处理一些简单的操作时可以使用该表达式, 其好处是不用为一些实现简单功能的函数命名,毕竟编程只有两个难点: 缓存失效, 命名。

    7.Python里面如何拷贝一个对象?

    Python中拷贝分为深拷贝、浅拷贝。浅拷贝只拷贝父级对象, 不会拷贝对象内部的子对象,使用copy模块中的copy。深拷贝则会完全拷贝父对象以及子对象, 使用copy模块中的deepcopy。

    8.__new__和__init__的区别。

    __new__负责构建一个类对象并将其返回,init则负责初始化一些变量,不返回任何对象。在实例化一个类时, __new__方法将会先被运行, 其次才运行__init__方法。

    9.python中协程?协程的作用?

    Python中协程最初使用yield来实现, 当程序运行到yield语句时就会将控制权交出来去执行其他的函数, 在Python3之前只能通过原生yield、greenlet以及Gevent第三方库来实现协程, 在Python3 之后引入了yield from, yield from 用于重构生成器。在Python3.5之后引用了async和await, 其作为yield from, yield的完美替身来实现协程。

    协程的作用:当遇到阻塞就去执行其他的程序,例如遇到yield语句就跳出去执行其他函数

    10.Python的异常机制?

    Python中异常也是一个对象, 所有的异常的基类都是Exception。捕获异常使用try…except…语法,如果要try与except之间的代码出现了错误并且我们将其异常类型捕获了那么代码将会跳转代except中去执行。还可以使用raise 去手动的触发一个错误,也可以使用assert来触发异常, 只不过assert经常用来在测试中, 并且assert对程序的性能有着极大影响,只有内置的__debug__为True时assert才会执行。

    11.python旧式类(经典类)和新式类的区别

    经典类与新式类的区别是:继承搜索的顺序发生了改变,经典类多继承搜索顺序是深度优先, 按照从左至右的查找,并且将每一个父类的基类都查找一遍。新式类则是, 先从左至右的查找, 然后再向每一个父类的基类进行查找。(都是从左至右的顺序查找, 经典类查找一个父类时同时向上查找,新式类则是先查找所有的父类然后再向上查找)

    12.classmethod,staticmethod,property是什么?有什么作用?

    classmethod,staticmethod,property都是装饰器, 他们都作用在类的方法上。
    classmethod:使得被装饰的方法成为一个类方法既不需要实例化类就可以直接调用的方法,第一个参数为cls。
    staticmethod: 使得被装饰的方法成为一个静态函数既与普通的函数无区别。
    property: 将一个方法变成一个属性来使用。

    13.python中的绑定方法和未绑定方法是什么

    绑定方法:绑定了实例化的方法既第一个参数是self
    未绑定方法:没有绑定实例化的方法既类方法、静态方法

    14.python上下文管理器是什么?

    Python中上下文管理器使用with来调用主要用于数据库连接,文件操作, 网络操作。
    其作用是: 如果在进行一些打开资源操作时出现了异常,上下文管理器将会自动的执行一些资源清理操作。在进入上下文管理器时, Python会先调用对象的__enter__方法, 该方法返回一个对象用于进行一些操作,如果在进行一些操作时发生了异常Python则调用__exit__该对象接受三个参数第一个参数异常类,第二个参数异常提示字符串, 第三个参数traceback对象。

    15.functools的wraps是做什么的?

    wraps是一个装饰器功能是: 由于被装饰的函数传入到装饰器中时已经不是原函数了, 而是一个新的函数, 并且丢失一些原函数的属性, 为了不影响函数的使用, 可以使用wraps来抵消这种副作用。

    16.请说一说ORM实现原理

    ORM使用了Python的属性描述符协议实现,通过另外一个类来描述类变量的属性类型, 再给这个属性进行赋值时(对应数据库中的字段名称)会调用__set__方法,访问属性则会调用__get__方法删除则调用__delete__方法。

    17.请说一说迭代器和生成器区别?

    生成器时一种特殊的迭代器, 生成器自动实现了迭代器协议, 不需要手动的实现__iter__以及next方法,生成器在迭代的过程中可以改变当前的迭代值, 而普通的迭代器改变当前值时往往会发生错。迭代器必须实现__iter__以及next方法。

    18.描述一下type()的作用

    当type只传入一个参数时将返回该参数的类型,如果传入了三个参数则返回一个类对象,同时Python中的所有类的基类都是type

    19.Python中列表与元组的异同?

    相同: 列表和元组都是容器并且是可迭代对象,二者可以包含任意类型的对象。
    不同:列表是可变的, 元组是不可变。

    20.Python中的列表是如何实现的?

    Python中的列表使用了分离式技术实现的动态顺序表。

    21.Python中列表的索引查询的时间复杂度是多少?

    O(1)

    22.Python字典的实现原理?

    Python的字典使用了哈希表来储存key、value,当添加一个数据时首先会把key通过哈希函数转换成一个数字, 然后将该数字对存放value的数组长度取余并将取余结果当做数组的下标, 将value存放在该取余结果为下标的数组中。数据查询时将key转换为对应的数组下标,并定位到数组的位置获取value。

    23.什么是pickling和unpickling?

    Pickle模块读入任何Python对象,将它们转换成字符串,然后使用dump函数将其转储到一个文件中——这个过程叫做pickling,反之从存储的字符串文件中提取原始Python对象的过程,叫做unpickling。

    24.有哪些工具可以帮助debug或做静态分析?

    PyChecker是一个静态分析工具,它不仅能报告源代码中的错误,并且会报告错误类型和复杂度。
    Pylint是检验模块是否达到代码标准的另一个工具。
    dis用来查看Python对象的字节码。

    25.Python中的作用域

    在Python中,一个对象的作用于总是由代码被赋值的地方所决定的。当遇见一个变量时Python会按照: 本地作用域→ 当前作用域被嵌入的本地作用域→ 全局/模块作用域→ 内置作用域顺序搜索。

    26.Python的参数传递是值传递还是引用传递?

    可变对象使用引用传递, 不可变对象使用值传递

    27.写一个函数, 输入一个字符串, 返回倒序排列的结果

    def reverse(text):
        return text[::-1]
    

    28.python中is和==的区别

    is比较的是对象在内存的地址, ==比较的对象中的值

    29.什么是Python的闭包?

    内层函数引用了其外部作用域的变量,然后返回内层函数的情况,称为闭包,创建一个闭包必须满足以下几点:
    \1. 必须有一个内嵌函数
    \2. 内嵌函数必须引用外部函数中的变量,外层空间中被引用的变量叫做层函数的环境变量
    \3. 外部函数的返回值必须是内嵌函数
    \4. 环境变量和内层非全局函数一起构成了闭包

    30. Python的自省?

    type(),dir(),getattr(),hasattr(),isinstance()

    31.Python并发的解决方案

    Twisted是一个事件驱动型的网络引擎,不同于单线程和多线程模式,这种模式不需要过多去关心线程锁的问题,当遇到高并发问题时候,采用twisted会很好解决数据共享的问题。

    Tornado既是一个web server,也是web framework。就是说这个web框架有自己内置的web server,在写web时候可以用到它的高性能网络库,甚至有公司拿这个来做游戏的服务器,可以用它处理高并发问题。

    Gevent是基于协程的Python网络库,基于libev的快速事件循环,基于greenlet的轻量级执行单元,API的概念和Python标准库一致。

    sanic基于uvloop和httptools实现高并发异步网络框架


    操作系统相关

    1.进程的有哪几种状态以及导致转换的事件。

    进程有5种状态:
    运行态:该进程正在执行。
    就绪态:进程已经做好了准备,只要有机会就开始执行。
    阻塞态(等待态):进程在某些事情发生前不能执行,等待阻塞进程的事件完成。
    新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中,通常是进程控制块已经创建但是还没有加载到内存中的进程。
    退出态:操作系统从可执行进程组中释放出的进程,由于自身或某种原因停止运行。
    导致转换的事件:
    \1. 空->新建:创建执行一个程序的新进程,可能的事件有:新的批处理作业、交互登录(终端用户登录到系统)、操作系统因为提供一项服务而创建、由现有的进程派生等。
    \2. 新建->就绪:操作系统准备好再接纳一个进程时,把一个进程从新建态转换为就绪态。
    \3. 就绪->运行:需要选择一个新进程运行时,操作系统的调度器或分配器根据某种调度算法选择一个处于就绪态的进程。
    \4. 运行->退出:导致进程终止的原因有:正常完成、超过时限、系统无法满足进程需要的内存空间、进程试图访问不允许访问的内存单元(越界)、算术错误(如除以0或存储大于硬件可以接纳的数字)、父进程终止(操作系统可能会自动终止该进程所有的后代进程)、父进程请求终止后代进程等。
    \5. 运行->就绪:最常见的原因是,正在运行的进程到达了“允许不中断执行”的最大时间段,该把处理器的资源释放给其他在就绪态的进程使用了;还有一中原因可能是由于具有更改优先级的就绪态进程抢占了该进程的资源,使其被中断转换到就绪态。
    6.运行->阻塞:如果进程请求它必须等待的某些事件,例如一个无法立即得到的资源(如I/O操作),只有在获得等待的资源后才能继续进程的执行,则进入等待态(阻塞态)。
    7.阻塞->就绪:当等待的事件发生时,处于阻塞态的进程转换到就绪态。
    8.就绪->退出:在上图中没有标出这种转换,在某些进程中,父进程可以在任何时刻终止一个子进程,如果一个父进程终止,所有相关的子进程都被终止。
    9.阻塞->退出:跟上一项原因类似。

    2.进程与线程的区别。

    进程是资源分配的最小单位,线程是程序执行的最小单位。
    进程有自己的独立的地址空间, 线程共享进程中的数据,使用相同的地址空间。
    进程自己通信方式主要使用特别的方式来进行通信。线程之间的通信非常的方便, 同一进程下的线程共享全局变量、静态变量等数据。
    多进程程序更加的健壮,其中一个进程死掉了并不影响其他的进程,多线程中只要有一个线程死掉,那么整个进程也死掉了。

    3.进程通信的几种方式。

    进程之间进行通信常用的有几种方式:管道,消息队列, 信号量, 共享内存

    管道通常指无名管道, 他的特点包括:
    1.半双工:数据只能在一个方向流动,一端为读端,一端为写端
    2.有关系进程通信: 管道只能在具有亲缘关系的进程之间进行通信,如父子进程、兄弟进程
    3.文件: 管道是一种特殊的文件它有着像普通文件读写一样的API, 它只存在于内存中。
    Python实现:

    import os
    from time import sleep
    def child(wpipe):
        while 1:
            msg = "hello world!".encode()
            os.write(wpipe, msg)
            sleep(2)
    def parent():
        rpipe, wpipe = os.pipe()
        pid = os.fork()
        if pid == 0:
            child(wpipe)
        else:
            os.close(wpipe)
            fb = os.fdopen(rpipe, 'r')
            while 1:
                recv = os.read(rpipe, 1024)
                print(recv.decode())
    parent()
    # 输出
    """
    >>> python3.6 ./pipe.py 
    hello world!
    hello world!
    hello world!
    hello world!
    hello world!
    hello world!
    hello world!
    hello world!
    hello world!
    hello world!
    """
    

    消息队列存放在内核中, 一个消息队列有一个标识符来标识, 它的特点:
    1.消息队列是面向记录的, 其中消息具有特定的格式和特点的优先级
    2.消息队列独立于发送方和接受方,即使进程终止,消息队列中的消息并不会被删除。所以它可以用于无关进程之间通信
    3.消息队列可以对消息实现随机读取, 不需要按在特定的顺序来读取。

    信号量属于系统层面, linux系统也是通过信号量来管理进程,进程一旦接收到信号就会打断原来的程序执行流程来处理信号。

    import os
    import signal
    def handler(signalnum, frame):
        global receive_times
        print("收到信号", signalnum, frame)
    def main():
        print(os.getpid())
        signal.signal(signal.SIGTERM, handler)
        while True:
            pass
    if __name__ == '__main__':
        main()
    

    运行上面程序, 在另一个终端输入 kill pid,程序将会打印
    …收到信号 15 <frame object at 0x7ff6ea259630>

    共享内存是最简单的通信方式, 他允许多个进程(无关进程, 有关进程)访问同一片内存, 一个进程改变其中的数据后, 其他的进程也能看见数据的变化。共享内存特点:
    1.进程共享同一块内存
    \2. 访问共享内存和访问私有内存一样快
    3.不需要系统调用和内核入口
    4.不造成不必要的内存复制
    Python可以使用multiprocessing中Value、Array、Manager等等实现

    4.线程同步几种方式

    线程同步通常有4中方式: 临界区、事件、互斥量、信号量。

    临界区:拥有临界区的线程可以访问被保护起来的资源或者代码段, 其他线程如果想访问则被挂起, 直到拥有临界区对象放弃临界区为止。Python中使用:threading.Lock()实现。

    事件:可以自定义一个事件, 如果这个事件一直不发生, 则这些线程将会阻塞, 直到事件发生。 Python中使用threading.Event()实现 。

    互斥量:互斥量为资源引入了状态:锁定/非锁定, 某个线程要更改共享数据时, 先将其锁定, 此时其他线程不能对该资源进行操作, 直到资源被释放。Python中使用threading.Lock()实现 。

    5.用户线程与内核线程的区别

    用户线程的优点:
    1.线程切换不需要内核态特权, 进程不需要为了线程管理而切换到内核态。
    \2. 可以为应用程序量身定做调度算法而不影响系统调度程序。
    3.用户级线程可以再多个平台上运行, 不需要对内核进行修改以支持用户级线程。
    用户线程的缺点:
    1.当一个用户级线程执行一个系统调用时, 不仅这个线程会被阻塞, 进程中的所有线程都会被阻塞。
    2.在用户级线程策略中, 一个多线程应用程序不能利用多处理技术。
    内核级线程优点:
    1.线程切换由内核控制,可以很好的利用多核CPU。
    2.由操作系统内核创建和撤销, 一个内核级线程阻塞并不影响其他的线程运行。
    内核级线程缺点:
    1.由内核进行调度。不能跨平台。
    用户级线程和内核级线程的区别:
    1.内核线程是内核可感知的, 用户级线程是内核不可感知的。
    2.用户级线程创建,撤销等等不需要内核的支持, 内核级线程创建,撤销等等都需要内核的支持。
    3.用户级线程在调用系统指令是会导致其所属的进程被中断, 内核级线程在调用系统指令时, 只会导致该线程被中断, 与其他线程无关。
    4.用户级线程CPU调度以进程为单位, 用户程序进行线程的控制, 内核级线程CPU以线程为调度单位, 由系统的线程调度程序负责线程的调度工作。
    5.用户级线程的程序实体运行在用户态下程序, 而内核级线程的程序则可以运行在任何状态上。

    6.进程池、线程池的原理?

    线程池: 开启一定数量的线程并让其睡眠, 当需要一个线程去执行某种任务时, 唤醒某个线程让它执行任务, 任务执行完毕又让其睡眠。
    进程池同理

    7.进程为什么会产生死锁?

    导致死锁的原因:
    1.因为系统资源不足
    2.进程运行推进顺序不合适
    3.资源分配不当
    导致死锁的四个必要条件:
    1.一次一个进程只能访问一个资源, 其他进程不能访问已分配的资源。
    2.当一个进程等待其他进程时, 继续占有已分配的资源时
    3.不能强行抢占进程已有的资源
    4.存在一个封闭的进程链, 导致每一个进程都占有下一个进程所需的资源

    8.操作系统的四个特性?

    1.并行: 并行是指两个事件以上(包含)在同一时刻发生既物理上这些事件是同时发生的。
    2.共享: 系统中的资源可供内存中的多个进程共同使用, 由于资源的属性不同, 多个进程对资源共享方式也不同。
    3.虚拟:操作系统中的虚拟通过分时技术将多个物理设备转换成若干个逻辑上的对应物。
    4.异步:在多道程序设计环境下允许多个进程并发执行。

    9.什么是缓冲区溢出?有什么危害?其原因是什么?

    缓存区溢出指计算机在向缓存区填充数据时超过了缓存区的最大值, 溢出的数据覆盖在了合法数据上。
    其危害: 程序崩溃, 导致拒绝服务。跳转并执行恶意代码。
    造成缓存区溢出的原因主要是没有对用户的输入进行检查。

    10.操作系统中进程调度策略有哪几种?

    优先级服务,时间片轮换, 多级反馈


    网络相关

    1.TCP为什么需要3次握手

    三次握手的目的是:防止已失效的连接请求报文又传入到服务端,导致错误。

    2.TCP和UDP有什么区别?

    tcp是传输控制协议,其提供面向连接、可靠的字节流服务,通信双方必须依照三次握手协议连接之后才能传输数据, tcp提供了超时重传、 丢弃重复数据、检验数据流量控制等功能。
    UDP是用户数据包协议, 它提供了一个简单的不可靠的面向无连接的服务,在双方未连接时也能传输数据因而速度特别快。

    3.TCP/IP的流量控制?

    利用滑动窗口实现流量控制

    4.HTTP的长连接和短连接?

    短连接: 客户端与服务端每进行一次HTTP操作就建立一次连接,请求结束就断开连接。
    长连接:客户端与服务器进行第一次HTTP操作后, TCP连接并不会断开连接, 下次请求将复用这条TCP通道

    http://5.IO中同步与异步,阻塞与非阻塞区别

    同步和异步关注的是消息通信机制。
    同步:发出一个调用时, 在没有得到结果之前这个调用不会返回结果, 如果调用返回那么说明得到结果了。
    异步:发出一个调用后立刻返回, 但是返回时没有结果的。
    阻塞与非阻塞关注的是程序在等待调用的结果
    阻塞:调用结果被返回前该线程被挂起, 直到得到结果后,该线程继续运行。
    非阻塞:不能立刻得到结果之前, 该函数不会阻塞当前线程, 会立刻返回。

    6.Cookies 和 Session的区别

    cookies是一种保存在客户端上的字符串用于用户与服务端会话持久的保持数据
    Session是一种保存在服务器的字符串, 其功能与cookies相同, 但是session是在cookies基础上实现的。

    7.什么是TCP粘包、TCP粘包发生了怎么处理?

    TCP粘包是指发送方发送了若干个包到接收方接受时都粘成了一个包, 从缓存区来看后一个包的头部数据紧紧的接着前一个包的尾部。
    对于TCP粘包的情况有两种处理方式:
    \1. 接收方: 可以选择关闭tcp默认的nagle算法来避免粘包
    2.应用层处理: 格式化数据, 对于每一条数据都采用相同的格式必须有开始符以及结束符, 这样即使发生粘包也可以通过开始符和结束符判断数据边界, 也可以在数据开头就将该条数据的长度填充进数据中, 如果发生粘包则可以使用数据长度来区分每一条数据。
    UDP不会发生粘包, 因为UDP没有使用块的合并优化算法,导致接收端的缓存区内按照链式的结构来储存每一个UDP包, 并且每一个UDP包都有消息头,这样接收方就很好的进行拆包。

    8.TCP中的time_wait是什么情况?出现过多的close_wait可能是什么原因?

    timewait值tcp中主动断开连接一方的一个状态, 当主动断开连接的一方发送给对方FIN包,且对方回复了ACK+FIN时, 主动断开连接的一方将进入time_wait状态, 并持续到2msl后进入CLOSE状态。
    出现过多的close_wait的原因:被动关闭方未关闭socket造成。
    解决办法:
    1.为socket设置超时
    2.调整系统参数, 包括句柄参数和TCP/IP参数

    9.epoll,select的区别?边缘触发,水平触发区别?

    epoll将每一个监听事件都储存在了红黑树中并且只返回被触发的事件。epoll在睡眠结束后只需要检测就绪链表是否为空。
    select则将时间都放入一个列表中, 当其中某个事件被触发时,select将所有的事件返回给用户。select睡眠结束后需要遍所有的监听事件。

    10. tcp三次握手, 四次挥手

    三次握手:
    客户端 服务端
    ->SYN=1, seq=x
    <-ACK=1, ack=x+1, seq=y, SYN=1
    -> ACK=1, ack=y+1, seq=x+1
    <-> data
    四次挥手:
    主动关闭方 被动关闭方
    <-> data
    ->FIN=1, seq=x
    <- ACK=1, seq=y, ack=x+1
    <- FIN=1, ACK=1, seq=z, ack=x+1
    -> ACK=1, ack=z+1, seq=x+1


    数据储存与缓存相关

    1.数据库事务的四个特性及含义

    数据库事务的4个特性:原子性、持久性、一致性、隔离性
    原子性:整个事务中的所有操作要么全部完成, 要么全部都不完成, 如果在事务中操作出现异常,那么事务将会进行回滚, 就像这个事务从来没有执行过一样。
    持久性:在事务完成后,该事务所有的操作都将持久化在数据库中, 不会被回滚。
    一致性:在事务开始之前和事务结束之后, 数据库的完整性约束并没有被破坏。
    隔离性:确保在同一时间类只有一个事务处理某个数据。

    2.数据库索引使用了什么数据结构?

    数据库索引对于非主键索引使用B树, 对于主键索引使用B+树

    3.数据库优化的思路

    SQL语句优化:
    \1. 尽量避免在where语句后面使用 !=、<>操作符以及对NULL值得判断, 否则引擎将放弃索引而使用全表扫描。
    \2. 使用exists替换in。
    \3. 尽量放弃使用select *, 需要什么数据就取出什么数据。
    \4. 使用join代替子查询。
    \5. 设置合适的字段属性:例如尽量把字段设置为NOT NULL, 这样引擎就不要对比NULL值

    4.MySQL中myisam与innodb的区别

    \1. innodb支持事物, myisam不支持事物
    \2. innodb支持行级锁, myisam支持表级锁
    \3. innodb支持MVC, myisam不支持
    \4. innodb支持外键, myisam不支持
    \5. innodb不支持全文索引,myisam支持

    5.Redis支持的数据类型

    字符串,集合, 有序集合,哈希, 列表

    6.redis持久化的几种方式

    1. 快照: 默认使用这种方式,将数据快照存放在特定的二进制文件中。
    2. AOF: 将每一条命令都储存, 恢复时再将每一天命令进行运行。

    7. redis如何实现热数据缓存?

    当redis的内存数据大小上升到一定大小时, 就会实施数据淘汰策略, redis提供了6中数据淘汰策略
    volatile-LRU:从已经设置过期时间的数据中挑选最近最少使用的数据淘汰
    volatile-TTL: 从已经设置过期时间的数据中挑选即将要过期的数据淘汰
    volatile-RANDOM: 从已经设置过期时间的数据中随机选择数据进行淘汰
    allkeys-LRU:从数据集中挑选最近最少使用的数据淘汰
    allkeys-random:从数据集中任意选择数据淘汰
    no-enviction:禁止驱逐数据

    8.Redis 常见的性能问题都有哪些?

    \1. master写内存快照, save命令调度rdbSave函数会阻塞主线程的工作, 可能会导致间断性的暂停服务。
    \2. master AOF持久化, 最好不要使用AOF来进行持久化, 这个持久化方式对性能有着极大的影响。
    \3. redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。

    9.mysql字符集和排序规则?

    mysql中一个字符集至少有一个或者多个排序方式, 比如utf8就有:utf8_general_ci , utf8_general_cs等等。
    排序规则命名规则:字符集名字_语言_后缀, 其中
    \1. _ci:不区分大小写的排序方式
    \2. _cs:区分大小写的排序方式
    \3. _bin:二进制排序方式,大小比较将根据字符编码,不涉及人类语言,因此_bin的排序方式不包含人类语言
    字符集最常用的包括utf8, utf8md4。

    10.varchar与char的区别是什么?大小限制?utf8字符集下varchar最多能存多少个字符?

    char和varchar最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此存储的是实际字符串再加上一个记录字符串长度的字节。如果分配给char或varchar列的值超过 列的最大长度,则对值进行裁剪。

    varchar(M)和char(M),M都表示字符数.varchar的最大长度为65535个字节,不同的编码所对应的最大可存储的字符数不同。char最多可以存放255个字符,不同的编码最大可用字节数不同。

    字符类型若为utf8,每个字符最多占3个字节,varchar最大长度不能超过21845。

    11.primary key和unique的区别?

    一个表只能有一个primary key, 一个表可以有多个unique key。
    unique key约束只针对非主键列, 可以为空值, primary key约束针对主键列, 不允许有空值。

    12.外键有什么用,是否该用外键?外键一定需要索引吗?

    外键是为了一张表记录的数据不会太过冗余,也是为了数据的一致性和完整性。

    如果业务逻辑相当的复杂那么建议使用外键来保证数据的一致性和完整性, 如果业务逻辑不复杂则可以不使用外键, 仅靠程序中来保证数据的一致性和完整性, 或者业务对数据的一致性完整性要求相当的高, 那么一定要用外键。同时如果为了不让mysql在性能有任何的形象应该避免使用外键。 所有应该视当前业务,数据等情况决定是否使用外键。

    外键需要索引, 因为外键在查询,更新,删除数据时会对数据进行查找, 所以需要对外键建立索引。

    13.索引有什么用?

    对于建立索引的列, mysql的查询效率会提高很多。

    14.谈谈redis的事务?用事务模拟原子+1操作?原子操作还有其它解决方案吗?

    redis的事务使用关键字multi开启事务, 使用exec执行事务中的语句,它可以执行多条语句, 所有的命令按照先进先运行的的运行, 不会被其他的命令加塞。
    用事务模拟原子+1操作:
    multi
    incr xx
    exec
    原子操作 可以使用 incr操作实现

    展开全文
  • 作者:Huangwei AI来源:Python学会缓存的重要性缓存对于每个Python程序员来说都是一个需要理解的重要概念。简而言之,缓存的概念主要是利用编程技术将数据存储在临时位置,而不...

    作者:Huangwei AI

    来源:Python学会

    缓存的重要性

    缓存对于每个Python程序员来说都是一个需要理解的重要概念。

    简而言之,缓存的概念主要是利用编程技术将数据存储在临时位置,而不是每次都从源检索数据。

    随后,缓存可以提高应用程序的性能,因为从临时位置访问数据比每次从源(如数据库、web服务等)获取数据更快。

    本文旨在解释Python中的缓存是如何工作的。

    为什么我们需要实现缓存?

    要理解缓存是什么以及为什么需要缓存,请考虑下面的场景。

    我们正在用Python构建一个应用程序,它将向最终用户显示产品列表。这个应用程序每天会被超过100个用户多次访问。应用程序将托管在应用程序服务器上,并且可以在internet上访问它。产品将存储在一个数据库中,该数据库将安装在数据库服务器上。因此,应用服务器将查询数据库以获取相关记录。

    下图演示了我们的目标应用程序是如何设置的:

    问题

    从数据库获取数据是一个io绑定操作。因此,它的本性是缓慢的。如果频繁发送请求,而响应更新不频繁,那么我们可以将响应缓存到应用程序的内存中。

    我们可以缓存结果,而不是每次都查询数据库,如下所示:

    获取数据的请求必须通过线路,响应必须通过线路返回。

    这在本质上是缓慢的。因此,引入了缓存。

    我们可以缓存结果,以减少计算时间和节省计算机资源。

    缓存是一个临时存储位置。它以惰性加载方式工作。

    最初,缓存是空的。当应用程序服务器从数据库服务器获取数据时,它将用所需的数据集填充缓存。从那时起,后续的请求将从缓存获取数据,而不是一路到应用程序服务器。

    我们还需要及时使缓存失效,以确保向最终用户显示最新的信息。

    这就引出了本文的下一节:缓存规则。

    缓存规则

    在我看来,缓存有三条规则。

    在启用缓存之前,我们需要执行分析应用程序的关键步骤。

    因此,在应用程序中引入缓存之前的第一步是对应用程序进行概要分析。只有这样,我们才能了解每个函数需要多长时间以及它被调用了多少次。分析过程完成后,我们需要确定需要缓存的内容。

    我们需要一种机制来连接函数的输入和输出,并将它们存储在内存中。这就引出了缓存的第一条规则。

    1. 缓存的第一条规则:

    第一个规则是确保目标函数需要很长时间才能返回输出,它经常被执行,并且函数的输出不会经常改变。

    我们不希望为那些不需要很长时间就能完成的函数、在应用程序中很少被调用的函数或那些返回结果却在源代码中频繁更改的函数引入缓存。

    这是一个需要记住的重要规则。

    适合缓存的候选者:频繁调用的函数,输出不经常改变,执行需要很长时间

    作为一个实例,如果一个函数执行了100次,并且函数需要很长时间才能返回结果,并且对于给定的输入它返回相同的结果,那么我们可以缓存结果。

    然而,如果一个函数返回的值更新每一秒在源得到请求执行函数每分钟然后理解真的很重要我们需要缓存结果是否会最终将陈旧的数据发送给用户。这可以帮助我们理解我们是否需要缓存,或者我们是否需要不同的通信通道、数据结构或序列化机制来更快地检索数据,例如通过在套接字上使用二进制序列化器发送数据,而不是使用http上的xml序列化。

    此外,知道什么时候使缓存失效,什么时候用新数据重新加载缓存也很重要。

    2. 第二个规则:

    第二条规则是确保从引入的缓存机制获取数据比执行目标函数更快。

    只有当从缓存中检索结果的时间比从数据源检索数据的时间快时,我们才应该引入缓存。

    缓存应该比从当前数据源获取数据快

    因此,选择合适的数据结构(如字典或LRU缓存)作为实例是至关重要的。

    3.第三个规则:

    第三条重要的规则是关于内存占用的,这一点经常被忽略。您是在执行IO操作(如查询数据库、web服务),还是在执行CPU密集型操作(如计算数字和执行内存计算)?

    当我们缓存结果时,应用程序的内存占用将会增加,因此选择适当的数据结构并只缓存需要缓存的数据属性是至关重要的。

    有时我们查询多个表来创建一个类的对象。但是,我们只需要在应用程序中缓存基本属性。

    缓存影响内存占用

    作为一个实例,考虑我们构建了一个报告指示板,它查询数据库并检索订单列表。为了便于说明,让我们考虑一下仪表板上只显示订单名。

    因此,我们可以只缓存每个订单的名称,而不是缓存整个订单对象。通常,架构师建议创建一个具有__slots__属性的精益数据传输对象(DTO),以减少内存占用。也使用了命名元组或Python数据类。

    这就引出了本文的最后一节,概述了如何实现缓存的细节。

    如何实现缓存?

    有多种实现缓存的方法。

    我们可以在Python进程中创建本地数据结构来构建缓存,或者将缓存作为服务器,充当代理并为请求提供服务。

    有一些内置的Python工具,比如使用functools库中的cached_property装饰器。我想通过提供缓存装饰器属性的概述来介绍缓存的实现。

    下面的代码片段说明了缓存属性是如何工作的。

    from functools import cached_property
    class FinTech:
      
      @cached_property
      def run(self):
         return list(range(1,100))
    

    结果,FinTech().run现在被缓存,range(1100)的输出将只生成一次。然而,在实际场景中,我们几乎不需要缓存属性。

    让我们回顾一下其他方法。

    1. 字典的方法

    对于简单的用例,我们可以创建/使用映射数据结构,如字典,我们可以保存在内存中,并使其在全局框架上可访问。

    有多种方法来实现它。最简单的方法是创建一个单例样式的模块,例如config.py

    在配置。我们可以创建一个dictionary类型的字段,在开始时填充一次。从那时起,可以使用dictionary字段来获取结果。

    2. 最近使用的算法

    我们可以使用Python的内置特性LRU。

    LRU代表最近最少使用的算法。LRU可以缓存函数的返回值,这些返回值依赖于传递给函数的参数。

    LRU在递归CPU绑定操作中特别有用。

    它本质上是一个装饰器:@lru_cache(maxsize, typed),我们可以用它来装饰函数。

    maxsize告诉装饰器缓存的最大大小。如果我们不想设置大小,那么只需将其设置为None。

    typed用于指示是否要将输出缓存为可以比较不同类型值的相同值。

    当我们期望相同的输入产生相同的输出时,这是有效的。

    将所有数据保存在应用程序的内存中可能会带来麻烦。

    在具有多个进程的分布式应用程序中,这可能会成为一个问题,因为不适合将所有结果缓存到所有进程的内存中。

    一个很好的用例是应用程序运行在一个机器集群上。我们可以将缓存作为一种服务托管。

    3.缓存即服务

    第三种选择是将缓存数据作为外部服务托管。该服务可以负责存储所有请求和响应。

    所有应用程序都可以通过缓存服务检索数据。它就像一个代理。

    假设我们正在构建一个和Wikipedia一样大的应用程序,它将同时或并行地服务1000个请求。

    我们需要一个缓存机制,并希望在服务器之间分布缓存。

    我们可以使用memcache并缓存数据。

    Memcached在Linux和Windows中非常流行,因为:

    • 它可以用于实现具有状态的记忆缓存。

    • 它甚至可以跨服务器分布。

    • 它使用起来非常简单,速度很快,并且在多个大型组织中广泛使用。

    • 它支持自动过期缓存的数据

    我们需要安装一个叫做pymemcache的python库。

    Memcache要求数据以字符串或二进制形式存储。因此,我们必须序列化缓存的对象,并在需要检索它们时反序列化它们。

    代码片段展示了如何启动和使用memcache:

    client = Client(host, serialiser, deserialiser)
    client.set(‘blog’: {‘name’:’caching’, ‘publication’:’fintechexplained’}}
    blog = client.get(‘blog’)
    
    展开全文
  • Python 通过cookie注入状态,Cookie的引入改变了客户端和服务器之间的整体关系,使之状态化了,然而没有涉及对HTTP协议本身的修改。状态信息通过请求和响应的报头进行通信。服务器会在响应报头中向用户代理发送...

    Python 通过cookie注入状态,Cookie的引入改变了客户端和服务器之间的整体关系,使之状态化了,然而没有涉及对HTTP协议本身的修改。状态信息通过请求和响应的报头进行通信。服务器会在响应报头中向用户代理发送cookie。用户代理会在请求报头中保存并使用cookie进行响应。

    用户代理或浏览器需要保留cookie值的缓存,将它作为响应的一部分来提供,并在后续的请求中包含相应的cookie。Web服务器会在请求报头中查找cookie,并在响应报头中提供更新了的cookie。这样做的效果是Web服务器变为无状态的,而状态的改变只在客户端发生。服务器将cookie视为请求中的额外参数,并会在响应中提供一些附加的细节信息。

    Cookie可以包含任何内容。通常会将它们加密以避免Web服务器的详细信息暴露给客户端计算机上运行的其他应用程序。传输巨大的cookie会拖慢处理速度。优化这种状态处理的最佳方法是使用现有框架。我们将忽略cookie和会话管理的细节。

    会话的概念是Web服务器的一个特性,而不是HTTP协议。通常将会话定义为具有相同cookie的一系列请求。在发出初始请求时,由于没有可用的cookie,因此会创建一个新的会话cookie。每个后续请求都将包含该cookie。一个登陆用户的会话cookie中会包含其他细节信息。只要服务器还继续接收该cookie,会话便可以一直存续,即cookie可以永久有效,或者在几分钟后失效。

    Web服务的REST方法不依赖会话或cookie。由于每个REST请求都不同,因此相比使用cookie来简化用户交互的交互式网站,它不是那么用户友好。

    本教程关注基于REST的Web服务是因为它们非常符合函数式设计模式。

    使用无会话REST进程的一个结果是每个单独的REST请求都会被单独验证。如果需要身份认证,则意味着REST通信必须使用SSL(secured socket layer,安全套接字层)协议。可以使用https方案将凭证从客户端安全地传输到服务器。

    函数式设计的服务器考量

    HTTP背后的一个核心思想是服务器响应是对请求的函数。从概念上讲,Web服务应该具有顶层实现,概括如下:

    然而这样做是不切实际的。事实证明,HTTP请求并不是简单的、单一的数据结构,它包含一些必要的内容和可选的内容。请求可能含有报头、方法和路径,也可能有附件。这里的附件可能包括表单或上传的文件,或两者兼有。

    如果情况再复杂一些,那么可以将浏览器的表单数据作为GET请求路径中的查询字符串来发送,或者将其作为附件发送给POST请求。尽管可能会造成混淆,但大部分Web应用程序框架都会创建HTML表单标签,通过

    标签中的method=POST参数提供数据,随后表单数据会以附件形式包含在请求中。

    深入研究函数式视图

    HTTP响应和请求都有独立于主体的报头。请求还可以包含一些附加的表单数据或者其他上传的文件,因此可以把一个Web服务器视为如下形式:

    请求报头可能包含cookie值,可以将其视为额外添加的参数。此外,Web服务器通常依赖所运行的操作系统环境,因此也可以将该操作系统环境数据看作请求中提供的附加参数。

    对于内容,有一个范围虽广但十分合理的定义。MIME(multipurpose internet mail extensions,多用途互联网邮件扩展)类型定义了Web服务可能返回的内容类型。其中包括纯文本、HTML、JSON、XML,或者网站提供的非文本形式的各种媒体。

    当深入研究针对HTTP请求构建响应所需的处理时,会发现一些我们希望复用的公共特性。可复用元素的思想是创建从简单到复杂的Web服务框架。函数式设计的方式允许我们复用函数,这表明函数式方法有助于构建Web服务。

    下面介绍如何为服务响应中的各个元素创建管道,来讲解Web服务的函数式设计。我们将通过嵌套负责处理请求的函数来实现这一点,这样外部元素产生的一般开销就不会影响内部元素了。这也使得可以把外部元素作为过滤器,为无效的请求生成错误响应,并让内部函数只关注应用程序本身的处理。

    嵌套服务

    可以将Web请求处理看作许多嵌套的上下文。例如外层上下文可能涉及会话管理,即检查请求以确定这是现有会话还是新会话中的一个请求;内层上下文可能会为用于检测CSRF(Cross-Site Request Forgeries,跨站请求伪造)的表单处理提供令牌;其他上下文可能会处理会话中的用户身份认证。

    对于上面解释的功能,其概念性的视图如下所示:

    这里的思想是每个函数都可以建立在前一个函数的结果之上。每个函数既可以扩充请求,也可以因请求无效而将其拒绝。例如函数session()可以使用报头来确定这是一个现有会话还是一个新会话。由于CSRF处理要求会话有效,因此函数csrf()会检查表单输入以确保使用的是合适的令牌。对于缺少有效凭证的会话,函数authentication()会返回一个错误响应,而当存在有效凭证时,它可以使用用户信息来扩充请求。

    函数content()无须担心会话、伪造和未经身份认证的用户。它可以专注于解析路径,以确定应当提供哪类内容。在更复杂的应用程序中,函数content()可能包含极其复杂的映射,用于将路径元素映射到能确定合适内容的函数。

    然而嵌套的函数视图仍然不够准确,其问题在于每个嵌套的上下文可能还需要调整响应,而不是或者不仅是调整请求。

    理想的情况如下所示:

    这一概念体现出一种函数式设计思想:可以使用支持扩充输入或输出的嵌套函数集合来创建Web内容。更巧妙的做法是,应当定义可供不同函数使用的简单标准接口。一旦将该接口标准化了,就能以不同的方式组合函数并添加功能了,从而实现函数式编程的目标,用简单明了的程序提供Web内容。

    展开全文
  • 把数据库划分读库和库,读库可以有多个,通过同步机制把库的数据同步到读库,对于需要查询最新写入数据场景,可通过在缓存中多一份,通过缓存获得最新数据。 其中涉及的技术包括:Mycat,它是数据库中间件,...
  • Python之旅HTML

    2019-09-24 21:01:22
    目录详情参考HTML标记语言HTML标签HTML标签分类注释额外知识点以及建议标签属性全局属性HTML标签元素分类文档类型声明文档总结构head中的标签basetitlemetastylelinkscriptbody中的标签...
  • 关于web服务器架构的思考

    千次阅读 2013-05-05 21:45:12
    关于web服务器架构的思考 笔者最近一年都在从事企业私有云存储的开发,主导并推动了服务器架构的重构。在架构演化的过程中,有了很多的心得体会,这里记录一下,算是对自己架构成长的一个总结。 原则 对于...
  • HTTP协议,是用于从服务器传输超文本到本地浏览器的传送协议。 HTTP由请求和响应构成,是一个无状态、应用层协议。 HTTP的作用: 使浏览器更加高效,使网络传输减少。 保证计算机正确快速地传输超文本文档,还能确定...
  • Python爬虫

    2021-09-30 12:12:44
    Python爬虫
  • 网络相关01 IP地址的正则03 三次握手四次挥手全过程 为什么握手不是三次或者两次04 使用python打开百度页面05 进程 线程 协程06 IO多路复用07 TCP和UDP的区别09 get和post post和put10 有一个文件,这个文件只能被...
  • 参加 2019 Python开发者日,请扫码咨询 ↑↑↑作者 |tonnie来源 | 知乎专栏本文将以个人(开发)的角度,讲述如何从零开始,编写、搭建和部署一个基于...
  • 这是作者的网络安全自学教程系列,主要是关于安全工具和...本文将分享另一个主题——Cracer教程,第一篇文章将详细讲解安全术语、Web渗透流程和Windows基础、注册表及黑客常用DOS命令。基础性文章,希望对您有所帮助。
  • 有关Web 安全学习的片段记录(不定时更新)

    千次阅读 多人点赞 2014-10-26 18:59:42
    1、有关html/css, js, php, cgi 的一些认识  当我们浏览器访问一个站点的静态文件,会把文件内容都下载下来(一般压缩),当然如果遇到外联的css/js,会再发起请求得 到。如果我们右键查看网页源代码,一片混乱没法...
  • Python编码规范修炼与代码安全 在编写符合规范的代码以提高可阅读性时,注意代码的安全问题也不能忽视。 互联网企业的核心就是产品,如果对软件产品安全不够重视,受到的经济损失将是无法估计的,有可能影响着企业的...
  • 本篇文章整理总结了一些前端面试题,涵盖面很广,并且面的都是知名大厂,所以这些题还是很有代表性的,都掌握以后一面基础面应该没什么问题,二面也能应付大半,奉上: css相关 更多教程:https://sucaiip.com/ ...
  • 点击关注公众号,回复“1024”获取2TB学习资源!本文会详细描述两种通用的保证API安全性的方法:OAuth2和JSON Web Token (JWT)假设:你已经或者正在实现API;你...
  • 使用简单的 5 个步骤设置 Web 服务器集群 使用 Linux Virtual Server 和 Linux-HA.org 的 Heartbeat 进行构建和运行 使用 Linux Virtual Server 和 Heartbeat v2,分 5 个步骤跨越多个物理或虚拟 ...
  • 文章来源:http://www.ibm.com/developerworks/cn/linux/l-linux-ha/index.html 使用简单的 5 个步骤设置 Web 服务器集群 使用 Linux Virtual Server 和 Linux-HA
  • python后端面试题大全

    2020-12-02 13:27:20
    Python相关1.*args, **kwargs是什么意思?*args: 可变位置参数。*kwargs: 可变关键字参数。2.谈一谈Python中的装饰器Python中的装饰器其实也是一种函数, 它可以在不修改原函数代码情况下扩展原函数功能。装饰器函数...
  • Gleam 能够与绝大部分 Python 数据可视化库对接,利用自带的 Web 服务器,将会直接过转变 Web 页面效果。 13.Plotly----Plotly 是一个在线数据可视化平台,提供几百种数据可视化效果。Plotly 最大特点是能够在线...
  • 原文地址:Web Application Security Checklist原文作者:Teo Selenius(已授权)译者 & 校正:HelloGitHub-小熊熊 &...
  • Python

    千次阅读 2020-12-19 12:02:53
    1.下面能够支持Python开发的环境有哪些? A. IDLE B. Anaconda3 C. PyCharm D. Eclipse 2,下面特点属于Python语言的有哪些? A. 开源 B. 免费 C. 跨平台 D. 解释执行 ...
  • 一、Python复习教程(重点)- 基础

    千次阅读 多人点赞 2020-10-26 16:26:28
    文章目录目录导航:一、Python基础1.1 Python安装和使用1.1.1 Python环境搭建1.1.2 运行Python(1) 交互式解释器(2) 命令行脚本(3) 集成开发环境(IDE:Integrated Development Environment): PyCharm1.2 Python基础...
  • 使用简单的 5 个步骤设置 Web 服务器集群 使用 LinuxVirtual Server 和 Linux-HA.org 的 Heartbeat 进行构建和运行 使用 LinuxVirtual Server 和 Heartbeat v2,分 5 个步骤跨越多个物理或虚拟 Linux® ...
  • V:View,视图,负责产生Html页面 C:Controller,控制器,接收请求,进行处理,与M和V进行交互,返回应答。 1、用户点击注 2、按钮,将要注册的信息发送给网站服务器。 3、 Controller控制器接收到用户的注册...
  • Python常用库 - 【持续整理归档】

    千次阅读 2020-01-06 12:50:10
    Python常用库 - 【持续整理归档】,比较多,会逐步慢慢细化分类和扩从python常用库。 目录 1、常用库 2、Python文件处理库 3、Python图像处理库 4、Python游戏和多媒体类库 5、大数据与科学计算 6、其功能与...
  • 25.HTTP协议和WEB服务器APACHE

    千次阅读 2019-12-11 21:36:58
    HTTP协议和WEB服务器APACHE 本章内容 Internet http协议 Httpd介绍和安装 Httpd配置 http报文格式 1 Internet和HTTP协议 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4oCP6...
  • 缓存的重要性缓存对于每个Python程序员来说都是一个需要理解的重要概念。简而言之,缓存的概念主要是利用编程技术将...为什么我们需要实现缓存?要理解缓存是什么以及为什么需要缓存,请考虑下面的场景。我们正在用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,523
精华内容 1,009
关键字:

通过python写的web服务器为什么html的外部引入失效?

python 订阅