render_template模板页面传参
session机制的介绍:
request的基本用途介绍
这是因为没有在URL参数中找到,所以返回Python内置的None,而Flask不允许返回None。
解决方法很简单,我们先判断下它是不是None:
还记得上面有一次请求是这样的吗? ,仔细看下,infor有两个值。
在request请求中,解析POST数据
我们要想办法把我们要的username、password提取出来,怎么做呢?自己写?不用,Flask已经内置了解析器
解释原因:读取到的是字节流,我们进行解码,规则是,结果如下所示:
响应JSON时,除了要把响应体改成JSON格式,响应头的也要设置为
Flask中和的理解
在Flask内部维护者两个线程隔离的栈,指向了(应用上下文)中的栈顶。
线程有个叫做的类,也就是通常实现线程隔离的类。而自己实现了它的线程隔离类:werkzeug.local.Local,LocalStack就是用Local实现的。
LocalStack是flask定义的线程隔离的栈存储对象,分别用来保存应用和请求上下文。它是线程隔离的意思就是说,对于不同的线程,它们访问这两个对象看到的结果是不一样的、完全隔离的。这是根据的不同实现的,类似于门牌号。
从而就有了指向,所以我们在项目中使用是没有报错的,而我们上面的代码不是在请求中实现的,所以AppContext栈顶为空,current_app并没有指向一个对象。
中的config是字典的子类,可以用来设置自有的配置信息,也可以设置自己的配置信息。函数用来判断filename是否有后缀以及后缀是否在中。
客户端上传的图片必须以标识。upload_file是上传文件对应的对象。
-
获取server.py所在目录在文件系统中的绝对路径。
-
用来将upload_file保存在服务器的文件系统中,参数最好是绝对路径,否则会报错(网上很多代码都是使用相对路径,但是笔者在使用相对路径时总是报错,说找不到路径)
-
用来将使用合适的路径分隔符将路径组合起来。
我们用python客户端测试下:
要控制上产文件的大小,可以设置请求实体的大小,例如:
不过,在处理上传文件时候,需要使用
如果要获取上传文件的内容可以:
cookie是存储在客户端的记录访问者状态的数据。具体原理,请见 ,常用的用于记录用户登录状态的session大多是基于cookie实现的。
由上可以看到,可以使用添加和删除cookie,expires参数用来设置cookie有效时间,它的值可以是datetime对象或者unix时间戳,笔者使用的是unix时间戳。
当我们对某些网站进行爬取的时候,我们经常会换IP来避免爬虫程序被封锁。这些代理IP地址是如何获取的呢?其实很简单,目前网络上有很多IP代理商,例如神龙,天启,芝麻等等,这些代理商一般都会提供透明代理,匿名代理,高匿代理。本文就讲讲各种代理 IP 背后的原理
代理IP的介绍
代理实际上指的就是代理服务器,英文叫作 proxy server,它的功能是代理网络用户去取得网络信息。
形象地说,它是网络信息的中转站。在我们正常请求一个网站时,是发送了请求给 Web 服务器,Web 服务器把响应传回给我们。
如果设置了代理服务器,实际上就是在本机和服务器之间搭建了一个桥,此时本机不是直接向 Web 服务器发起请求,而是向代理服务器发出请求,请求会发送给代理服务器,然后由代理服务器再发送给 Web 服务器,接着由代理服务器再把 Web 服务器返回的响应转发给本机。
这样我们同样可以正常访问网页,但这个过程中 Web 服务器识别出的真实 IP 就不再是我们本机的 IP 了,就成功实现了 IP 伪装,这就是代理的基本原理。
代理类型:高匿 > 混淆 > 匿名 > 透明
代理IP一共可以分成4种类型,除了前面提到过的透明代理IP,匿名代理IP,高匿名代理IP,还有一种就是混淆代理IP。从基础的安全程度来说呢,他们的排列顺序是高匿 > 混淆 > 匿名 > 透明。
代理原理
代理类型主要取决于代理服务器端的配置,不同配置会形成不同的代理类型。在配置中,这三个变量REMOTE_ADDR,HTTP_VIA,HTTP_X_FORWARDED_FOR 是决定性因素。
(一)
REMOTE_ADDR 表示客户端的 IP,但是它的值不是由客户端提供的,而是服务器根据客户端的 IP 指定的。
如果使用浏览器直接访问某个网站,那么网站的 web 服务器(Nginx、Apache等)就会把 REMOTE_ADDR 设为客户端的 IP 地址。
如果我们给浏览器设置代理,我们访问目标网站的请求会先经过代理服务器,然后由代理服务器将请求转化到目标网站。那么网站的 web 代理服务器就会把 REMOTE_ADDR 设为代理服务器的 IP。
(二)
X-Forwarded-For 是一个 HTTP 扩展头部,用来表示 HTTP 请求端真实 IP。当客户端使用了代理时,web 代理服务器就不知道客户端的真实 IP 地址。为了避免这个情况,代理服务器通常会增加一个 X-Forwarded-For 的头信息,把客户端的 IP 添加到头信息里面。
X-Forwarded-For 请求头格式如下:
client 表示客户端的 IP 地址;proxy1 是离服务端最远的设备 IP; proxy2 是次级代理设备的 IP;从格式中,可以看出从 client 到 server 是可以有多层代理的。
如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:
Proxy3 直连服务器,它会给 XFF 追加 IP2,表示它是在帮 Proxy2 转发请求。列表中并没有 IP3,IP3 可以在服务端通过 Remote Address 字段获得。我们知道 HTTP 连接基于 TCP 连接,HTTP 协议中没有 IP 的概念,Remote Address 来自 TCP 连接,表示与服务端建立 TCP 连接的设备 IP,在这个例子里就是 IP3。
(三)
via 是 HTTP 协议里面的一个header,记录了一次 HTTP 请求所经过的代理和网关,经过1个代理服务器,就添加一个代理服务器的信息,经过2个就添加2个。
正向代理 和 反向代理: 原理介绍
1、用户发送请求到服务器(访问的其实是反向代理服务器,但用户不知道)
2、反向代理服务器发送请求到真正的服务器
3、真正的服务器将数据返回给反向代理服务器
4、反向代理服务器再将数据返回给用户
作用:用户请求过多,服务器会有一个处理的极限。所以使用反向代理服务器接受请求,再用均衡负载将请求分布给多个真实的服务器。既能提高效率还有一定的安全性。
用途:如果不采用代理,用户的IP、端口号直接暴露在Internet(尽管地址转换NAT),外部主机依然可以根据IP、端口号来开采主机安全漏洞,所以在企业网,一般都是采用代理服务器访问互联网。
正向代理与反向代理最简单的区别:
正向代理隐藏的是用户,反向代理隐藏的是服务器
vue proxy 原理介绍
浏览器会因为同源策略跨域,但服务端不禁止,npm run dev 本来就是运行了服务器,所有利用服务器发送请求即可(将所有请求转发到自己的node服务器然后发送请求,即 )
使用Node开发http正向代理服务器:
个人总结吧,以前学东西总是不喜欢看源码,主要是英语不行,后来才知道源码的重要性,学会看源码才能真正的去探究底层的实现,况且现在很多第三方库都把源码的注释写的很清楚。
Note that if you are testing for assertions or exceptions in your application code, you must set in order for the exceptions to propagate to the test client.
请注意,如果您正在测试应用程序代码中的断言或异常,则必须设置,以便将异常传播到测试客户端。
Otherwise, the exception will be handled by the application (not visible to the test client) and the only indication of an AssertionError or other exception will be a 500 status code response to the test client. See the :attr: attribute. For example::
The test client can be used in a block to defer the closing down of the context until the end of the block. This is useful if you want to access the context locals for testing::
测试客户端可以在带有中使用,以将上下文的关闭推迟到带有结束为止。如果您想访问上下文本地语言进行测试,这一点非常有用::
Additionally, you may pass optional keyword arguments that will then be passed to the application’s :attr: constructor. For example::
Flask 默认是单进程,单线程阻塞的任务模式,在项目上线的时候可以通过nginx+gunicorn 的方式部署flask任务
但是在开发的过程中如果想通过延迟的方式测试高并发怎么实现呢,其实非常简单:
app.run()中可以接受两个参数,分别是threaded和processes,用于开启线程支持和进程支持。
Flask 单线程阻塞的任务模式 测试:同时打开三个浏览器访问
运行结果:总共需要的时间是30多秒,说明是单线程阻塞的模式
源码写的太明白了,原来是ThreadingMixIn的实例以多线程的方式去处理每一个请求,这样对开发者来说,只有在启动app时将threaded参数设定为True,flask才会真正以多线程的方式去处理每一个请求。
- threaded : 多线程支持,默认为False,即不开启多线程;
- processes:进程数量,默认为1.
开启方式:
这个案例是进行与数据库的连接,启动Flask服务器应用,构建视图函数映射到响应的地址目录,并且建立pymysql的连接对象,进行数据库的操作,这边就是添加单词的相应的操作。
对应的前端页面代码展示,其实就是简单构造一个表单进行提交的操作:
Gunicorn 是一个被广泛使用的高性能的 Python WSGI UNIX HTTP 服务组件 (WSGI: Web Server Gateway Interface),移植自 Ruby 的独角兽(Unicorn )项目,具有使用非常简单、轻量级的资源消耗、高性能等特点。
在项目中 Gunicorn 和 Flask 框架一同使用, 能够开启服务,处理请求,因其高性能的特点能够有效减少服务丢包率。
使用 pip 安装 gunicorn
启动 Flask 项目
启动 Flask 项目 + SSL 证书
gunicorn 如何实现高并发的?
对于 gunicorn 而言,当启动时就已经把 worker 进程预先 fork 出来了。当多个请求到来的时候,会轮流复用这些 worker 进程,从而能提高服务器的并发负载能力。对于 worker 数的配置,一般推荐2CPU数 + 1。这样一来,在任何时间,都有大概一般的 worker 是在做 I/O,剩下一般才是需要 CPU 的。