- WSGI入门笔记:WSGI入门
- Flask入门一:Flask入门与routing机制(wekzeug)
- Flask入门二:Flask模板与Jinja
- Flask入门三:Flask获取HTTP请求数据
- Flask入门四:Flask应用配置与routing中的subdomain
前面在了解Sessions时接触到SECRET_KEY这一个配置项目,继续看看其他相关配置项
Config
一个Flask的应用程序需要这样那样的配置。这个配置通过Flask对象的config属性来实现。
比如,要启用debug选项
1 2 3 4 | |
部分内置的配置变量:
DEBUG:在开发server中启动调试TESTINGSECRET_KEY:session机制需要这个。可使用secrets生成,import secrets; print(secrets.token_hex())SESSION_COOKIE_DOMAINSERVER_NAME:subdmain机制需要这个东西。设置后url_for可以依据app上下文生成外部url,而不需要request上下文。APPLICATION_ROOT:默认/PREFERRED_URL_SCHEME:默认http- ...
除了通过Flask对象的config属性设置。还可以直接通过Flask对象直接配置,比如
1 2 | |
或者通过环境变量设置
- powershell:
1 2 | |
- bash:
1 | |
对于DEBUG,一般命令行也可以配置:
1 | |
注意,注意:这个例子使用DEBUG举例,有一定的问题。DEBUG和其他变量相比,比较特殊。一般都需要在命令行或启动时指定,不然debuger可能不生效(尽管在config中进行了配置后,你再读取它,返回的也是设置值)。
成员函数
flask的Config还有其他成员:
from_pyfile:加载配置文件from_objectfrom_envvar:环境变量指定一配置文件路径(内部使用from_pyfile逻辑)from_file:加载其他格式,比如json、toml等。而后用from_mapping?from_mapping:from_prefixed_env:加载FLASK_开头的环境变量,并去除前缀。
我们有一个配置文件config.py(注意,大写的变量。其他变量不会导出):
1 2 | |
而后可以
1 2 | |
或
1 2 | |
开发、生产
多数程序都有不止一个配置文件。至少需要为开发和生成使用不同的配置
- 可通过环境变量指向配置文件
1 | |
- 可通过环境变量定义模式production、development,代码中针对不同模式加载不同配置
Flask建议操作:
- 在源码管控中保留一份默认配置
- 使用环境变量来切换配置
- 将代码和配置 分别推送到生产服务器
实例文件夹(Instance folder)
Flask 0.8引入了实例文件夹。实例文件夹和发布相关,不应该再源码管控内(将其加入到.gitignore中)。
在创建 Flask 应用时可以显式地提供实例文件夹的路径,定义使用 instance_path 参数:
1 | |
也可以让 Flask 自动探测实例文件夹(和模板文件夹类似),它位于:
1 2 | |
在创建 Flask 应用时可以配置instance_relative_config=True:
1 2 3 | |
这将会从instance目录下加载config2.py文件。
注意:上面的代码中config1.py继续从非实例文件夹中加载,通过from_object,与from_pyfile行为不同:
1 2 3 | |
SERVER_NAME
回归本文初衷,Flask配置中有一项,SERVER_NAME,关注它是由于它和routing中的subdomain直接相关。
Subdomain
作为本地测试,先修改hosts文件:
/etc/hostsC:\Windows\System32\Drivers\etc\hosts
1 2 3 4 5 6 | |
写一个flask程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
这样,通过浏览器访问
- mypc.local:8000 ,看到"Hello World!"
- d.mypc.local:8000,看到"Hello d!"
- e.mypc.local:8000,看到”Hello e!"
- ...
subdomain 是相对于SERVER_NAME来说的。注意,它包括端口号。
注意,一旦设置了SERVER_NAME,Flask不响应其他的地址,比如:
1 2 3 4 5 6 7 8 9 | |
如果试图通过d.mypc.local:8000访问,会收到404错误页面。
注:除了subdomain匹配,Flask还有
host_matching的机制。
url_for
手册上提到,设置SERVER_NAME后,url_for生成外部路径时将不依赖于request上下文
1 2 3 4 5 6 7 8 9 10 11 | |
小结
到目前为止,只涉及...
1 2 3 | |
这些路径在flask程序中都可以修改。
参考
- https://github.com/pallets/flask
- https://flask.palletsprojects.com
- https://flask.palletsprojects.com/en/3.0.x/config/
- https://uniwebsidad.com/libros/explore-flask/chapter-5/instance-folder