Flask记录-基本知识 2019-08-13 技术,Python 暂无评论 16147 次阅读 # Flask记录-基本知识 ## 程序实例 获取flask的程序实例,需要实例化Flask类,Flask类可以从flask包中导入 使用代码表示即: ```python from flask import Flask app = Flask(__name__) ``` 传入Flask类的构造方法的第一个参数是**模块**或**包**的名称,我们应该使用特殊变量__name__来表示。 __name__是一个系统定义的变量,它会根据所处的模块来命名,表示当前模块的名称(例如在app.py中它的值为app) ### 自动发现程序实例 在启动flask之前,我们一般需要提供程序实例所在的模块位置(set FLASK_APP = '包含实例的模块名'),如果不提供的话,flask会自动探测程序实例,有以下规则: - 从当前目录里面找app.py和wsgi.py模块,并从中寻找名为app或者application的程序实例 - 从环境变量FLASK_APP对应的模块名/导入路径寻找名为app或application的程序实例 - 如果安装了python-dotenv,那么flask会自动从.flaskenv文件和.env文件中加载环境变量 - .flaskenv用来存储和Flask相关的公开环境变量,例如Flask_APP - .env用来存储包含敏感信息的环境变量 - 在.flaskenv和.env文件中,环境变量使用键值对的形式来定义,每行一个 - 安装了python-dotenv时,Flask加载环境变量的优先级是:手动设置的环境变量——>.env中设置的环境变量——>.flaskenv设置的环境变量 这里有个地方需要注意: 在使用**PowerShell**设置和启动Flask时,明明已经设置了FLASK_APP但还是有可能会报这个错: ``` Error: Could not locate flask application. You did not provide the FLASK_APP environment variable" ``` 经过查询,可以这样[解决](https://stackoverflow.com/questions/37826016/env-variables-not-set-while-running-minimal-flask-application): ``` 用 $env:FLASK_APP = "run.py" 代替 set FLASK_APP = run.py ``` 或者直接使用cmd来设置和启动Flask ## 注册路由 - 定义URL - 建立处理请求的函数 - 关联URL和函数 ```python @app.route('/') def index(): return 'Hello,Flask!' ``` 上面的代码就定义了根地址"/"和index()处理函数,并使用app.route()装饰器将两者关联起来 以域名:www.xuwushijie.com为例,"/"代表的是根地址,即域名本身,而假如定一个名为"/lalalala"的URL,它代表的是:wwww.xuwushijie.com/lalalala **注意:URL规则使用字符串表示,且必须以"/"开始** ## 为视图绑定多个URL 在处理函数上方使用route()装饰器定义多个URL即可,例如 ```python @app.route('/hello') @app.route('/') def index(): return 'Hello,Flask!' ``` 这样访问_www.xuwushijie.com或者_www.xuwushijie.com/hello 都会触发index()处理函数域名 ## 绑定动态URL 在URL规则中添加变量,使其变成动态URL,例如 ```python @app.route('/hello/') def index(name): return 'Hello,Flask! by %s'% name ``` 注意:Flask在匹配URL失败后(例如输入_www.xuwushijie.com/hello,并没有在其后添加任何参数),会返回一个404错误。因此我们可以使用defaults参数设置URL变量的默认值,来避免出现这样的报错。例如: ```python @app.route('/hello', defaults={'name':'MyName'}) @app.route('/hello/') def index(name): return 'Hello,Flask! by %s'% name ``` 本质其实是为变量name设置一个默认值,等同于 ```python @app.route('/hello') @app.route('/hello/') def index(name='MyName'): return 'Hello,Flask! by %s'% name ``` ## URL与端点 这个设计类似于宏定义,它让我们在修改部分URL的时候不需要像以硬编码方式写URL那样一个个找出来再改 Flask提供了url_for()函数获取URL,以下面例子来说 ```python @app.route('/') def index(): return 'Hello Flask!' ``` 这个路由的端点即视图函数的名称index,调用url_for('index')即可获取对应的URL,即"/" 如果URL含有动态部分,那么只需要在url_for()函数里传入相应的参数,在下面的视图函数中: ```python @app.route('/hello/') def greet(name): return 'Hello %s!' % name ``` url_for('greet',name='Jack')得到的URL为"/hello/Jack" 一般来说,url_for()函数生成的URL是相对URL,如果想要生成一个完整的URL,可以将_external参数设为True 标签: Flask 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