# flask 不能返回 int类型和float类型数据
# flask 的response
# 1.HTTPResponse 返回字符串 ""
# 2. render_template 渲染返回模板文件
# 3. redirect 重定向
### Flask 特殊封装
# 4. send_file 打开返回文件内容, Content-Type:文件类型. 自动识别文件类型,
# 5. jsonify 返回标准的json 字符串, 文件类型:Content-Tpye:application/json
# flask 的request
# 1.Request 导入 - 请求上下文
# 2.Request.method 请求方式: 8种方式 get post delete put : options(解决请求跨域),
# 3.Request.path url_root 路由地址
# 4.Request.HOST 获取访问主机地址
# flask request 方法
# request.form FormData中数据 有一个to_dict()方法,直接返回字典数据
# request.args url中的数据 有一个to_dict()方法,直接返回字典数据
# request.data 请求体的原始信息,只有 Content-Type没有Form
# request.json 请求头中的Content-Type:application/json 时,自动存为字典数据
# request.headers 请求头中的数据
# request.cookies 请求中cookie信息
# 注意:
request.values (用于检查参数是否传递)
# flaks 中的Session --->Flask-Session 这是一个三方插件,和原生的sessions不一样.
from flask import session
# 使用session的前提是在application中添加secret_key
app.secret_key="13213141"
# 使用 session
def get_session():
session['user']='123'
### 交由客户端保管机制
# 1. 开启Session - session['user']='123'
# 2. session 序列化字符串
# 3. 通过secret_key 进行加密
# 4. 通过Cookie返回给客户端
# 接收Session
# 1.通过 Cookie 获取session
# 2.通过secret_key 解密
# 3.反序列化字典
# 4.得到原始session信息
一丶Flask中的路由
@app.route("/look",endpoint="look_name",methods=['get','post'],redict_to='/home',defaults={"nid":1})
def look(nid):
return ""
# endpoint 不能重复,对应视图函数,默认是视图函数名
# 1.
# url_for 反向创建url,视图函数与路由对应关系
url_for("index") # 结果/look
# methods 允许请求的方式 ["GET","POST","DELETE","PUT"]
# 1.迭代循环-->变大写--->集合去重
# redict_to 永久重定向 308
# 没有进入视图,直接跳转到新的地址
# strict_slashes 是否严格要求路由匹配规则 , 值只有True和False
# defaults 默认参数 ,在视图函数中一定要接收,才能使用.
#### ** 动态参数路由 只有int 类型和 string类型
@app.route("/look/<int:page>") # <string:page> 字符串是万能的参数接收
def look(page):
return f"当前是第{page}页"
# 场景:
利用send_file限定返回的文件
二丶 Flask 初始化实例参数
# template_folder 存放 模板路径
# static_folder 静态文件"存放 "路径
# static_url_path 静态文件 "访问路径", 默认值f"/{static_folder}",如果没有指定就是'/static'
# static_host 静态文件存放服务器主机 静态文件访问服务HOST -> 指向到另外一台服务器
### 注意: static_url_path 是加了 "/"前缀的 static_folder
# -*-coding:utf-8-*-
# Author:Ds
from flask import Flask, render_template, send_file
app=Flask(__name__,template_folder='templates',static_folder='image',static_url_path='/image')
my_static_folder='image'
my_static_url_path=None
if not my_static_url_path:
my_static_url_path=f'/{my_static_folder}'
@app.route(f'/{my_static_url_path}/<filename>')
def look(filename):
import os
file_path=os.path.join(my_static_folder,filename)
return send_file(file_path)
@app.route('/index')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run()
三丶 Flask config对象
# 默认配置 : app.default_config
# DEBUG 模式 开启编辑时代码重启 Log打印级别最低 错误信息透传
# TESTING 模式 无限接近生产环境 代码编辑不会重启 Log级别较高 错误信息不再透传
# SESSION_COOKIE_NAME 存放在浏览器cookie中session的名称
### 在flask中 所有的配置都是以 k:v的形式配置,
# Flask Config 快速配置, settings.py
class DebugConfig:
DEBUG = True
SECRET_KEY = "%^&*(%^&*"
PERMANENT_SESSION_LIFETIME = 3600
SESSION_COOKIE_NAME = "I am Not Session"
OLD = "OLD"
BOY = "BOY"
EDU = "EDU"
PYTHON = "PYTHON"
FLASK = "FLASK"
class TestConfig:
DEBUG = True
SECRET_KEY = "%^&*(%^&*"
PERMANENT_SESSION_LIFETIME = 3600
SESSION_COOKIE_NAME = "I am Not Session"
OLD = "OLD"
BOY = "BOY"
EDU = "EDU"
PYTHON = "PYTHON"
FLASK = "FLASK"
### 在 flask app py文件中
from settings import DebugConfig,TestConfig
app.config.from_object(DebugConfig)
四丶blueprint 蓝图
# 蓝图的作用:
# 功能隔离, 路由隔离
# blueprint 是不能运行的Flask实例
### Blueprint('蓝图的名称',__name__,前缀)
# 注意: 1.蓝图的名称不能重复
2.多个蓝图实例相同时,url路由必须要加前缀,否则访问的永远是第一个蓝图的url路由
# 定义蓝图,app01文件夹下 views.py
from flask import Blueprint
user = Blueprint(name="app02user",__name__,url_prefix="/shopping") # url_prefix
@user.route("/login")
def login():
return "I am app02 userBP login func"
# flask 运行实例中注册蓝图
from .app01.views import user as app01_user
from .app02.views import user as app02_user
app.register_blueprint(app01_user)
app.register_blueprint(app02_user)
五丶Flask特殊装饰器
@app.before_request # 请求进入视图函数之前 , 执行顺序按照定义顺序执行
@app.after_request # 请求结束,返回影响客户端之前 ,执行顺序按照定义的倒置顺序执行,必须有response
@app.errorhandler(4xx or 5xx) # 重定义错误信息
### 定义错误~~~
@app.errorhandler(404)
def error404(ErrorMessage):
print(ErrorMessage)
return redirect("https://www.autohome.com.cn/beijing/asdfe32r24rff23r23r")
# return send_file("image/1.jpg")