一.使用配置的三种方式
1.第一种
- app的配置文件全在config字典中,但是有一些常用的,比如debug,会直接提到app这一层
from flask import Flask
app = Flask(__name__)
# 1.直接使用app对象的debug属性
app.debug = True
# 2.(也可以这种)app对象的config属性:flask.config.Config对象,存放flask的默认配置
app.config['DEBUG'] = True
flask中的配置文件是一个flask.config.Config对象(继承字典)
{
'DEBUG': False, # 是否开启Debug模式
'TESTING': False, # 是否开启测试模式
'PROPAGATE_EXCEPTIONS': None, # 异常传播(是否在控制台打印LOG) 当Debug或者testing开启后,自动为True
'PRESERVE_CONTEXT_ON_EXCEPTION': None, # 一两句话说不清楚,一般不用它
'SECRET_KEY': None, # 之前遇到过,在启用Session的时候,一定要有它
'PERMANENT_SESSION_LIFETIME': 31, # days , Session的生命周期(天)默认31天
'USE_X_SENDFILE': False, # 是否弃用 x_sendfile
'LOGGER_NAME': None, # 日志记录器的名称
'LOGGER_HANDLER_POLICY': 'always',
'SERVER_NAME': None, # 服务访问域名
'APPLICATION_ROOT': None, # 项目的完整路径
'SESSION_COOKIE_NAME': 'session', # 在cookies中存放session加密字符串的名字
'SESSION_COOKIE_DOMAIN': None, # 在哪个域名下会产生session记录在cookies中
'SESSION_COOKIE_PATH': None, # cookies的路径
'SESSION_COOKIE_HTTPONLY': True, # 控制 cookie 是否应被设置 httponly 的标志,
'SESSION_COOKIE_SECURE': False, # 控制 cookie 是否应被设置安全标志
'SESSION_REFRESH_EACH_REQUEST': True, # 这个标志控制永久会话如何刷新
'MAX_CONTENT_LENGTH': None, # 如果设置为字节数, Flask 会拒绝内容长度大于此值的请求进入,并返回一个 413 状态码
'SEND_FILE_MAX_AGE_DEFAULT': 12, # hours 默认缓存控制的最大期限
'TRAP_BAD_REQUEST_ERRORS': False, # 如果这个值被设置为 True ,Flask不会执行 HTTP 异常的错误处理,而是像对待其它异常一样, 通过异常栈让它冒泡地抛出。这对于需要找出 HTTP 异常源头的可怕调试情形是有用的。
'TRAP_HTTP_EXCEPTIONS': False, # Werkzeug 处理请求中的特定数据的内部数据结构会抛出同样也是“错误的请求”异常的特殊的 key errors 。同样地,为了保持一致,许多操作可以显式地抛出 BadRequest 异常。因为在调试中,你希望准确地找出异常的原因,这个设置用于在这些情形下调试。
'EXPLAIN_TEMPLATE_LOADING': False, # 如果这个值被设置为 True ,你只会得到常规的回溯。
'PREFERRED_URL_SCHEME': 'http', # 生成URL的时候如果没有可用的 URL 模式话将使用这个值
'JSON_AS_ASCII': True, # 默认情况下 Flask 使用 ascii 编码来序列化对象。如果这个值被设置为 False , Flask不会将其编码为 ASCII,并且按原样输出,返回它的 unicode 字符串。
'JSON_SORT_KEYS': True, # 比如 jsonfiy 会自动地采用 utf-8 来编码它然后才进行传输。
'JSONIFY_PRETTYPRINT_REGULAR': True, # 默认情况下 Flask 按照 JSON 对象的键的顺序来序来序列化它。
'JSONIFY_MIMETYPE': 'application/json', # 这样做是为了确保键的顺序不会受到字典的哈希种子的影响,从而返回的值每次都是一致的,不会造成无用的额外 HTTP 缓存。
'TEMPLATES_AUTO_RELOAD': None, # 你可以通过修改这个配置的值来覆盖默认的操作。但这是不被推荐的做法因为这个默认的行为可能会给你在性能的代价上带来改善。
}
2.第二种
app.config.from_pyfile("settings.py") # 配置文件与当前文件处于同一级
DEBUG = True
3.第三种
app.config.from_object("settings.TestingConfig")
# 可以配置不同环境下使用不同的配置参数
class Config(object):
DEBUG = False
TESTING = False
DATABASE_URI = 'sqlite://:memory:'
# 生产环境
class ProductionConfig(Config):
DATABASE_URI = 'mysql://user@localhost/foo'
# 开发环境
class DevelopmentConfig(Config):
DEBUG = True
# 测试环境
class TestingConfig(Config):
TESTING = True
4.其他配置
# 提示: 从sys.path中已经存在路径开始写
# 提示: settings.py文件默认路径要放在程序root_path目录,如果instance_relative_config为True,则就是instance_path目录(Flask对象init方法的参数)
# 通过环境变量配置: 环境变量的值为python文件名称名称,内部调用from_pyfile方法
app.config.from_envvar("环境变量名称")
#app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS'])
# JSON文件名称,必须是json格式,因为内部会执行json.loads
app.config.from_json("json文件名称")
# 字典格式
app.config.from_mapping({'DEBUG': True})
二.Flask路由及书写的两种方式
1.路由作用于基本定义
- 使用路由匹配规则与前端访问的路径对比, 触发视图的执行
- 路由和视图的名称必须全局唯一, 不能出现重复,否则报错
# 指定访问的路径为 "/index"
@app.route(rule='/index')
def index():
return 'Hello Word!'
2.路由参数介绍
- 查看 "route( )" 方法源码介绍可以知道其本质就是 "add_url_rule( )"
- add_url_rule( ) 内参数介绍:
rule='/index' # 符合URL规则的路由
view_func=index # 视图函数名称
defaults=None # 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'}可以为函数提供默认参数
endpoint=None # 名称,用于反向解析生成URL,即: url_for('名称')
methods=None # 允许的请求方式,如:["GET", "post"] 大小写都可以, 内部会执行upper()
strict_slashes=None # 对URL最后的 / 符号是否严格要求, 默认严格. False就是不严格
redirect_to = None # 重定向到指定地址
subdomain = None # 子域名访问
# 非严格模式
@app.route('/index', strict_slashes=False)
# 访问 http://www.xx.com/index/ 或 http://www.xx.com/index 的路由格式都可以
# 严格模式
@app.route('/index', strict_slashes=True)
# 仅支持这种路由格式访问: http://www.xx.com/index
@app.route('/index/<int:nid>', redirect_to='/home/<nid>')
# 只要访问"index"页面就会跳转到"home"页面
@app.route("/dynamic", subdomain="<username>")
# 可以传入任意的字符串,如传入的字符串为aa,显示为 aa.xxxx.com
# 传入bbbb : bbbb.xxxx.com
# 传入cccc : cccc.xxxx.com
3.装饰器写法
- 装饰器的执行过程 : 将装饰器下方的被装饰函数的内存地址传给装饰器函数执行,得到结果,将结果赋值给被装饰器函数,完成偷梁换柱
from flask import Flask
app = Flask(__name__)
app.debug = True
@app.route(rule='/',endpoint='index'strict_slashes=False,methods=["post","GEt"])
def index():
return 'Hello Word!'
if __name__ == '__main__':
app.run()
4.app.add_url_rule( )
写法
def index():
return 'Hello Word!'
app.add_url_rule(rule='/', view_func=index, endpoint='index')
# 类比Django中的urls.py文件中的路由匹配
# path('/',view.IndexView,name='index')
if __name__ == '__main__':
app.run()
三.url_for( ) 的使用
1.url_for( ) 的作用
- 利用视图函数的名字动态的获取访问该视图函数的路由
- 一般视图函数名不会随意变化, 而视图访问的路由可能频繁变化, 如果是大项目手动去修改url就不方便了
- 使用
url_for( )
方法动态获取路由就很好的解决了这种问题
2.使用示例
from flask import Flask, url_for
app = Flask(__name__)
app.debug = True
@app.route('/index')
def index():
url = url_for('login')
print(url) # /login
return url
@app.route('/login')
def login():
return 'hahah'
if __name__ == '__main__':
app.run()