@Flask文档
Flask学习文档
一、简介
Flask诞生于2010年,是用Python语言给予WerkZeug工具箱编写的轻量级Web开发框架;
Flask本身相当于一个内核,其他几乎所有内容都需要用到扩展(邮件扩展Flask-Mail、用户认证Flask-Login),都需要用到第三方的扩展工具来实现;
其WSGI工具箱采用Werkzeug(路由模块),模版引擎则使用Jinja2。这两个也是Flask框架的核心。
python最出名的框架要数Django,此外还有flask、Tornado等框架。
二、Flask常用扩展包
Flask-SQLalchemy:操作数据库
Flask-Mail:邮件
Flask-migrate:管理数据库迁移
Flask-WTF:表单
Flask-Bable:提供国际化和本地化支持、翻译
Flask-script:插入脚本
Flask-Login:认证用户状态
Flask-OpenID:认证
Flask-RESTful:开发REST API的工具
Flask-Bootstrap:集成前端Twitter Bootstrap框架
Flask-Morment:本地化日期和时间
Flask-Admin:简单而可扩展的管理接口的框架
三、虚拟环境安装
1、虚拟环境创建
使用virtualenv创建,可以查看是否安装virtualenv
# 查看虚拟环境是否安装以及安装的版本
vitualenv --version
2、安装虚拟环境
参考链接: 点击.
sudo pip install virtualenv
sudo pip install virtualenvwrapper
3、安装虚拟环境必须在联网状态
mkvirtualenv Flask_py
4、安装虚拟环境后
如果提示找不到mkvirtualenv命令,必须陪着环境变量
#1、创建目录存放虚拟环境
mkdir $HOME/.virtualenvs
#2、打开~/.bashrc文件,并添加如下
export WORKON_HOME=$HOME/.virtualenvs
source /user/local/bin/virtualenvwrapper.sh
#3、运行
source ~/.bashrc
5、进入虚拟环境
workon Flask_py
6、退出虚拟环境
deactivate Flask_py
三、安装Flask
1、安装指定版本Flask
pip install flask==0.10.1
2、测试是否安装成功
from flask import Flask
说明:python项目中必须包含一个requirements.txt文件,用于记录虽有依赖包以及精确的版本号,以便在新环境中进行部署操作
3、生成依赖包文件
在虚拟环境使用以下命令将当前虚拟环境中依赖包以版本号生成至文件中
pip freeze > requirements.txt
pip install -r requirements.txt
四、flask简单程序
1、程序
#从flask包中导入Flask类
#Flask这个类是项目的核心,以后很多的操作都是基于这个类的对象
#注册url,注册蓝图等都是基于这个类的对象
from flask import Flask
##创建一个Flask对象,传递__name__参数进去
#__name__参数的作用:
#1、可以规定模版和静态文件的查找路径
#2、以后一些flask插件,如Flask-SQLAlchemy,如果报错了,可通过__name__参数找到具体错误位置
app = Flask(__name__)
##@app.route是一个装饰器
# @开头,并且在函数的上面,说明是装饰器
# 这个装饰器的作用,是做一个url与视图函数的映射
# 127.0.0.1:5000/ ->去请求hello_world这个函数,然后将结果返回给浏览器
@app.route('/)
def hello_world():
return '我是第一个flask程序'
#如果当前这个文件是作为入口程序运行,那么就执行app.run()
## 修改port ip参考该链接
# https://blog.csdn.net/qq_41649001/article/details/106461897
if __name__=='__main__':
#app.run()
# 启动一个应用服务器,来接受用户的请求
#使用debug模式:作用是在前端显示错误
if __name__=='__main__':
app.run(debug=True)
方便做调试,还有就是当文件改变时,会重启服务器
## 设置debug模式:
1、当app.run()中传入一个关键字参数debug,app.run(debug=True),就设置当前项目为debug模式
2、debug模式的两大功能:
当程序出现问题的时候,可以在页面中看到错误信息和出错的位置
只要修改了项目中的'python'文件,程序会自动加载,不需要手动重新启动服务器
五、URL与函数映射
GET POST DELETE PUT
1、GET请求:只会在服务器上获取资源,不会更改服务器的状态
2、POST请求:会给服务器提交一些数据或者文件,一般post请求是会对服务器的状态产生影响
3、关于参数传递:
GET请求:把参数放到url中,通过?xx=XXXX床底,会把参数放到url中
POST请求:把参数放到Form Data中。会把参数放到Form Data中,避免了被偷瞄的风险
4、Flask中,route默认方法是使用GET方法请求这个url,通过methos参数
1、URL
一个URL要与执行函数进行映射,使用的是@app.route装饰器,在该装饰器中,可以指定URL的规则来进行更加详细的映射
如:@app.route(’/article/’)
尖括号的固定写法,variable默认的数据类型是字符串,如果需要指定类型,则要写成converter:variable,其中converter就是类型名称,可以有一下几种:
1、string
2、int
3、float
4、path:数据类型和string有点类似,都是可以接受任意的字段串,但是path可以接受路径,也就是说可以包含斜杠
5、uuid:数据类型只能接受符合uuid的字符串。uuid是一个全宇宙都唯一的字符串,一般可以用来作为表的主键
6、any:数据类型可以在一个url中指定多个路径
@app.route('/<any(user,blog):url_path>/<id>')
注意:
被装饰器修饰的方法必须要返回String类型的数据,否则测试会出错
2、URL传递参数的两种方式
1、方式一:/路径/参数,(就是将参数嵌入到路径中)
2、方式二:/路径?参数名1=参数值1&参数名2=参数值2…
@app.route('/test')
def hello_world():
wd = request.args.get('wd')
ie = request.args.get('ie')
print('wd',wd)
print('ie',ie)
return 'hello'
if __name__ == '__main__':
app.run()
3、上述代码中的方法仅支持get请求方式,如果想让该方法能够接受get和post请求可以按照下面方式改动,增加一个属性method
@app.route('/test',methods=['GET','POST'])
4、如果是post请求传递参数,需要通过request.form.get(‘id’)来进行获取
5、如果你的这个页面想要做SEO优化,就是被搜索引擎搜索到,那么推荐使用第一张方式(path的形式)。如果不在乎搜索引擎优化,那么第二种(查询字符串的形式)
3、自定义URL转换器
1、步骤
转换器是一个类,且必须继承werkzeug.routing.BaseConverter
1、实现一个类,继承BaseConverter
2、在自定义的类中,重写regex,也就是这个变量的正则表达式
3、将自定义的类,映射到app.url_map.converters上,理解为加入字典DEFAULT_CONVERTERS中
3.1、URL_for函数使用详解
1、使用说明:
一般我们通过一个URL就可以执行到某一个函数,如果反过来,我们知道一个函数,怎么去获得这个URL呢?URL_for就可以帮助我们实现这个功能
url_for():函数接收两个及以上的参数,他接收函数名作为第一个参数,同样也接收可以作为对应URL规则的命名参数且名称必须和url中的参数一致(如下面案例中的page参数),如果还出现其他的参数,则会添加到 URL 的后面作为查询参数
这样的话,我们就可以通过访问一个简单的函数映射,来获取一个相对复杂的函数映射,方便我们处理复杂项目中的一些映射的书写
2、为什么要选择url_for
3.2、自定义URL转换器 to_python方法
1、步骤
转换器是一个类,且必须继承werkzeug.routing.BaseConverter
1、实现一个类,继承BaseConverter
2、在自定义的类中,重写regex,也就是这个变量的正则表达式
3、将自定义的类,映射到app.url_map.converters上,理解为加入字典DEFAULT_CONVERTERS中
2、 过程
1、在转换器类中,实现to_python(selfm value)方法,这个方法的返回值,将会传递到view函数中作为参数
2、案例分享
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
##需求:查询多个模块的数据
#自定义转换器来实现
class modeleConverter(BaseConverter):
def to_python(self, value):
#这里的返回值就会传递到list2方法中接受到的modules参数中
return str(value.split('+'))
def to_url(self,value):
print(value)
return "+".join(value)
class modeleConverter(BaseConverter):
app.url_map.converters['mod']=
#需求:查询多个模块的数据
@app.route('/list/<mod:modules>')
def list(modules):
#print(modules)
#moduleList = modules.split('+')
#return '你要查询的模块分别为:%s,%s' %moduleList[0],moduleList[1]
return modules
if __name__=='__main__':
app.run()
4、页面跳转和重定向
重定向分为永久性重定向和暂时性重定向(后者开发中很常见),在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面.比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面
1、永久性重定向:http 的状态码是 301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入 www.jingdong.com 的时候,会被重定向到 www.jd.com ,因为 jingdong.com 这个网址已经被废弃了,被改成 jd.com ,所以这种情况下应该用永久重定向
2、暂时性重定向:http 的状态码是 302 ,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。
3、flask中重定向:重定向是通过 redirect(location,code=302) 这个函数来实现的, location 表示需要重定向到的 URL ,应该配合之前讲的 url_for() 函数来使用, code 表示采用哪个重定向,默认是 302 也即 暂时性重定向 ,可以修改成 301 来实现永久性重定向。
from flask import Flask, request, url_for, redirect
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/login/')
def login():
return '这是登录页面'
# falsk中重定向
@app.route('/profile/')
def proflie():
# 如果已经登录,即可以获取到name参数,便"跳转"到个人中心页面
if request.args.get('name'):
return '个人中心页面'
else:
# 否则重定向到login页面
# return redirect(url_for('login'))
return redirect(url_for('login'), code=302)
if __name__ == '__main__':
app.run(debug=True
5、试图函数Response返回值详解
1、关于响应Response,试图函数中可以返回一下类型的值:
(1)Response对象及其子类对象
from flask import Flask
from werkzeug.wrappers import Response
app = Flask(__name__)
@app.route('/response/')
def response():
res = Response('返回一个Response对象')
#好处,可以对Response对象进行加工后返回
res.set_cookie('uname', 'root')
res.set_cookie('pwd','1234')
return res
(2)字符串:其实Flask是根据返回的字符串类型,重新创建一个werkzeug.wrappers.Response对象,Response将该字符串作为主体,状态码为200,然后返回Response对象
(3)元组。元组中格式是 (response,status,headers) 。 response 为一个字符串,status 值是状态码, headers 是一些响应头。即(响应体,状态码,头部信息),也不一定三个都要写,写两个也是可以的。
@app.route("/tuple/")
(4)如果返回的是一个字典,那么调用jsonify创建一个相应对象
@app.route('/dict')
def hello_world():
return {'uname':'root', 'pwd':'123'}
(5)如果以上都不是,那么Flask会假定返回值是一个有效的WSGI应用并把它转换成一个相应对象
5.1、自定义Response子类步骤
1、继承Response类
2、实现方法force_type(cls,rv,environ=None)。那么在视图函数返回该自定义的Response对象的时候,就会将返回值传给Response.force_type(cls, response, environ=None),然后再将该方法的返回值传递给前端
指定app.response_class为你自定义的Response对象。
PS:我在查过flask官网帮助文档后发现flask1.1之后,对于Response对象及其子类对象,字符串,元组,字典,都可以直接进行响应了,打算做一个列表的自定义Response类来实现对列表数据的响应,但是写完代码之后运行还是无法通过测试,这里贴一下我的代码,不知道是否正确,希望能实现对于列表数据响应的小伙伴可以分享一下方法
六、Flask & swagger
1、安装swagger
pip install flask-restplus
2、基本功能
需要实现的功能:
构建URL,设置静态文件
设置请求方法(POST/GET/。。。)
设置参数,包括URL参数和body内参数
3、注释介绍
注释分类:
整个swagger页面的注解
每一类接口的注解
每个接口的注解
接口中那个参数的注解
3.1 基本对象
app:Flask对象
version:版本,swagger显示的内容之一
title:标题
description:简单介绍
contact:联系人
doc:swagger页面地址,默认为/
default:默认namespace名称
namespace对象:
构建方法:api.namespace()
主要功能:Group resources together,若干个借口放到一个组里显示
主要参数:
name:名称
description:swagger注解,每一类接口的简单说明
path:相关借口URL统一前缀,默认情况下为/{name},其中{name}是第一个参数
api.model的使用
作用:构建借口输入(输出)的形式
整体思路:每个model拥有一个名称以及一个字典
字典表示该model中属性的名称(key)以及对应的特征(value)
model可以嵌套使用
3.2 构建注意事项:
方法:api.model
主要通过flask_restplus.fields中各类实现
fields.Raw 是所有类型对象的基类,包括的主要参数有:
attribute:重命名属性
default:默认值
title:用于文档注解。
description:说明,用于文档注解。
required:bool,用于文档注解。
readonly:bool,用于文档注解
如何用于接口输入、输出的描述:‘
api.marshal_with(my_model, as_list=False):用于描述接口输出。可以设置 as_list 来表示输出的是一个序列。
api.expect():用于描述接口的输入。如果要设置输入的为序列,则可以使用 @api.expect[my_model]
3.3 每一类接口的注释
api.namespace(name='', description="type in here")
3.4 每个接口的注释
@api.route('', doc={"description": "type in here"})
3.5 url参数注解
可使用@api.doc(params={'id':'An ID', description='My resource'}) #注解对应的class
可使用多个@api.param('id':'An ID')注解对应的class