flask程序的基本结构
1.终端启动flask服务
cmd下
set FLASK_APP=XXX.py
set FLASK_ENV=development(调试模式)
powershell下
$env:FLASK_APP="test.py"
$env:FLASK_ENV="development"
启动任意地址访问
flask run --host=0.0.0.0
2.初始化
所有flask程序都必须创建一个程序实例,web服务器使用一种web服务器网关接口(Web Server Gateway Interface,WSGI)协议
,把接收到客户端的所有请求都转交给这个对象处理,程序实例是Flask类的对象
#创建flask实例
from flask import Flask
app=Flask(__name__)
Flask类的构造函数只有一个必须指定的参数,即程序主模块或包的名字
参数使用
__name__
的原因是这个参数可以决定程序的根目录,以便后续资源定和寻找
3. 路由和视图函数
路由和视图函数
因为在flask中,客户端把请求发送到web服务器,web服务器把请求发送到flask程序实例中,因此程序实例需要知道每个url请求了什么样的内容(代码),所以需要保存url到python函数的映射关系,而处理url和函数之间关系的程序称为==路由==
在flask中,最简便的定义路由的方法是通过程序实例提供的
app.route修饰器
,,把修饰的函数注册为路由#将index()函数注册为Flask程序实例根地址, @app.route('/') def index(): return '<h1>Hello World</h1>'
index()函数即为==视图函数==,视图函数返回的可以是包含HTML的简单字符串,也可以是复杂的表单
让url中包含可变成分
flask中可以在route修饰器中使用句法即可实现可变url
@app.route('/hello/<test>') def b(test): return f'1---{test}'
使用
<>
来获取动态内容,任何能匹配静态部分的url都会映射到这个路由上。通过在视图函数添加参数,可以让flask将动态部分作为参数传入函数路由中的动态部分默认使用字符串,但可以认为指定数据类型
@app.route('/hello/<int:test>') #(缺省值)接受字符串 @app.route('/hello/<int:test>') #接受正整数 @app.route('/hello/<float:test>') #接受正浮点数 @app.route('/hello/<path:test>') #接受路径数据(可以包含斜线) @app.route('/hello/<uuid:test>') #接收UUID(通用唯一识别码)字符串
启动flask服务器
实例程序使用
run()
启动Flask集成的开发web服务器if __name__=='__main__': app.run(debug=True) #判断name的目的是防止被别的模块调用运行,比如父级脚本启动不同的服务器,使用这个可以避免被父级启动
服务启动后,会进入轮询,等待并处理请求。设置
debug=True
开启调试模式(激活调试器和重载程序),还可以添加host参数,当host=0.0.0.0时,表示接受任意主机访问
4. 请求响应循环
程序和请求上下文
flask收到请求时,需要对请求通过视图函数进行处理,请求对象封装了客户端发送的http请求,将请求对象作为参数传入视图函数中,从而访问请求对象。但为了避免大量参数传入视图函数中,==flask使用上下文临时把某些对象变为全局可访问==
flask使用上下文让特定的变量在一个线程中全局可访问,但不会干扰其他线程
flask中有两种上下文
变量名 上下文 说明 current_app 程序上下文 一个被激活的程序的实例 g 程序上下文 保存一次请求的东西,在下一次请求发起后失效 request 请求上下文 封装http请求中的内容 session 请求上下文 保存客户端身份认证相关的东西 上下文可以理解为一种环境,通过环境来完成下一步工作,类似于语文中的阅读理解,从上下文中获取想要的信息
请求调度
使用app.route装饰器或app.add_url_rule()生成映射
app.url_map()查看当前所有路由和函数映射
其中/static是flaks添加的特殊路由,用来访问静态文件
请求钩子
通过装饰器实现,具体可参考如下文章https://www.jianshu.com/p/971e80c0c8f1
响应
可以将返回状态码作为return的第二个参数 return "Nothing",404
重定向
return redirect('https://xxx.com')
错误处理
return abort(状态码)
模板
1. 补充:
在url中包含可变参数,尖括号中的内容为可变参数
@app.route("/test/<userId>")
def test(userId):
return "this is %s" % userId
2. 引入模板
模板文件统一放在项目中的templates目录下
from flask import render_templa
@app.route("/<name>")
def test(name):
return render_template('test.html',name=name)
模板内容举例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title{{name}}</title>
</head>
<body>
<h1>this is {{name}}</h1>
</body>
</html>
过滤器
可以在模板内通过过滤器来改变变量
常见过滤器
safe 渲染时不转义 capitalize 首字母大写,其他小写 lower 值转换为小写 upper 转换为大写 title 每个单词首字母大写 trim 去掉首尾空格 striptags 渲染之前删除所以HTML标签 控制结构
if语句
{% if xxx%} {% else %} {% endif %}
for循环
{% for i in xxx %} {% endfor %}
宏
可以理解为在html中的函数
#test.html {%macro test(name)%} {{name}} {%endmacro%} {%for i in x%} {{test(i)}} {%endfor%}
外部文件导入使用:保存在单独的文件中,使用的时候,在当前文件内引入
{% import 'test.html' as macros%} {%for i in x%} {{macros.test(i)}} {%endfor%}
重复使用
{%include 'test.html'%}
3. flask-bootstrap
flask-bootstrap是twiter开发的一款开源网站框架,通过pip安装后,可以在html文件中使用
{% extends "bootstrap/base.html" %}
extends实现了模板继承
让程序拓展成一个具有基本页面结构的基模板,基模板中定义了可以在衍生模板中重新定义的块,通过block 和 endblock
添加到基模板中
由于很都块是flask-bootstrap自用的,所以直接重定义可能出现一些问题,所以一般在修改的地方,先使用{{super()}}加载原有模板内容
4. 链接
url_for()
第一个参数是路由对应的视图函数名,如果路由包含可变部分,则第二个参数将动态部分作为关键字传入,如
url_for('user',name='john',_external=False)