flask中路由
endpoint 不能重复,对应视图函数.默认是视图函数名.视图函数与路由的对应关系
url_for
url_for 可以反向找到对应的url
@app.route('/',endpoint="index_home")
@warp
def index():
print(url_for('index_home')) #--->结果为:/
return "ok"
mothods
允许请求方式(大小写都可以,)
常用:
GET,POST,DELETE,PUT
redirect_to
永久重定向. 没有进入视图层面,直接跳转
应用场景:
当前地址不存在,换新地址了.
strict_slashes
True|False 是否开启严格路由匹配规则
127.0.0.1/img/ --->开启后,无法匹配
defaults
装饰器的默认参数
@app.route('/',endpoint="index_home",defaults={"nid":1})
@warp
def index(nid): #函数必须有个参数接收
print(url_for('index_home'))
return f"ok{nid}"
动态参数路由
路由参数为int类型,指定int类型后,路由后只能为int类型数据
@app.route('/<int:page>',endpoint="index_home") #在路径后<inf:变量>
@warp
def index(page): #函数必须接收page变量
# print(url_for('index_home'))
return f"ok~~~~{page}"
路由参数为string类型,能接收任何数据类型.(不写默认为string类型)
@app.route('/<string:page>',endpoint="index_home") #在路径后<string:变量>
@warp
def index(page): #函数必须接收page变量
# print(url_for('index_home'))
return f"ok~~~~{page}"
多个组合使用,类似于正则匹配url
@app.route('/<string:page>_<hang>_<lie>',endpoint="index_home")#,
@warp
def index(page,hang,lie):
# print(url_for('index_home'))
return f"ok~~~~{page}页{hang}行{lie}列"
使用场景
@app.route('/<file1>/<file2>',endpoint="index_home")#,
@warp
def index(file1,file2):
path=os.path.join(file1,file2)
#path=os.path.join("img1",file2)
return send_file(path)
file1为文件夹名,file2为文件名.可以通过路径上面输入的内容访问对应的资源.
并且页可以固定file1文件夹的位置,只让用户访问该文件夹下内容
flask初始化配置
指定html模板文件
template_folder="文件夹路径"
---> app=Flask(__name__,template_folder='tempolo')
静态文件存放路径
static_folder="静态文件存放文件"
--->app=Flask(__name__,static_folder="image")
相当于修改配置文件内的static_folder
静态文件访问路径
static_url_path=""
当修改static_folder 时,static_url_path会自动修改到static的路径.
如果修改,需要改为"/static"
其他参数
static_host=None 静态文件存放服务器 --->可以是另外一台服务器
host_matching 是否严格遵循host匹配规则
instance_path 指向另外一个实例,表示两个实例很像
instance_relative_config 指向另外一个实例,表示两个实例配置一模一样
flask的对象配置
app.config={} 配置为一个字典
app.default_config 为默认配置
env:None env代表允许环境,None代表当前允许环境
debug:None 是否开0启debug模式. 开启编辑时代码重启,log打印级别最低.错误信息透传
testing:None 无限接近生成模式. 不会开启代码编辑重启,log级别教高(info).错误信息不透传
secret_key 密钥(session 的密钥)
permanent_session_lifetime session生命周期单位为秒. timedelta(days=31)即将31天变为秒
server_name 当前服务器名称(一般不要修改)
session_cookie_name 存放在浏览器cookie中session的名称.第一个字符不能是空
外部导入配置
1.在单独的一个py文件中创建一个类,类属性为一种模式的配置
2.再在该py文件中创建一个类,类属性为另一种模式的配置
3.在flask运行文件中,导入py文件中的两个类
4.在flask文件中app.config.from_object(你需要运行配置的类)
新配置文件中:
class DebugConfig: class TestConfig:
DEBUG = True TESTING = True
SECRET_KEY = "%^&*(%^&*" SECRET_KEY = "的字符串牛逼吧"
PERMANENT_SESSION_LIFETIME = 3600 PERMANENT_SESSION_LIFETIME = 30
SESSION_COOKIE_NAME = "I am Not Session" SESSION_COOKIE_NAME = "TestConfig"
OLD = "OLD" OLD = "OLDS"
BOY = "BOY" BOY = "BOYS"
EDU = "EDU" EDU = "EDUS"
PYTHON = "PYTHON" PYTHON = "PYTHONS"
FLASK = "FLASK" FLASK = "FLASKS"
flask文件中:
from setting import DebugConfig,TestConfig
app.config.from_object(DebugConfig)
蓝图
蓝图的作用 功能隔离 路由隔离 --->类似于django 中的app01
1.创建一个蓝图文件夹
2.在蓝图文件夹创建templates和static文件
3.在蓝图文件创建views
4.views中进行配置
5.在flask文件中进行蓝图的注册
view中配置:
from flask import Blueprint #导入蓝图
# blueprints
user=Blueprint('user',__name__) #创建蓝图实例
@user.route("/login") #创建蓝图视图函数
def login():
return "im zeor"
flask文件和蓝图进行注册:
在flask文件:
from flask import Flask
app =Flask(__name__)
#建立蓝图注册
from app01.views import user #导入蓝图
app.register_blueprint(user) #进行蓝图注册
if __name__ == '__main__':
app.run()
蓝图的前缀
当同一个flask下有两个蓝图时.且蓝图名相同时.在实例化蓝图时,指定蓝图前缀:
--->
user=Blueprint('app01_user',__name__,url_prefix='/index')
user=Blueprint('app02_user',__name__,url_prefix='/admin')
这时访问app01时就应该加上/index/login.访问app02时就应该加上/admin/login
蓝图的静态文件,html模板的引入.需要目录分割
user=Blueprint('app02_user',__name__,url_prefix='/index',template_folder='app01/templates',static_folder="app01/static",static_url_path="/app01/static") #创建蓝图实例
特殊的装饰器
模拟中间件
@app.before_request 请求进入视图函数之前,执行函数
def be1():
print("be1")
...
@app.after_request 请求结束返回响应之前
def af1():
print("af1")
...
正常:
be1 -> be2 -> be3 ->视图函数 ->af3 ->af2 ->af1
异常:
be1 -> be2 -> 发生异常 ->af3 ->af2 ->af1
@app.errorhandler(4xx,5xx) 错误码
@app.errorhandler(404)
def error404(ErrorMessage):
print(ErrorMessage) --->这个为原
return f"你访问的的{request.path}不存在"