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

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‘,‘[email protected]‘,md5(‘laowang123‘));
insert into users (name,email,password) values (‘zhangsan‘,‘[email protected]‘,md5(‘zhangsan123‘));
insert into users (name,email,password) values (‘lisi‘,‘[email protected]‘,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 攻击

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

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

原文地址:https://www.cnblogs.com/kaka123/p/11674481.html

时间: 2025-01-11 18:42:18

Python后端技术栈(七)--web框架的相关文章

Python后端技术栈(二)

每日分享 Darkness cannot drive out darkness; only light can do that. Hate cannot drive out hate; only love can do that. 黑暗无法驱除黑暗; 只有光可以做到这一点. 仇恨无法驱走仇恨; 只有爱才能做到这一点. 小闫笔记: 不知你苦难,无法劝你向善.但你要知道,爱会让你过的更轻松.最后送给大家泰戈尔的<飞鸟集>中的一句『世界以痛吻我,我要回报以歌』. 1.2算法与数据结构 上篇文章对本系

“MEAN”技术栈开发web应用

“MEAN”技术栈开发web应用 上一篇我们讲了如何使用angular搭建起项目的前端框架,前端抽象出一个service层来向后端发送请求,后端则返回相应的json数据.本篇我们来介绍一下,如何在nodejs环境下利用express来搭建起服务端,使之正确的响应前端的请求.本文所讲的示例还是基于我们的学习项目QuestionMaker(https://github.com/Double-Lv/QuestionMaker) 运行起基于express的web服务器 express是一个web应用开发

用“MEAN”技术栈开发web应用(一)AngularJs前端架构

前言 不知何时突然冒出“MEAN技术栈”这个新词,听起来很牛逼的样子,其实就是我们已经熟悉了的近两年在前端比较流行的技术,mongodb.express.angularjs.nodejs,由于这几项技术涵盖了从前端到后端再到数据库,可以用他们完整的开发一个web应用了,所以成了一个非常牛逼的组合,颇有当年LAMP的气势.前端要从切图仔迈向全栈的路上,这几门技术必须得有所涉猎.本系列文章利用自己虚构的一个小项目为例,对“使用MEAN技术栈开发web应用”做一个入门级的介绍. AngularJs的争

用“MEAN”技术栈开发web应用(三)用mongodb搭建数据库

上一篇介绍了如何用express搭建起服务端MVC的开发架构,本篇我们来详细介绍一下这个Model层,也就是数据库访问层.包含如何使用mongodb搭建数据库,以及如何使用mongoose来访问数据. mongodb的安装和启动 首先我们得安装mongodb,先去官网( http://www.mongodb.org/downloads)下载安装包,我的开发环境是Windows,所以下载Windows下的iso文件,根据提示一路安装完毕即可,没什么需要特别选择的. 安装完后,为了能在cmd中全局都

Python进阶(三十六)-Web框架Django项目搭建全过程

Python进阶(三十六)-Web框架Django项目搭建全过程 ??IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 ??Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! Django 特点 强大的数据库功能 用python的类继承,几行代码就可以拥有一个丰富,动态的数据库操作接口(API),如果需要你也能执行SQL语句. 自带的强大的后台功能 几行简单的代码就让你的网

Python全栈开发-web框架之django

一:web框架 什么是web框架? Web应用框架(Web application framework)是一种开发框架,用来支持动态网站.网络应用程序及网络服务的开发.这种框架有助于减轻网页开发时共通性活动的工作负荷,例如许多框架提供数据库访问接口.标准样板以及会话管理等,可提升代码的可再用性. web应用的流程: //浏览器发送一个HTTP请求: //服务器收到请求,生成一个HTML文档: //服务器把HTML文档作为HTTP响应的Body发送给浏览器: //浏览器收到HTTP响应,从HTTP

python后端面试第七部分:项目部分--长期维护

##################    Python语法基础        ####################### 项目部分 4.python适合的场景有哪些?当遇到计算密集型任务怎么办? Python适合的场景1. 科学计算 2. 快速原型开发 3.网站. 4. 脚本. 实际上在各个方向上它都有挺多应用,前列几项算是比较火的吧.计算密集型任务模块用C/C++做.多进程,多线程也可以稍微提高些. 5.python高并发解决方案?我希望听到twisted->tornado->geve

Python(九)Tornado web 框架 其实很简单、深度应用

一.简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关有用工具及优化. Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以

【python之路42】web框架们的具体用法

Python的WEB框架 (一).Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. pip install bottle easy_install bottle apt-get install python-bottle wget http://bottlepy.org/bottle.py Bottle框架大致可以分为以下部分: 路由系统,将不同请求交由指定函数处理 模板系统,将模板