Python后端技术栈(七)--web框架

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Python后端技术栈(七)--web框架

每日分享

Change your thoughts and you change your world.

改变想法,你就改变了你的世界。——诺曼·文森特·皮尔(美国牧师)

小闫语录:

我不缺勤奋,不缺努力,我只是缺少 idea。


1.7 Python web 框架

上篇文章传送门『我是个链接

上篇文章对数据库中的一些经典问题做了总结,比如关系型数据库中事务、隔离级别、慢查询分析、索引原理以及非关系型数据库的数据结构等等。

本篇文章将开始 Python web 框架的相关内容,开始咯~

1.7.1 Python WSGI 与 web 框架

1.7.1.1 什么是 WSGI ?

我们经常使用 uwsgi/gunicorn 部署 Django/Flask 应用,但是大家思考过一个问题没有,为什么不同的框架可以部署在相同的 web 服务器上呢?比如为什么 Flask/Django 都可以运行在 gunicorn 之上呢?

肯定需要定义一个规范,如果遵守这个规范,就可以让任意的 web 框架运行在相同的 web server 上了。这个规范就是我们提到的 WSGI。也就是 Python Web Server Gateway Interface (PEP3333)

WSGI 出现的意义,官方文档中是这样描述的:

This document specifies a proposed standard interface between web servers and Python web applications or frameworks,to promote web application portability across a variety of web servers.

在 WSGI 出现之前,部署 Python 其实有很多种方式,比如 mod_pythonCGIFastCGI等,这样部署会特别的乱,缺乏统一的接口。没有办法将不同的框架部署在任意的服务器上。为了解决这个问题,WSGI 才诞生了。

WSGI 描述了 Web Server(Gunicorn/uWSGI)如何与 web 框架(Flask/Django)交互,Web 框架如何处理请求。

1.7.1.2 WSGI 是如何定义的

其实就是定义了一个可调用对象:

def application(environ, start_response):

1. application 就是 WSGI app,一个可调用对象。

2.参数: environ是一个包含 WSGI 环境信息的字典,由 WSGI 服务器提供,常见的 key 有 PATHINFO, QUERYSTRING 等。 start_response是生成 WSGI 响应的回调函数,接收两个参数,status 和 headers。

3.函数返回响应体的迭代器。

我们尝试编写一个兼容 WSGI 的 web 小应用:

def mysapp(environ, start_response):
    print(environ['QUERY_STRING'])
    status = '200 OK'
    headers = [('Conent-Type', 'text/html; charset=utf8')]
    start_response(status, headers)
    # 可迭代对象,返回字节
    return [b'<h1>Hello World</h1>']
if __name__ == "__main__":
    from wsgiref.simple_server import make_server
    httpd = make_server('127.0.0.1', 8888, myapp)
    httpd.serve_forever()

1.7.1.3常用的 Python Web 框架对比

Django vs Flask vs Tornado

1.Django:大而全,内置 ORM、Admin 等组件,第三方的插件比较多。

2.Flask:微框架,插件机制,比较灵活。

3.Tornado:异步支持的微框架和异步网络库。

1.7.1.4 什么是MVC?

MVC:模型(Model)、视图(View)、控制器(Controller)

它的出现其实是为了解耦数据、展示和操作。

1.Model:负责业务对象和数据库的交互(ORM)

2.View:负责与用户的交互展示

3.Controller:接收请求参数调用模型和视图完成请求

1.7.1.5 什么是 ORM?

Object Relational Mapping,对象关系映射。它用来实现业务对象与数据表中的字段映射。常见的有 SQLAlchemy、Django ORM 以及最新的 Peewee。优势在于代码更加面向对象,代码量更加的少,灵活性高,提升开发效率。不再关注底层是 MySQL 还是 Oracle 等数据库。缺点就是相比较直接使用 SQL 语句操作数据库来说,有性能损失。

1.7.2 Web 安全

1.7.2.1 什么是 SQL 注入?

通过构造特殊的输入参数传入 Web 应用,导致后端执行了恶意的 SQL,通常是由于程序员未对输入进行过滤,直接动态拼接 SQL 产生。可以使用开源工具 sqlmap,SQLninja 等检查我们的网站是否存在此问题。下面通过一个示例进行演示:

1.首先我们创建一个数据表:

create table users(id int not null auto_increment primary key,name varchar(45) default null,email varchar(45) default null,password varchar(45) default null);

2.然后准备测试数据:

insert into users (name,email,password) values ('laowang','laowang@qq.com',md5('laowang123'));
insert into users (name,email,password) values ('zhangsan','zhangsan@qq.com',md5('zhangsan123'));
insert into users (name,email,password) values ('lisi','lisi@qq.com',md5('lisi123'));

3.编写 SQL 注入代码:

import os
import MySQLdb # pip install mysqlclient
db = MySQLdb.connect(
    host="localhost",
    user="root",
    passwd=os.getenv('MYSQL_PASS')
    db="test"
)
cur = db.cursor()
name = input('Enter name: ')
print('您输入的用户 name 是: {}'.format(name))
password = input('Enter password: ')
print('你输入的密码是: {}'.format(password))
# 直接拼接 sql 参数
sql = "SELECT * FROM users WHERE name='"+name+"'"+" AND password=md5('"+password+"')"
print(sql)
cur.execute(sql)
for row in cur.fetcall():
    print('查询结果', row)
db.close()

4.我们执行上面的文件,如果输入正确的姓名和密码,可以获取结果。如果输入错误,无法返回。但是有一种情况,输入名字的时候,输入下面的代码:

lisi' -- '

在 SQL 中 -- 表示注释

