0、前言:
- Flask内置对象中,request和session都是用于前后端数据交互的技术;g就是全局对象,通过g.x的方式就可以设置全局变量x,一般g用于views视图函数中;current_app就是Flask创建的应用对象。
- template和static的位置不是固定在模板的App文件夹中的,可以改变其位置,但是修改了这两个文件夹的位置,就要在创建app时对默认配置进行修改。
1、Flask内置对象:
- request:请求对象
- session:会话对象
- g:global全局对象
- current_app:Flask应用对象,就是模板中在init当中创建的app
2、内置对象的说明:
- g:是全局对象,在某个视图函数中设置了,在其他视图函数中也可以调用,具体例子如下:
- current_app:app配置信息,app对象获取
假设使用配置好的Flask模板,在views文件中存在视图函数代码如下:
@blue.route('/')
@cache.cached(timeout=5)
def index():
time.sleep(3)
print(f'验证全局对象是否可以应用于其他视图函数:{g.a}')
print(current_app) # <Flask 'App'>
print(current_app.config) # <Config {'DEBUG': True, ...
return '这是Flask内置对象验证代码'
@blue.before_request
def before():
# Flask内置对象:request、session、g、current_app
# g:全局对象
# current_app:Flask应用对象
g.a = 'huawei'
当运行上面代码,就会发现,虽然g.a的设置和调用不在同一个视图函数中,但是依然可以调用。可以发现current_app的确可以获取到init文件中创建的app
3、在init中配置templates和static的路径的方法(模板中本来使用的是默认配置路径,这里就是讲明白这个默认配置路径从哪改)
- 配置templates和static路径是为了解决有多个app的情况,或者需要将static文件夹或templates文件夹移动到App文件夹外面的情况。
- 修改templates和static路径是在创建app时完成的,所以要在init文件中,创建app时修改templates和static路径
- 设置BASE_DIR的目的,是为了在下面代码中如果用相对路径的方法设置路径时,明确相对路径的基础路径。
- os.path.dirname(): 表示当前文件所在的文件夹目录路径
- os.path.abspath(__file __): 表示当前文件的绝对路径
templates和static在调用Flask创建app时本来就有默认配置,就是放在app文件夹里面,如果非要把这两个文件夹拿出来,那就要给他们配置路径。在上面的例子中,第18行少些了个template_folder的路径,写法和17行一样。
- 实例验证:如下图所示为改变templates文件夹和static文件夹的项目概览,这个例子意在展示如何在init中修改template和static路径,后面有需求可以借鉴该方法。
views中代码如下:
# 在views.py中放路由和视图函数
import random
import time
from flask import Blueprint, render_template, request, session, g, current_app
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件
from .exts import cache
# 蓝图(蓝图可以有多个,方便对路径进行区分)
blue = Blueprint('user', __name__)
@blue.route('/')
@cache.cached(timeout=5)
def index():
return '这是Flask验证修改static和template路径是否可行的项目'
@blue.route('/template/')
def template():
return render_template('template.html')
init中代码如下:
# __init__.py : 初始化文件,创建Flask应用
from flask import Flask
from .views import blue
from .exts import init_exts
def creat_app():
# 修改template和static路径
static_folder = 'E:\code\learn_flask\learn_10_进阶\\app1\static'
template_folder = 'E:\code\learn_flask\learn_10_进阶\\app1\\templates'
app = Flask(__name__,static_folder=static_folder,template_folder=template_folder)
# 注册蓝图(将views中的蓝图和对应app绑定,可能会存在有多个app的情况)
# 蓝图就是为了便于模块化管理和拓展应用,蓝图会给每个url加上前缀
app.register_blueprint(blueprint=blue)
# 配置数据库(配置不同数据库软件,就要用不同配置,配置的目的,就是在用到数据库的时候让项目知道找什么数据库,去哪找数据库)
db_uri = 'sqlite:///sqlite3.db'
# db_uri = 'mysql+pymysql://root:123456@localhost:3306/more_table' # mysql的配置
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 禁止对象追踪修改(为了不浪费服务器资源进行的设置)
# 初始化插件
init_exts(app=app)
return app