大家好,又见面了,我是你们的朋友全栈君。
flask框架2
文章目录
- flask框架2
-
-
- 一. 状态保持
-
- 1. Session细节
- 二. 高级处理
-
- 1. 上下文
- 2. 请求勾子
- 3. 路由变量
-
- 3.1 绑定动态URL (重点)
- 3.2 正则转换器
- 4. werkzerg库结构 (了解)
- 三. 参数和配置
-
- 1. Flask( )参数
- 2. Flask应用配置
- 四. 脚本启动
- 五. 模板
-
- 1. 模板变量的基本使用 (重点)
- 2. 过滤器
-
一. 状态保持
1. Session细节
- 细节
- 生成随机字符串
base64.b64encode(os.urandom(48)) 生成随机字符串
- 设置过期时间
- 生成随机字符串
# 让session支持设置过期时间 过期时间默认为31天
session.permanent = True
# 设置session的过期时间
app.permanent_session_lifetime = timedelta(days=7)
- session删除数据
# session删除数据
# session.pop("username", None)
- flask中默认的session并不是传统的session机制(数据保存在服务器数据库中), 而是将数据加密后全部保存到了cookie中
二. 高级处理
1. 上下文
代码语言:javascript复制# 上下文变量: 并不是全局变量, 是有使用范围的, 范围为从某次请求开始, 到该请求结束
# 请求上下文: 记录一些和请求有关的数据 request session
# 应用上下文: 记录一些事和应用有关的数据 current_app g
# current_app: 会自动引用创建的flask应用, 当需要在其他文件中使用flask应用时, 应用通过current_app来获取
# g: flask给开发者预留一个容器, 可以存放一些自定义的数据 每次请求时, g变量的数据会被重置
# 上下文机制: 实现了线程隔离(全局变量线程共享), 每个上下文对应一个线程, 当请求开始时, 会对应线程创建一个上下文, 当请求结束时, 销毁该上下文(上下文记录的数据随之销毁)
from flask import Flask, request, g
import news
app = Flask(__name__)
@app.route('/')
def index():
print(request.url)
g.name = "zs"
news.func1()
return "index"
@app.route('/demo1')
def demo1():
# print(g.name) # 会报错
return "demo1"
- 上下文底层实现
https://segmentfault.com/a/1190000009152655
2. 请求勾子
- 请求钩子: 对各类请求事件进行监听, 当事件发生时, 可以让开发者进行一些自定义处理
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "index"
@app.before_first_request
def initial():
print('web应用被第一次请求时会调用, 一般用于完成一些初始化处理, 如 建立数据库连接')
@app.before_request
def prepare():
print("每次请求前(视图函数调用前)调用, 一般用于完成一些请求的准备工作, 如参数校验, 数据统计, 黑名单过滤")
@app.after_request
def process(response): # 一旦设置了该钩子, 必须设置形参来接收响应对象
print("每次请求后(视图函数执行完)调用, 一般用于对响应进行加工, 如设置统一的响应头, 包装数据")
return response # 对响应加工完, 还需要返回响应对象
@app.teardown_request
def error_handle(error): # 一旦设置了该钩子, 必须设置形参来接收异常信息 无异常就是None
print("每次请求后调用, 无论是否出现异常, 一般用于请求资源回收, 如异常统计")
3. 路由变量
3.1 绑定动态URL (重点)
- 路由变量: 让视图函数可以绑定动态URL
- 路由变量格式:
/user/<user_id>
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/user/<user_id>')
def user(user_id): # 一旦设置了路由变量, 视图函数就必须设置和路由变量同名的形参, 形参会接收路由变量的值
print(user_id)
return "user"
@app.route('/')
def index():
# 获取视图函数的动态URL, 必须手动设置动态部分的内容
url1 = url_for("user", user_id=12)
print(url1)
return "index"
3.2 正则转换器
- 正则转换器: 给路由变量进行
格式过滤
, 格式不满足返回404
from flask import Flask, url_for
app = Flask(__name__)
# 所有转换器都继承了BaseConverter
@app.route('/user/<int:user_id>')
def user(user_id): # 一旦设置了路由变量, 视图函数就必须设置和路由变量同名的形参, 形参会接收路由变量的值
print(user_id)
print(type(user_id))
return "user"
# 部分转换器可以传递参数, 以便设置更灵活格式要求
@app.route('/news/<string(minlength=2, maxlength=5):news_name>')
def news(news_name):
print(news_name)
return "news"
4. werkzerg库结构 (了解)
三. 参数和配置
1. Flask( )参数
代码语言:javascript复制app = Flask(__name__, # 导入名称, flask会根据该名称查询静态文件/模板文件存储路径
# flask官方推荐使用__name__, 如果使用__name__, 从当前文件所有的文件夹中查询静态文件/模板文件路径
static_folder="static", # 设置静态文件的存储路径
static_url_path="/res/image", # 设置静态文件的访问路径
template_folder="templates" # 设置模板文件的存储路径
)
2. Flask应用配置
代码语言:javascript复制from flask import Flask
app = Flask(__name__)
# 设置应用配置 本质是字典
# app.config['DEBUG'] = True
# 开发中, 会对配置进行封装 提供了三种方式
class Config:
# 定义和配置同名的类属性
DEBUG = True
# 从对象中加载配置 要求掌握
app.config.from_object(Config)
# 从py文件中加载配置
# app.config.from_pyfile("config.py")
# 从环境变量中加载配置
# app.config.from_envvar("ENV_CONFIG")
@app.route('/')
def index():
return "index"
if __name__ == '__main__':
app.run()
四. 脚本启动
- 作用: 让开发者可以以
文本模式
来启动和配置
web应用 - 需要安装flask组件
flask-script
- 项目部署到服务器以后, 只能通过终端用
文本模式
来启动web应用
- 启动web应用
python main.py runserver -h 0.0.0.0 -p 8000 -d
- 使用pycharm启动mgr管理的项目
五. 模板
1. 模板变量的基本使用 (重点)
- 模板的基本使用
- 模板变量
<body>
<label>{
{ name }}</label><br/>
<label>{
{ age_dict["zs"] }}</label><br/>
<label>{
{ age_dict.zs }}</label><br/> {# 模板变量支持点语法 #}
<label>{
{ height_list[0] }}</label><br/>
<label>{
{ height_list.0 }}</label><br/>
<label>{
{ height_list.0 age_dict.zs }}</label><br/> {# 支持数学运算 #}
<label>{
{ user.type }}</label><br/> {# 支持自定义对象 #}
<label>{
{ user.is_login() }}</label><br/> {# 支持函数和方法调用 #}
</body>
2. 过滤器
- 作用: 对
模板变量
进行格式转换
<label>{
{ name | upper }}</label><br/>
<label>{
{ name | upper | reverse }}</label><br/> {# 支持链式调用 #}
<label>{
{ height_list | sum }}</label><br/>
<label>{
{ age_list | sum(attribute="age") }}</label><br/> {# 字典列表中的每个键值对求和 #}
<label>{
{ h1_tag | safe }}</label><br/> {# jiaja2模板会自动对html字符进行转义, 可以设置safe过滤器来取消html转义 #}
<p>
{% filter upper %} {# 过滤代码块 可以将其中的内容全部转换 #}
hello<br/>
world
{% endfilter %}
</p>
- 自定义过滤器
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179055.html原文链接:https://javaforall.cn