了解python中几个主流的网络框架

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
EMR Serverless StarRocks,5000CU*H 48000GB*H
性能测试 PTS,5000VUM额度
简介: 【6月更文挑战第21天】探索Python Web几个流行框架,了解各框架特性以适应不同场景需求。

简介

本文介绍如异步的Tornado,其通过RequestHandler和Application处理高并发,使用蓝图创建路由。Flask支持RESTful API,使用Jinja2模板和Blueprint组织视图。Twisted涉及属性、动态绑定及元类。Django作为MVC框架,简化数据库管理,提供命令行工具初始化项目。

1,异步web框架:tornado

tornado旨在提供一个简易的web框架,支持异步高并发

RequestHandler,Application

启动一个服务的步骤和过程

  • 1,主业务函数,一般继承自 web.RequestHandler
  • 2, 缓存数据服务器 redis
  • 3, 绑定缓存服务器到主业务函数服务器
  • 4, 注册主业务函数到handlers, 类型为列表,列表元素0:路径, 1:函数名 2:函数需要的参数
  • 5,注册到web.Application

      1, define 注册函数
      2,options提交和获取函数
    

2 tornado 路由,访问不同路径设置方式

class MainHandler(web.RequestHandler):
    def get(self):
        self.write('hello,world')
if __name__ == "__main__":
    app = tornado.web.application([(r'/', MainHandler)])
    app.listen(8800)
    ioloop.IOLoop.current().start()

3 来自tornado的请求和响应

cookie 来自tornado继承类 tornado.web.RequestHandler

1, set_cookie   #key, value 分别为需要设置的关键字与值
2, set_secure_cookie  # 安全cookie设置
3, 重写RequestHandler的get和post方法,并计数访问次数

tornado 相应请求时通过继承 web.RequestHandler的write方法响应获取参数

    self.get_argument(), self.set_cookie(), self.get_cookie()

响应self.write()

tornado

    class MainHandler(web.RequestHandler):
        def get(self):
            self.write('Hello, world!')

4 微服务框架: flask

flask 路由使用blueprint方式创建应用,并绑定路由。

app = Flask(__name__)
app.route('/', 'POST')
def ret_index():
    return 'index.html'
if __name__ == "__main__":
    app.run(host='0.0.0.0',port=8801)

5 请求和响应 : request and response method

flask 响应请求时,通过jinjia2模板, 修改其中的部分内容来交互和响应获取参数通过request向下变量的形式.

响应通过return,也可以返回字符串,模板文件或其他response对象.

flask from flask import Flask, request, redirect, url_for
app = Flask(__name__)
@app.route('/login', method=['GET','POST'])
def login():
    if request.method == 'POST':
        return redirect(url_for('index'))
    return "Hello, World"

flask 通过session上下文变量方式呈现

导入session 包, 从前端html接收name字段值, 删除name为Jack的session

    from flask import session,

    session['name'] = request.form['name']  
session.pop('name', 'Jack')  

1, 如果API涉及规范为RESTful,考虑使用token
2,如果API被不同终端使用,cookies受限,推荐token
3, 如果SPA, 服务端没有渲染,推荐token
4,其他情况可以使用 cookies 和session

6 模板

tornado 没有第三方模板,只有自立模板,UI模块,可以组件化html模板内容

flask绑定jinjia2模板


7 视图BluePrint

视图是一个应用对请求进行响应的函数。

Flask可以通过模型把进来的请求URL匹配到对应的处理视图,视图返回数据,Flask把数据变成出去的响应。Flask也可以反过来,根据视图名称和参数生成URL。

8 创建蓝图

Blurprint是 组织一组相关视图及其他代码的方式。与把视图及其他代码直接注册到应用的方式不同,

蓝图方式是 把视图和其他代码 注册到蓝图,然后在工厂函数中把蓝图注册到应用。

Flaskr有两个蓝图,一个用于认证功能,另一个用于博客帖子管理。

每个蓝图代码都在一个单独模块中。

9 创建一个api蓝图

导入Blueprint,绑定到函数,创建Api蓝图

api = Blueprint('api', __name__, url_prefix='/api')

@api.route('/posts/')
def get_posts():
    return 'posts api success'

10 网络框架:twisted 属性 可读写属性

类中实现 property的 setter, 如下的 birty

  @property
def birty(self, v):
    return self._birty

@birty.setter
def birty(self, v)
    self._birty = v

@property
def age(self)
    return 2021 - self._birty

11 可读属性

age 为可读属性
  • 动态绑定属性 和 方法

    类的实例创建后,可以给实例动态赋予属性

       class A:
      pass 
    

    a1 = A()
    a2 = A()
    a1.name = 'Jack'

    也可以绑定方法, # 给实例绑定一个方法

     def set_age(self, v):
      self.age = v
    

    from types import MethodType
    a1.set_age = MethodType(set_age, s)
    a1.set_age(19)

    print(a1.age) # 测试结果为 19

但是绑定的方法,其他实例 a2 是无法使用set_age的

    a2.set_age(22)   # error

此时可以在初始类中定义 slots方法,只对当前实例起作用,如果继承的子类也需要做与父类相同的事情比如限定参数,则子类也需要实现slots

