- 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中启动调试TESTING
SECRET_KEY
:session机制需要这个。可使用secrets生成,import secrets; print(secrets.token_hex())
SESSION_COOKIE_DOMAIN
SERVER_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_object
from_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/hosts
C:\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