流行的Web开发框架:python版
简介
一个无边际的问题:
星际互联网的Web框架能不能使用现在的这些开发框架?
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提交和获取函数
1.1 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()
1.2 来自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!')
2 微服务框架: 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)
2.1 请求和响应 : 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
2.2 模板
tornado 没有第三方模板,只有自立模板,UI模块,可以组件化html模板内容
flask绑定jinjia2模板
2.3 BluePrint
视图是一个应用对请求进行响应的函数。
Flask可以通过模型把进来的请求URL匹配到对应的处理视图,视图返回数据,Flask把数据变成出去的响应。Flask也可以反过来,根据视图名称和参数生成URL。
2.4 创建蓝图
Blurprint是 组织一组相关视图及其他代码的方式。与把视图及其他代码直接注册到应用的方式不同,
蓝图方式是 把视图和其他代码 注册到蓝图,然后在工厂函数中把蓝图注册到应用。
Flaskr有两个蓝图,一个用于认证功能,另一个用于博客帖子管理。
每个蓝图代码都在一个单独模块中。
2.5 创建一个api蓝图
导入Blueprint,绑定到函数,创建Api蓝图
api = Blueprint('api', __name__, url_prefix='/api')
@api.route('/posts/')
def get_posts():
return 'posts api success'
3 网络框架:twisted
3.1 属性 可读写属性
类中实现 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
3.2 可读属性
age 为可读属性
3.3 动态绑定属性 和 方法
类的实例创建后,可以给实例动态赋予属性
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定义允许绑定的属性名称
3.4 实例本身的调用 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()还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。
如果你把对象看成函数,那么函数本身其实也可以在运行期动态创建出来,因为类的实例都是运行期创建出来的,这么一来,我们就模糊了对象和函数的界限。
3.5 模板类 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__()来创建
4 分离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 . # 初始化项目
4.1 初始化项目
文件解释
__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
一个项目中可以有多个应用,我们可以根据需要去调整它。
4.2 创建应用和功能
创建一个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,使用测试夹具
小结
web框架多如牛毛。 网络框架更加数不胜数,流行通用的 django, tornado,flask,twisted,还有仅一个文件的框架。
很多人程序仅仅使用内置的网络库构建CGI服务,那是因为预期没有任何性能需求或流量。
重要的是我们需求符合哪一个,那么就选择哪一个。
- 点赞
- 收藏
- 关注作者
评论(0)