python的web框架
前言
python常用来做爬虫、数据分析等工作,本篇来介绍下用python作为web服务该如何使用。
分类
目前主流的web框架,包括Flask、Django、Tornado、FastAPI
-
Flask:轻量级,易于上手,适合小型应用。由于简单,因此性能较高,但在处理大量请求时可能会出现瓶颈。
-
Django:完整的 Web 框架,适合大型应用。提供了大量功能和插件,易于进行扩展,但相对于 Flask 而言,学习曲线较为陡峭。
-
Tornado:异步 Web 框架,适合高并发场景。由于采用了异步编程模型,因此性能较高,但相对于其他框架而言,学习曲线较陡峭。
-
FastAPI:高性能的 Web 框架,近年来兴起,采用异步编程模型。具有优异的性能,并支持自动生成 API 文档,但由于异步编程模型的复杂性,上手较为困难。
他们的创建时间和github star数据(统计于23年3月)如下:
Flask:创建于2010年,Github上的Star数为62.1k。
Django:创建于2005年,Github上的Star数为69.1k。
Tornado:创建于2009年,Github上的Star数为21k。
FastAPI:创建于2019年,Github上的Star数为55.1k。
需要注意的是,Github上的Star数并不是衡量框架优劣的唯一标准,还需考虑框架的性能、功能、使用体验等因素。
实战
Flask、Django、Tornado、FastAPI分别作为web框架来使用
Flask
# 引用
from flask import Flask
# Flask应用命名app
app = Flask(__name__)
# 定义一个路由,将HTTP请求的根路径/映射到hello()函数
@app.route('/')
def hello():
return 'hello world'
# 使用app.run()启动Flask应用,开始监听HTTP请求
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8800)
启动后,访问 127.0.0.1:8800/
Django
1、首先,安装Django:
pip install Django
2、然后,创建一个Django项目(自定义myprojectName):
django-admin startproject myprojectName
3、进入到项目目录,创建一个应用:
cd myprojectName
python manage.py startapp myapp
4、在myapp/views.py文件中编写HTTP接口的逻辑,例如:
from django.http import HttpResponse
import json
def hello(request):
data = {"message": "Hello, world!"}
return HttpResponse(json.dumps(data), content_type='application/json')
5、在myprojectName/urls.py中定义路由:
cd myprojectName
from django.urls import path
# 引入对应的文件下的方法,myapp是第3步创建的应用,views是py文件
from myapp.views import hello
urlpatterns = [
path('hello/', hello),
]
6、运行Django开发服务器(默认8000端口)
python manage.py runserver
可以修改host与端口:
python manage.py runserver ip:port
启动后,访问 127.0.0.1:8000/hello
Tornado
# 引用对用模块
import tornado.ioloop
import tornado.web
from abc import ABC
# 名为MainHandler的类,它继承自tornado.web.RequestHandler
class MainHandler(tornado.web.RequestHandler, ABC):
# 实现了get方法,当收到一个GET请求时,这个方法将会被调用
def get(self):
self.write("hello world")
# 定义了一个make_app函数,它返回一个tornado.web.Application对象,这个对象是我们整个应用的入口
def make_app():
return tornado.web.Application([
# 通过一个路由映射将"/"路径与MainHandler类关联起来
(r'/', MainHandler)
])
if __name__ == "__main__":
# 创建了一个Application对象
app = make_app()
app.listen(port=8801)
# 启动Tornado的事件循环
tornado.ioloop.IOLoop.current().start()
启动后访问:127.0.0.1:8801
FastAPI
from fastapi import FastAPI
app = FastAPI()
# 定义了两个路由
@app.get("/")
def read_root():
return {"hello": "world"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
if __name__ == '__main__':
# 使用 uvicorn 或其他 ASGI 服务器,例如 Hypercorn 或 Daphne。以下是使用 uvicorn 启动 FastAPI
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8805)
启动后访问:127.0.0.1:8805
守护进程启动
如果想使用守护进程启动,可以退出启动页面,可以使用nohup。
例如:nohup启动fastapi框架编写的web程序
启动命令:
- nohup uvicorn fastapi_http:app --host 127.0.0.1 --port 8805 &
该命令将在后台运行uvicorn服务器,将应用程序实例fastapi_http.app(文件名.FastAPI实例名)绑定到127.0.0.1:8805,并将该命令的输出重定向到nohup.out文件中。通过在命令末尾添加&符号,可以将该命令放到后台运行。
扩展
WSGI VS ASGI
WSGI是 Web Server Gateway Interface 的缩写。简单地说,WSGI 位于 web 服务器(如 nginx)和 Python 的 web 框架(如 Flask)之间。
它指定了 web 服务器应该如何将请求转发给 web 框架。
ASGI(Asynchronous Server Gateway Interface)是异步的Web服务器网关接口,可以处理异步请求和响应。与WSGI不同,ASGI使用异步通信模式,可以处理复杂的异步请求,例如WebSocket和长轮询。ASGI还允许在请求处理过程中进行异步操作,以提高Web应用程序的性能。
总的来说,WSGI和ASGI都是为了连接Python Web应用程序和Web服务器而设计的。
WSGI服务器
WSGI服务器是一种Web服务器软件,用于运行基于Python编写的Web应用程序。
它定义了一个标准接口,用于在Web服务器和Python应用程序之间进行通信。
WSGI服务器可以监听HTTP请求,并将请求转发给Python应用程序进行处理,然后将处理结果返回给Web服务器。这样,Python应用程序就可以在WSGI服务器上运行,通过Web服务器提供服务,从而实现Web应用程序的运行。常见的WSGI服务器有uWSGI、Gunicorn、mod_wsgi等。
目前,许多Python的Web框架支持WSGI和ASGI,如:
WSGI:Flask、Django、Bottle等;
ASGI:FastAPI、Django Channels、Starlette等。
总结
开发的程序能作为一个web服务是基本的能力,python也提供了很多web框架,可以根据场景进行选择,刚入手python的朋友推荐FastAPI,上手相对比较简单,近几年刚出来就有不少的star了。