前言

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。

https://github.com/pallets/flask

Django:创建于2005年,Github上的Star数为69.1k。

https://github.com/django/django

Tornado:创建于2009年,Github上的Star数为21k。

https://github.com/tornadoweb/tornado

FastAPI:创建于2019年,Github上的Star数为55.1k。

https://github.com/tiangolo/fastapi

需要注意的是,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了。