入门Flask框架
Flask是一个用Python语言编写的轻量级Web应用框架,它采用WSGI工具箱和Jinja2模板引擎,该框架使用简单的核心和扩展,没有默认的数据库和窗体验证工具,被称为“微框架”。
核心
WSGI工具箱采用Werkzeug(路由模块),模板引擎采用jinja2
特点
轻量级,只提供一些核心操作
相关知识
框架:Web框架是一种用于开发Web应用的软件架构,它提供了一些通用的功能和组件,使得开发者可以更方便、高效、安全地构建Web应用。
模板引擎(Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
模板引擎的核心原理就是两个字:替换。将预先定义的标签字符替换为指定的业务数据,或者根据某种定义好的流程进行输出
模板:模板是一种文件,它可以包含固定的和动态的内容。动态的内容通常是用一种特定的语法来表示的,
**路由(route)**:简单来说,路由就是URL到视图函数的映射。当访问某个URL时,就会执行对应的函数
如:/usersu -> getAllUsers()
router 可以理解为一个容器,或者说一种机制,它管理了一组 route。简单来说,route 只是进行了URL和函数的映射,而在当接收到一个URL之后,去路由映射表中查找相应的函数,这个过程是由 router 来处理的。
构成
from flask import Flask #1.导入 |
目录结构:app.py主程序,templates存放模板文件,static存放静态文件
装饰器
装饰器的一般语法结构如下:
def decorator(func): |
要使用装饰器,可以在要被装饰的函数上方使用@符号,后面跟着装饰器的名称。
@decorator # 使用@符号应用装饰器def my_func(): # 定义要被装饰的函数pass # 函数体 |
这相当于执行了以下代码:
def my_func(): |
初始化
flask对象初始化参数
Flask(import_name,static_url_path,static_floder,template_folder)
import_name(必要):
工程(主模块)目录名称,__name__当前模块(目录)名称,可决定访问静态文件的路径
static_url_path
静态文件访问路径,默认为/+static_floder
static_floder
静态文件存储的文件夹名称,默认为’stastic’
template_folder
模板文件存储的文件夹名称,默认为’templates’
web应用程序配置参数
作用:集中管理项目中所有的配置
flask将配置信息放入了app.config属性之中,该属性可以按照字典类型进行操作
设置
1.从配置对象中加载
app.config.from_object(配置对象),如
class DefaultConfig(object): #设置配置类 |
2.从配置文件中加载
app.config.from_pyfile(‘文件名’)
3.从环境变量中加载
app.config.from_envvar(‘环境变量名’)
app.run(host=”0.0.0.0”,port=5000,debug=True,threaded=True)
debug调试模式
1.程序修改后可以自动重启
2.服务器出现错误能够返回给前端
threaded–是否开启多线程
终端启动–flask run -h 0.0.0.0 -p 5000
读取环境变量FLASK_APP的值作为启动文件
export FLASK_APP=app
路由与蓝图
查看全部路由
1.命令行
flask routes
2.程序中查看
app.url_map
app.url_map.iter_rules()–返回列表
指定请求方式
默认支持的请求方式:GET、OPTION、HEAD
app.route(‘url’,methods=list)
蓝图
一个存储一组视图方法的容器对象,具有以下特d
- 一个应用可以具有多个Blueprint
- 可以将一个Blueprint注册到任何一个未使用的URL下
- 蓝图可以单独具有自己的模板、静态文件、或其他通用操作方法,并不是必须实现应用视图和函数
- 一个应用初始化时,就应该注册需要使用Blueprint,蓝图并不是一个完整应用,必须要注册到某一应用中
使用
1.创建蓝图对象
from flask import Blueprint |
2.在这个蓝图对象上进行操作,注册路由,指定静态文件,注册模板过滤器
|
3.在应用对象上注册蓝图对象
app.register_blueprint(user_bp) |
请求与响应
转化器,获取动态url参数
获取路径参数
route(‘/user/converter:id‘)
converter–数据类型:string(默认)、int、flaot、path、uuid、any
url_for()–根据函数获取url
获取请求数据
通过request对象获取
属性 | 说明 | 类型 |
---|---|---|
data | 记录请求数据,并转化为字符串 | * |
form | 记录请求中的表单数据 | MultiDict |
args | 记录查询参数 | MultiDict |
cookies | 记录请求中cookie信息 | Dict |
headers | 记录请求头信息 | EnvironHeaders |
method | 记录请求的HTTP方法 | GET/POST |
url | 记录URL地址 | string |
files | 记录请求上传的文件 | * |
示例
id=request.args.get('id') |
处理响应
1.模板渲染
使用render_template方法渲染模板并返回
导入
from flask import render_template |
使用
return render_template('index.html',mystr(模板内变量名)=strval(程序中的变量),...) |
参数已经封装成字典,在字典前添加**,如**data
render_template_string()将字符串当作模板文件内容进行渲染
2.重定向
from flask import redirect |
3.返回JSON
from flask import jsonify |
自定义状态码和响应头
make_respone(其中一种方式)
resp=make_respone('test') |
cookie和session
response.setcookie( )
response.delete_cookie()–删除cookie
from flask import session |
请求钩子与上下文
异常处理
abort(code)
http异常主动抛出,抛出一个状态码code
捕获错误
errorhandler装饰器
注册一个错误处理程序,当程序抛出异常时,就会执行装饰器的方法
|
请求钩子
请求钩子是一种在Flask框架中实现请求前后执行一些操作的方法,比如打印日志、验证身份、处理异常等。请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
before_first_request
:在处理第一个请求之前执行,可以用于初始化项目的一些配置或资源。before_request
:在每次请求之前执行,可以用于判断权限、转换路由参数或预处理客户端请求的数据。after_request
:在每次请求(视图函数处理)之后执行,前提是视图函数没有出现异常,可以用于修改响应数据、记录操作历史、清理收尾工作等。teardown_request
:在每次请求之后执行,无论视图函数是否出现异常,可以用于记录异常信息、释放资源等。
示例
|
上下文
Flask中的上下文是指在处理请求时,Flask会创建一些对象,如request, session, current_app, g等,这些对象保存了请求相关的信息或程序的状态。上下文可以让视图函数直接访问这些对象,而不需要通过参数传递。
Flask中有两种上下文:请求上下文和程序上下文。
- 请求上下文包括request和session,它们是从_request_ctx_stack这个LocalStack对象中获取的。
- 程序上下文包括current_app和g,它们是从_app_ctx_stack这个LocalStack对象中获取的。
请求上下文
–解决多线程问题
request、session
程序上下文
不同文件下调用对象
current_app
from flask import current_app |
g对象
g作为flask程序全局的一个临时变量,便于函数之间的参数传递
模板
模板中的变量
{{ var }}
,视图传递模板的数据,变量不存在,默认忽略
模板中的标签
{% tag %}
主要语法标签:
变量标记 - {{ }}
语句执行 - {% %}
注释语句 - ````
变量输出:
变量输出以{{ }}
包裹
变量 - {{变量名}}
,比如{{myname}}
对象 - {{obj.属性}}
、字典 - {{dict['key']}}
、列表 - {{lists[i]}}
、函数 - {{func()}}
条件语句:
根据条件选择显示不同的html部分
{% if condition %} |
for 循环语句:
{% for item in items %} |
设置变量
{% set a='666' %} |
模板继承
将网页结构提取出来,新建一个base.html
继承语法:
{% extend "base.html" %}
其中base.html为父模板,所有的字模板脑结构都继承自base
模板全局变量
上下文处理函数:
@app.context_processor |
每个视图函数执行的时候,会自动执行该函数,接受该变量传给模板渲染函数