class students(object):
    __slots__ = ('name', 'age')      # 元组tuple定义允许绑定的属性名称

12 实例本身的调用 call

使用内置函数 callable 可以判断是否可以的调用, 实例化后 仍然可以调用,返回 Jack

    class Stu2(object):
    def __init__(self, name):
        self.name = name

    def __call__(self):
        print(f"My name is {self.name}")

s2 = Stu2('Jack')
print(s2())   

call()还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。

如果你把对象看成函数,那么函数本身其实也可以在运行期动态创建出来,因为类的实例都是运行期创建出来的,这么一来,我们就模糊了对象和函数的界限。

13 模板类 new

ORM(Object Relational Mapping 对象-关系映射)需要通过metaclass修改类定义的。
关系数据库的一行映射为一个对象,也就是一个类对应一个表。

metaclass是类的模板,所以必须从type类型派生:

  class ListMetaclass(type):
    def __new__(cls, name, bases, attrs):
    """
        cls: 当前准备创建的类的对象;
        name: 类的名字;
        bases: 类继承的父类集合;
        attrs: 类的方法集合。
    """
            attrs['add'] = lambda self, value: self.append(value)
            return type.__new__(cls, name, bases, attrs)

定义一个模板类,继承的时候必须使用metaclass 来指定模板类

class MyList(list, metaclass=ListMetaclass):

    pass

当传入关键字metaclass时魔术就生效了指示python解释器创建MyList时通过

ListMetaclass.__new__()来创建

14 分离MVC的集大成者: django

Django 是python的 MVC 主力WEB框架。 使用框架内置指令,可以方便地初始化数据库,迁移,项目维护等操作。

安装 python3,django

apt install python3 && pip install django ~=3.1.0
mkdir code && cd code
mkdir library && library

django-admin startproject config . # 初始化项目

15 初始化项目

文件解释

    __init__.py # 创建初期为空文件,有此文件的 文件夹被视为一个 python包
    asgi.py  # 异步网关服务接口
    settings.py # 包含项目的所有配置
    urls.py  # 顶层 页面路由 控制
    wsgi.py #  代表Web服务器网关接口 并帮助 Django服务最终的网页
    manage.py # 执行各种Django命令,例如运行本地Web服务器或创建新应用。

如果远程开发,需要添加 本地机器ip 或域名到允许列表

    config/setting.py  # ALLOWED_HOSTS = ["127.0.0.1"]

数据库 环境创建, 指定 在1999端口启动服务
python manage.py migrate
python manage.py runserver 0.0.0.0:1999

一个项目中可以有多个应用,我们可以根据需要去调整它。

16 创建应用和功能

创建一个app 应用
python manage.py startapp books

* 文件解释

创建的应用books 包含6个文件

    admin.py # 内置的Django 应用程序Admin的配置文件
    apps.py # 是应用本身的配置文件
    migrations/ #目录存储迁移文件以进行数据库更改
    models.py #  定义数据库模型的地方
    tests.py # 应用测试文件
    views.py # 处理Web应用程序的请求/响应逻辑的地方

后续工作包括:

  • 创建 API 服务,使用接口插件 rest_framework
  • 后端与前端结合,跨域资源共享 CORS 处理

  • 路由,视图, 序列化返回值,使用插件 视图集和路由集 Viewsets and Routers

  • 项目授权限制,基于角色的 查看和编辑权限 Permissions

  • 基础认证,接口令牌认证,会话认证。

  • QA,使用测试夹具

17 小结

web框架多如牛毛。 网络框架更加数不胜数,流行通用的 django, tornado,flask,twisted,还有仅一个文件的框架。

很多人程序仅仅使用内置的网络库构建CGI服务,那是因为预期没有任何性能需求或流量。

重要的是我们需求符合哪一个,那么就选择哪一个。

目录
相关文章
|
9天前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
35 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
3天前
|
编解码 分布式计算 网络协议
Netty高性能网络框架(一)
Netty高性能网络框架(一)
|
9天前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
在数字时代,网络应用成为连接世界的桥梁。Python凭借简洁的语法和丰富的库支持,成为开发高效网络应用的首选。本文通过实时聊天室案例,介绍Python Socket编程的基础与进阶技巧。基础篇涵盖服务器和客户端的建立与数据交换;进阶篇则探讨多线程与异步IO优化方案,助力提升应用性能。通过本案例,你将掌握Socket编程的核心技能,推动网络应用飞得更高、更远。
25 1
|
8天前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
55 21
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
8天前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
50 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
7天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
37 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
3天前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
16 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
3天前
|
数据采集 存储 JavaScript
构建您的第一个Python网络爬虫:抓取、解析与存储数据
【9月更文挑战第24天】在数字时代,数据是新的金矿。本文将引导您使用Python编写一个简单的网络爬虫,从互联网上自动抓取信息。我们将介绍如何使用requests库获取网页内容,BeautifulSoup进行HTML解析,以及如何将数据存储到文件或数据库中。无论您是数据分析师、研究人员还是对编程感兴趣的新手,这篇文章都将为您提供一个实用的入门指南。拿起键盘,让我们开始挖掘互联网的宝藏吧!
|
3天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
17 1
|
10天前
|
JSON 测试技术 数据库
Python的Flask框架
Python的Flask框架