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
目录
打赏
0
0
0
0
6
分享
相关文章
Python 语言结合 Flask 框架来实现一个基础的代购商品管理、用户下单等功能的简易系统
这是一个使用 Python 和 Flask 框架实现的简易代购系统示例,涵盖商品管理、用户注册登录、订单创建及查看等功能。通过 SQLAlchemy 进行数据库操作,支持添加商品、展示详情、库存管理等。用户可注册登录并下单,系统会检查库存并记录订单。此代码仅为参考,实际应用需进一步完善,如增强安全性、集成支付接口、优化界面等。
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
194 6
Chainlit:一个开源的异步Python框架,快速构建生产级对话式 AI 应用
Chainlit 是一个开源的异步 Python 框架,帮助开发者在几分钟内构建可扩展的对话式 AI 或代理应用,支持多种工具和服务集成。
143 9
Python Web 框架 FastAPI
FastAPI 是一个现代的 Python Web 框架,专为快速构建 API 和在线应用而设计。它凭借速度、简单性和开发人员友好的特性迅速走红。FastAPI 支持自动文档生成、类型提示、数据验证、异步操作和依赖注入等功能,极大提升了开发效率并减少了错误。安装简单,使用 pip 安装 FastAPI 和 uvicorn 即可开始开发。其优点包括高性能、自动数据验证和身份验证支持,但也存在学习曲线和社区资源相对较少的缺点。
86 15
Python流行orm框架对比
Python中有多个流行的ORM框架,如SQLAlchemy、Django ORM、Peewee、Tortoise ORM、Pony ORM、SQLModel和GINO。每个框架各有特点,适用于不同的项目需求。SQLAlchemy功能强大且灵活,适合复杂项目;Django ORM与Django框架无缝集成,易用性强;Peewee轻量级且简单,适合小型项目;Tortoise ORM专为异步框架设计;Pony ORM查询语法直观;SQLModel结合Pydantic,适合FastAPI;GINO则适合异步环境开发。初学者推荐使用Django ORM或Peewee,因其易学易用。
MaxFrame 产品评测:大数据与AI融合的Python分布式计算框架
MaxFrame是阿里云MaxCompute推出的自研Python分布式计算框架,支持大规模数据处理与AI应用。它提供类似Pandas的API,简化开发流程,并兼容多种机器学习库,加速模型训练前的数据准备。MaxFrame融合大数据和AI,提升效率、促进协作、增强创新能力。尽管初次配置稍显复杂,但其强大的功能集、性能优化及开放性使其成为现代企业与研究机构的理想选择。未来有望进一步简化使用门槛并加强社区建设。
83 7
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
161 62
python+requests接口自动化框架的实现
通过以上步骤,我们构建了一个基本的Python+Requests接口自动化测试框架。这个框架具有良好的扩展性,可以根据实际需求进行功能扩展和优化。它不仅能提高测试效率,还能保证接口的稳定性和可靠性,为软件质量提供有力保障。
100 7
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
119 2
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
270 45

热门文章

最新文章