Flask
简介
Flask是使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2模板引擎。Flask使用BSD协议授权。
Flask被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入以下功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。
名词解释:
Werkzeug:是Python的WSGI规范的实用函数库。大概功能有:HTTP头解析与封装、request和response对象、基于浏览器JS调试器、兼容WSGI规范、Py2-3支持、Unicode支持、支持会话及签名Cookie、支持URI和IRI的Unicode使用工具、兼容各浏览器和WSGI服务器实用工具、URL请求路由系统。
Jinja2:是为Python提供的独立的功能齐全模块,Jinja2提供了对unicode的全支持,以及一个可选集成的沙盒运行环境。Jinja2并不属于Django框架,只是Django中模板渲染工具和此类似,Django中没有独立出来的渲染模块,所以以JinJa2来剖析。
microframework:微型框架
extension/Flask-extension:之后补充
特点
优势:轻量、扩展性强、第三方组件齐全
劣势:自带组件只有session,第三方组件繁多导致版本兼容性相对较差。
pycharm创建flask项目步骤
https://img2018.cnblogs.com/blog/1614606/201907/1614606-20190710163303172-1516152408.gif
安装flask会附带安装的依赖包:
Jinja2 模板语言
MarkupSafe 处理标签语言,安全
Werkzeug 德语:工具的意思;作用:app.run本质就是执行Werkzeug里的run,和UWSGI类似
启动
创建一个py文件,写入以下内容:
初级启动
from flask import Flask
app = Flask(__name__) #”__name__”表示在当前文件中
app.run()
高级启动:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "Hello World!"
app.run()
导入包
from flask import Flask, render_template, redirect, jsonify, send_file,session
导入render_template,默认存放路径templates
- 在项目根目录创建templates文件夹
- 在Pycharm中右键此文件夹选则Mark Directory as-Template Folder,并且选择模板语言为Jinja2
- 在templates文件夹中存放render_template调用的内容
导入redirect重定向
@app.route("/index")
def index():
return render_template('index.html')
@app.route("/reback")
def reback():
return redirect('/index') #这里的redirect里是重定向的url,即app.route中的内容
导入send_file,向客户端发送文件
作用:打开并返回文件内容、自动识别文件类型、响应头中加入Content-type:文件类型
注:当浏览器无法识别Content-type时,会下载文件
导入request请求(重)
让支持请求需要在装饰器中加入methods=()或者[]@app.route("/login",methods= ['POST', 'GET'])
Flask中的request是公共变量,全局的,容易覆盖。
request.method |
请求方式 |
request.form---获取Form表单中的数据 |
|
request.form.to_dict() |
以字典形式输出所有数据 |
request.form.get(‘key’) |
以键取值 |
request.form[‘键’] |
以键取值 |
|
|
request.url |
获取访问路径 |
request.args |
获取url中的参数,如/index?id=2中的id=2 |
request.path |
获取路由地址 |
request.values |
获取Form和args中的数据 |
request.environ |
获取请求原始信息 |
request.base_url |
获取url头,不包含参数 |
request.headers |
获取请求头中的数据 |
***注:标红粗为重点必会***
***导入jsonify转化JSON格式(Flask-1.1.1版本之前有用)***
为响应头中加入 Content-type:application/json
在Flask 1.1.1版本中加入了直接返回字典,可以不再使用jsonify了
导入Flask中的session(不是三方组件)
注:Flask中的session存储在Cookies中,是交由客户端保管机制。
session的序列化
- 使用session需要从flask中导入session,以后所有和session相关的操作都是通过这个变量来的
- 使用session需要设置app.secret_key,用来作为加密用的;并且这个app.secret_key如果每次服务器启动后都变化的话,那么之前的session就不能通过当前这个SECRET_KEY进行解密了
- flask-session内部会创建字典 {username:传的用户名} 接下来 通过secret_key + 时间戳 + 签名加密形成
- 当客户端发起请求-request带上Cookie
- Flask收到Session加密字符串
- 通过secret_key解密session的加密字符串,最终获得 {username:传的用户名}
session的反序列化
方法
添加session:session['username']
删除:session.pop('username')或者del session[username]
清除所有session:session.clear()
获取session:session.get('username')
装饰器写法(回顾)
def pd(func):
def inner(*args, **kwargs):
if session.get('username'):
return func()
else:
return redirect('/login')
return inner
为多个视图函数增加同一个装饰器
为多个视图函数添加同一个装饰器时,会出现报错:提示定义了多个同名的视图函数,导致调用时出错,不知道调用哪个函数。所以需要用到以下方法解决错误
方法一:import functools
在py文件头部引入functools
然后在装饰器内部@functools.wraps(func)
例:
def pd(func):
@functools.wraps(func) #括号中写函数名
def inner(*args, **kwargs):
if session.get('username'):
return func()
else:
return redirect('/login')
return inner
方法二:endpoint=’*’
示例:
@app.route('/information',endpoint='information')
@pd
def information():
return render_template('information.html')
@app.route('/information2',endpoint='information2')
@pd
def information2():
return render_template('information2.html')
Flask中的路由
@app.route(‘/index’)
endpoint映射路由-视图函数__name__=””
理论是:endpoint Mapping -> “/index”:{“index”:index} 即为映射
如果endpoint指定了值,则视图函数是endpoint的值;如果没有,则视图函数是当前函数名;通过endpoint可以找到路由。
methods=[“get”,”post”]
当前函数支持的请求方式,405报错为请求方式不被允许。如果没有methods
defaults={“id”:1}
默认参数;一旦默认参数存在,视图函数中必须有一个形参去接收,形参变量名必须与defaults 中的一.致。
strict_slashes=True
是否严格遵循路由匹配规则”/”
redirect_to=”/login”
永久重定向 301或308
路由后加参数
@app.route("/information/<int:page>/<int:page2>/<int:page3>")
@pd
def information():
print(page,page2,page3)
return “OK”
动态参数路由
/detail/<folder>/<filename>
FlaskResponse
render_template(.html) #返回网页文件
redirect(“/login”) #重定向路由
“” #返回文本内容
jsonify # content-type : application/json
Flask 1.1.1 新特性:可以直接返回dict类型-本质上就是在jsonify({key:value})
send_file #自动打开并返回文件内容识别文件类型 content-type:文件类型
FlaskRequest
from flask import request #公共变量LocalProxy对象
request.POST.get()==request.form.get() -> .to_dict()
request.GET.get()==request.args.get()-> .to_dict()
request.json #请求头中带content-type:application/json
request.data #content-type无法被识别或者是没有Form
request.files.get() 获取文件
request.method
request.headers
request.cookie
request.path
request.url
request.host
request.host_url
Flask中的配置
初始化配置
app = Flask(__name__) # 当前文件下
template_folder="templatess" # 更改模板存放目录;默认值是 templates
static_folder="statics" # 静态文件存放路径
static_url_path="/static" # 静态文件访问路径;默认是 "/"+static_folder
Config 对象配置
app.default_config[参数]
DEBUG——编码阶段、代码重启、日志输出级别低、页面中会显示错误详情、易被黑客利用。
TESTING——测试阶段、日志输出级别较高、无限接近线上环境
利用类进行配置:
class DebugSetting(object):
DEBUG = True
SECRET_KEY = "123456789"
SESSION_COOKIE_NAME = "I am just Session"
SESSION_TYPE = 'Redis'
app.config.from_object(DebugSetting)
Flask 蓝图 Blueprint
Blueprint是一个不能够被run的Flask对象,蓝图需要注册在 app 实例上的,蓝图中是不存在Config的,起到了一定的应用隔离功能,URL管理。
示例蓝图py文件:
from flask import Blueprint
蓝图对象名 = Blueprint("蓝图名",__name__, template_ folder="静态文件夹名", url_prefix="/域名前缀")
示例主py文件:
from Modular.蓝图py文件名 import 蓝图对象名 #导入
app.register_blueprint(蓝图对象名) #注册
Flask 特殊装饰器(可作中间件)
app.before_request
在请求进入视图函数之前进行的操作。
return None #表示继续执行
#其他表示阻断
app.after_request
在视图函数结束后、响应客户端之前的操作,且倒序执行。
正常周期: be1 - be2 - be3 – 视图函数 - af3 - af2 - af1
异常周期: be1 - af3 - af2 - af1
errorhandler重定义错误信息
有参数的装饰器errorhandler(监听错误状态码 5xx 4xx Int)
示例:
@app.errorhandler(404) #404为错误状态码,这里只能监听5XX、4XX
def error404(error_message): #必须传参error_message
print(error_message)
return send_file("linux.mp4")
CBV
示例:
from flask import views
class Login(views.MethodView):
# HTTP请求的8种方式:
# decorators=[a,b,c,d] #装饰器
# methods=['get','post'] #允许的请求方式
def get(self):
pass
def post(self):
pass
app.add_url_rule('/login', endpoint=None, view_func=Login.as_view(name='login'))
Flask第三方组件
所有的Flask第三方组件,都是需要app.config,不但吸取配置项、还会更改或者增加配置项
Flask-Session
flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如:
redis:保存数据的一种工具,五大类型。非关系型数据库
memcached
filesystem
mongodb
sqlalchmey:那数据存到数据库表里面
示例:
from flask import Flask, session
from flask_session import Session
from redis import Redis
app = Flask(__name__)
app.config['SESSION_TYPE']='redis' #设置session所连接数据库类型为redis
app.config['SESSION_REDIS']=Redis(host='主机IP',port=端口,db=6) #用于连接redis的配置
Session(app) #读取config配置,改写APP中的session_interface
待补充