创建虚拟环境
anaconda
:
conda create --name flask_dev python=<版本号>
Linux:
source activate <虚拟环境名称>
Windows:
activate <虚拟环境名称>
在虚拟环境下安装需要的包
# 在虚拟环境激活的状态命令行下直接 conda install [包名] # OR conda install -n <虚拟环境名称> [package]
关闭虚拟环境
# Linux source deactivate # Windows conda deactivate
flask如何兼容url后边带不带“/”
- flask将不带/的url重定向到了带/的url上来
flask自启动
flask内置
app.run(debug=True)
Flask 注册路由
装饰器
@app.route('/hello/') def hello(): return 'hello,fmujie'
通过核心对象
app
来装饰app.add_url_rule('/hello/', view_func=hello) #第一个参数为路由,第二个参数为绑定的视图函数
路由的注册都是使用add_url_rule
的方式来实现的,只不过flask为了方便大家使用,将add_url_rule
封装成为一个装饰器,让大家可以更优雅的实现路由的注册
def route(self, rule, **options): def decorator(f): endpoint = options.pop('endpoint', None) self.add_url_rule(rule, endpoint, f, **options) return f return decorator
app.run()
相关参数
app.run(host='0.0.0.0', debug=True, port=81)
#host='0.0.0.0'开启外网可访问、port自定义端口号
关于debug
- 推到线上可以通过设置
debug=False
来关闭调试模式, 部署原则 - 镜像关系(两份源代码相同)启用配置文件
新建
config.py
文件DEBUG = True
入口文件载入配置文件(app核心对象提供了一个方法,能够将
config.py
模块内定义的参数导入进来)app.config.from_object('config') # app对象下有一个config属性,该属性下有一个from_object()方法,使用该方法导入配置文件 # 接收的参数为 模块的路径
读取配置文件
app.run(debug=app.config['DEBUG']) # config为dict的一个子类 # !!!使用该种方法载入配置文件,大小写需注意[大写-flask规定]
生产环境
nginx
+uwsgi
nginx
作为前置服务器,用于转发浏览器的请求给uwsgiuwsgi
加载run.py
模块启动flask
的相关代码生产环境下当前
run.py
文件便不是一个入口文件了,只是被uwsgi
加载的模块文件,所以说app.run()
是根本不会去执行的。如果没有
if __name__ == '__main__':
这个判断,在生产环境下一旦加载了run.py
这个文件,app.run()
就会执行,我们已经有了uwsgi
来作为Web
服务器,在这种情况下又启用了flask
内置的Web
服务器,两个服务器是不可以的,如果有if __name__ == '__main__':
判断的话,保证了在生产环境下不会启动Flask
自带的Web
服务器。
响应对象
视图函数的return
与普通函数的return
有什么区别?
视图函数
Flask
会在背后做一系列的封装,不仅仅是一个普通函数视图函数在返回内容之外还会返回各种附加信息
status code
响应状态码content-type
放置于http
的headers
属性中@app.route('/hello') def hello(): return '<html></html>' def hell(): return 'hello,fmujie'
Flask
会给视图函数返回的内容,在headers
属性中的content-type
增添一个值,该值明确的指明了http
客户端(接收方如:浏览器)在拿到内容后以什么样的方式去解析。视图函数返回的内容永远都是以上的文本,但是如何解析这串文本,我们的服务器是需要告诉客户端。默认情况下,如果我们不指定
content-type
,那么Flask
将会把content-type
设置为一个默认值content-type = text/html
等等……
使用
Postman
查看头信息
Flask
会将字符串作为响应的主体内容,同时它会将之前说的信息封装成为一个Response
对象,本质上说视图函数返回的永远都是Response
对象。@app.route('/hello/') def hello(): headers = { 'content-type': 'text/plain' } response = make_response('<html></html>', 404) response.headers = headers return response
json
格式相同,将content-type
的值更换为application/json
即可
Flask
比较方便的返回写法@app.route('/hello/') def hello(): headers = { 'content-type': 'text/plain' } return '<html></html>', 404, headers # 实质是一个元组,Flask内部最终还是会将其变成Response对象返回
这样的返回形式是在
Flask
中使用最多的。
还不快抢沙发