输入上面的代码之后,仍然可以获取正确结果,因为拼接 SQL 之后,注释掉了后面的密码内容。

那么怎么解决呢?可以修改为下面的代码:

sql = "SELECT * FROM users WHERE name=%s AND password=md5(%s)"
cur.execute(sql, (name, password))

原理就是 execute 会帮助我们进行一些转义操作,防止 SQL 注入。

1.7.2.2 如何防范 SQL 注入

web 安全一大原则:永远不要相信用户的任何输入

1.对输入参数做好检查(类型和范围);过滤和转义特殊字符

2.不要直接拼接 sql,使用 ORM 可以大大降低 SQL 注入风险

3.数据库层:做好权限管理配置;不要明文存储敏感信息

1.7.2.3 什么是 XSS

XSS(Cross Site Scripting),跨站脚本攻击

也许看见英文你会问,为什么不叫 CSS 呢?如果叫这个你不觉的奇怪吗?这不是层叠样式表吗。

1.恶意用户将代码植入到提供给其他用户使用的页面中,未经转义的恶意代码输出到其他用户的浏览器被执行。

2.用户浏览页面的时候嵌入页面中的脚本(js)会被执行,攻击用户。

3.主要分为两类:反射型(非持久型),存储型(持久型)

反射型就是将可攻击的 js 脚本放到 url 参数里面;存储型的则一般使用评论的方式,后台存储评论之后,其他用户在加载的时候就执行了。

黑客可以收集用户的 document.cookie 发送到指定服务器上,当获取到你的 cookie 之后,它就可以为所欲为了。

1.7.2.4 XSS 危害

XSS 可以利用 js 实现很多危害巨大的操作

1.盗用用户的 cookie,获取敏感信息

2.蠕虫

3.钓鱼

1.7.2.5 什么是 CSRF 攻击

详情请看文章『flask框架中的一些常见问题

1.7.3 前后端分离与 RESTful

1.7.3.1 什么是前后端分离?有哪些优点?

前后端分离就是后端只负责提供数据接口,不再渲染模板,前端获取数据并呈现。它主要有以下几个优点:

1.前后端解耦,接口复用(前端和客户端公用接口),减少开发量

2.各司其职,前后端同步开发,提升工作效率。定义好接口规范

3.更有利于调试(mock)、测试和和运维部署

1.7.3.2 什么是 RESTful

它的全称是 Representation State Transfer ,中文翻译是表现层状态转移,由 HTTP 协议的主要设计者 Roy Fielding 提出。其中主要有三个概念:资源(Resources)、表现层(Representation)、状态转化(State Transfer)。它是一种以资源为中心的 web 软件架构风格,可以用 Ajax 和 RESTful web 服务构建应用。

1.7.3.3 RESTful 解释

1.Resources(资源):使用 URI 指向的一个实体。比如在 web 应用中,一个用户、一首音乐或者一个订单,我们都可以把它表示为一个实体,称之为资源。

2.Representation(表现层):资源的表现形式,比如图片、HTML 文本等。

3.State Transfer(状态转化):GET/POST/PUT/DELETE/HTTP,动词来操作资源,实现资源状态的改变。

1.7.3.4 RESTful 的准则

设计概念和准则:

1.所有事物抽象为资源(Resources),资源对应唯一的标识(identifier)

2.资源通过接口进行操作实现状态转移,操作本身是无状态的

3.对资源的操作不会改变资源的标识

1.7.3.5 什么是 RESTful API?

它就是 RESTful 风格的 API 接口。

1.通过 HTTP GET/POST/PUT/DELETE 获取/新建/更新/删除 资源

把 HTTP 动词语义和数据库的增删改查结合到一起

2.一般使用 JSON 格式返回数据

3.一般 web 框架都有相应的插件支持 RESTful API

下面我们可以看一下示例:

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
安全 前端开发 数据库
Python 语言结合 Flask 框架来实现一个基础的代购商品管理、用户下单等功能的简易系统
这是一个使用 Python 和 Flask 框架实现的简易代购系统示例,涵盖商品管理、用户注册登录、订单创建及查看等功能。通过 SQLAlchemy 进行数据库操作,支持添加商品、展示详情、库存管理等。用户可注册登录并下单,系统会检查库存并记录订单。此代码仅为参考,实际应用需进一步完善,如增强安全性、集成支付接口、优化界面等。
|
2月前
|
安全 测试技术 网络安全
如何在Python Web开发中进行安全测试?
如何在Python Web开发中进行安全测试?
|
2月前
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
40 4
|
27天前
|
JSON 数据可视化 测试技术
python+requests接口自动化框架的实现
通过以上步骤,我们构建了一个基本的Python+Requests接口自动化测试框架。这个框架具有良好的扩展性,可以根据实际需求进行功能扩展和优化。它不仅能提高测试效率,还能保证接口的稳定性和可靠性,为软件质量提供有力保障。
57 7
|
25天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
62 2
|
1月前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
2月前
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
65 1
|
2月前
|
JSON 前端开发 API
使用Python和Flask构建简易Web API
使用Python和Flask构建简易Web API
133 3
|
2月前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
40 4
|
2月前
|
缓存 API 数据库
Python哪个框架合适开发速卖通商品详情api?
在跨境电商平台速卖通的商品详情数据获取与整合中,Python 语言及其多种框架(如 Flask、Django、Tornado 和 FastAPI)提供了高效解决方案。Flask 简洁灵活,适合快速开发;Django 功能全面,适用于大型项目;Tornado 性能卓越,擅长处理高并发;FastAPI 结合类型提示和异步编程,开发体验优秀。选择合适的框架需综合考虑项目规模、性能要求和团队技术栈。
35 2