好记性不如烂笔头系列之Flask紧张跟进（一）
创建虚拟环境anaconda：conda create --name flask_dev python=<版本号>Linux：source activate <虚拟环境名称>Windows：activate <虚拟环境名称>在虚拟环境下安装需要的包# 在虚拟环境激活的状态命令行下直接 conda install [包名] # OR conda install -n <虚拟环境名称> [package]关闭虚拟环境# Linux source deactivate # Windows conda deactivateflask如何兼容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 decoratorapp.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+uwsginginx作为前置服务器，用于转发浏览器的请求给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 ' ' 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(' ', 404) response.headers = headers return responsejson格式相同，将content-type的值更换为application/json即可Flask比较方便的返回写法@app.route('/hello/') def hello(): headers = { 'content-type': 'text/plain' } return ' ', 404, headers # 实质是一个元组，Flask内部最终还是会将其变成Response对象返回这样的返回形式是在Flask中使用最多的。