Python_web开发基础内容

网络

长连接的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

WSGI服务器有 Gunicorn、uWSGI和mod_wsgi

 Gunicorn 是一个针对Python的、在Unix系统上运行的、用来解析HTTP请求的网关服务。
  它的特点是:能和大多数的web框架兼容;使用简单;轻量级的资源消耗;高性能。
  官方定义:a Python WSGI HTTP Server for UNIX. It's a pre-fork worker model.
  gunicorn是一个第三方库,可以直接使用pip来安装:pip install -i https://mirrors.aliyun.com/pypi/simple gunicorn
  运营
     gunicorn --workers=3 main:app -b 0.0.0.0:2021
  要更换为异步模式,可以使用gevent。此时还需要pip来安装gevent。
     gunicorn --workers=3 main:app -b 0.0.0.0:2021 -k 'gevent'
   gunicorn可以使用-c参数,就是使用配置文件
     gunicorn -c config.py main:app	  
  gunicorn是一个进程,完成有有可能因为一些原因被关闭或者阻塞,为了保证gunicorn进程,需要使用看护进程插件。这里使用supervisor		   

框架

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	 
posted @ 2023-11-03 17:07  辰令  阅读(34)  评论(0编辑  收藏  举报