网络
长连接的HTTP协议,会在响应头有加入这个头部字段:Connection:keep-alive
WebSocket:需要通过网络传输的任何实时更新或连续数据流,则可以使用WebSocket
HTTP:不需要很频繁或仅获取一次的数据可以通过简单的HTTP请求查询
都是用来跟踪浏览器用户身份的会话方式
.cookie的数据存放在客户的本地文件中,session的数据存放在服务器
Long Polling长轮询
WebSocket? 客户端和服务器之间建立一个持久的长连接,这个连接是双工的,客户端和服务端都可以实时地给对方发送消息。
Python的Web开发
1.web开发框架
Django
异步框架 Flask
异步框架 sanic
2.python asyncio 是用来编写 并发 代码的库,使用 async/await 语法
ASGI (Asynchronous Server Gateway Interface) 和 WSGI (Web Server Gateway Interface)
是用于连接 Web 服务器和 Python Web 应用程序的两种不同的接口标准。
网络
web server(如Apache、Nginx)和web app(或web app框架)之间的标准
Web服务器网关接口(Web Server Gateway Interface,缩写为 WSGI)
Emscripten: Emscripten是一个开源的编译器,该编译器可以将 C/C++ 的代码编译成JavaScript胶水代码
WASI WASI,全名为 WebAssembly System Interface
ASGI标准,该标准是WSGI标准
uWSGI:uWSGI 是一个 Web 服务器,它是一个用 C 语言编写的 Web 应用程序容器,
uwsgi:uwsgi 是一个与 uWSGI 服务器相关的协议
Web 服务器来处理 HTTP 协议的内容
WSGI 内部能够分为三类,web 应用程序,web 服务器,web 中间件
服务:
浏览器发起http请求到nginx服务器,
Nginx根据接收到请求包,进行url分析,判断访问的资源类型,
如果是静态资源,直接读取静态资源返回给浏览器,
如果请求的是动态资源就转交给uwsgi服务器,uwsgi服务器根据自身的uwsgi和WSGI协议,
找到对应的Django框架,Django框架下的应用进行逻辑处理后,
将返回值发送到uwsgi服务器,然
后uwsgi服务器再返回给nginx,
最后nginx将返回值返回给浏览器进行渲染显示给用户
Gunicorn 是基于unix系统,被广泛应用的高性能的 Python WSGI HTTP Server。用来解析HTTP请求的网关服务
应用服务器
1.http 服务器: 最主流的三个Web服务器是Apache、 Nginx 、IIS Lighttpd是一个轻量级的Web服务器
连接过程、请求过程、应答过程以及关闭连接
Tomcat是一个开源的Web服务器,它实现了Java Servlet和JavaServer Pages(JSP)规范,可以让您在服务器端运行Java代码。
Apache 的三种工作模式(Prefork、Worker、Event)
Web服务器Apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式。
它们分别是prefork,worker、event,它们同时也代表这Apache的演变和发展
2.python
WSGI服务器有 Gunicorn、uWSGI和mod_wsgi
ASGI服务器有 Daphne 和 Uvicorn等。
Daphne是一个基于 Twisted的ASGI服务器,它可以处理异步Web应用程序的请求。
Uvicorn是一个基于 uvloop 和httptools的ASGI服务器,它具有高性能和低内存占用的特点
有三大主流的 ASGI 服务器,
Daphne(opens new window),Uvicorn(opens new window),和 Hypercorn(opens new window) 。
3.异步框架
uvloop是基于Cython写的,执行效率更高。
uvloop底层基于 libuv,而libuv是高性能、跨平台的异步IO库,nodejs的事件循环也是基于libuv的
http请求 TCP请求
4.网络I/O库 (libevent,libuv,libev,libeio)
epoll 是由 Linux 内核提供的一个系统调用(system call)
Linux Libuv是一个轻量级、高性能、多平台的异步I/O库
(如select、poll、epoll、kqueue、evports等I/O多路复用模型)
glibc提供的aio函数库,所以称为glibc aio
框架
Flask框架带有一个内置的开发服务器,并明确表示它只用于开发。而 Sanic 的情况恰好相反
sanic
Sanic 不仅仅是一个 框架,它还是一个 Web 服务器
Sanic 将配置保存在 Sanic 对象的 config 属性中。可以使用 属性操作 或 字典操作 的方式来修改配置。
@app.get("/async")
async def async_handler(request):
await asyncio.sleep(0.1)
return text("Done.")
自带的服务器
Sanic 服务器(Sanic Server)
当使用 Sanic 服务器,websocket 功能将使用 websockets 包来实现
Sanic 则有四个事件:启动前、启动后、关闭前和关闭后
其他服务器
用支持 ASGI 应用的服务器来部署 Sanic,或者使用 Gunicorn
ASGI 服务器将会管理 websocket 链接。
ASGI 只支持两种服务器事件:启动和关闭
Gunicorn pre-fork worker 模型
sanic
定义 ORM 模型 ORM(Object Relational Mapping)框架
1.SQLAlchemy 1.4(opens new window) 版本中,添加了对 asyncio 的原生支持
sqlalchemy 和 aiomysql
2.tortoise-orm
Docker 部署(Docker Deployment)
1.开发功能
2.构建镜像(Build Image)
3.启动容器(Start Container)
4.使用 docker-compose 编排(Use docker-compose)
概念
实例(Instance)
应用上下文(Application context)
App 注册表(App Registry)
配置(Configuration)
自定义(Customization) 自定义上下文(Custom context) 自定义请求(Custom requests) 自定义错误响应函数(Custom error handler)
第二个重要的组件就是响应函数(Handlers),也就是我们通常所说的视图(views)
请求(Request)
请求体(Body) 请求上下文(Request context) 连接上下文(Connection context) 路由参数(Parameter) 请求参数(Arguments)
响应(Response)
响应方式(Methods) 默认状态码(Default Status)
注入操作
节点上设置监听器可以让您可以完成一些注入操作。但是这里并不包括信号,信号允许进一步的注入定制 启用监听器(Attaching a listener)
监听器允许您将功能挂载到工作进程的生命周期,而中间件允许您将功能挂载到 HTTP 流的生命周期
Sanic的三个方面:Request 、Routing、Response。
HTTPS相当于需要设置SSL证书,sanic官方文档写的是
接收请求 找到对应的路由并执行路由对应的视图函数 Jinja2模板渲染返回视图
路由就和 uri 对应的视图函数关联起来了,这就是承上,路由和视图函数就是这样对应的关系
常规
对于css、js等静态文件,常规操作是将其放在自己建立的statics下面
对于html模板,常规操作是将其放在自己建立的templates下面
视图函数(即服务的逻辑实现)放在自己建立的views下面
Blueprint
将Python函数变成API
Sanic通过注解来定义接口方法
一:用Sanic.route()方法来声明接口信息
二:用Sanic封装好的请求方法
三:使用类视图
路由的写法都是以装饰器的形式出现
request.form #获取整个表单
request.body #获取body的内容
request.json
代码
from sanic import Sanic
from sanic.response import text,json
app = Sanic("HelloWorld")
@app.get("/hello")
async def hello_world(request):
return text("Hello, this is my first app in Sancic framework.")
@app.route('/post', methods=['POST'])
async def post_handler(request):
###请求
data = request.form
##处理 在这里对接收到的数据进行处理
response = {'message': '成功接收到POST请求', 'data': data}
##响应
return json(response)
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8700)
执行程序
python app.py
任何HTTP客户端向http://localhost:8000/post发送POST请求,并查看返回的响应。
server.py
默认命令sanic server.app
python -m sanic --dev server.app
python -m sanic HelloWorld.app --host=127.0.0.1 --port=7890
构建http请求
1.构建http请求
1.通过浏览器自己构造
http://localhost:8000/hello
回车,此时我们发的是 GET 请求
GET 传参数只能在 url 后面带上参数,比如 http://www.helloworld.net?name=tom&age=23
服务器收到请求就可以解析出来 url 后面带的参数了,name = tom , age = 23
2.通过postman构造
3.requests库构建HTTP请求
构建HTTP请求: 1.构建请求URL参数 2.构建请求消息头 3.构建请求消息体 4.检查HTTP响应
##Python通过提供requests库,实现了对网络编程的强大支持
向服务器发送表单数据
import requests
import json
response = requests.get('http://mirrors.sohu.com/')
print(response.content)
####post请求传body的参数有两种:data和json
response = requests.post("http://httpbin.org/post", data={1:1,2:2})
obj = json.loads(response.content.decode('utf8'))
print(obj)
dic = {'key1': 'value1', 'key2': 'value2'}
string = json.dumps(dic)
r = requests.post("http://httpbin.org/post", data=string)
###request
1.使用cookies模拟登录 2.使用session模拟登录
file = {'file': open('report.xls', 'rb')}
response = requests.post('http://www.example.com/upload', files=file)
DevOps(Development和Operations的组合词
参考
Sanic——Python函数变成API的神器 https://blog.csdn.net/Rocky006/article/details/133861118
微服务Sanic制作一个简易本地restful API
标签:web,http,请求,Web,Python,app,开发,Sanic,服务器
From: https://www.cnblogs.com/ytwang/p/17808011.html