tanyjin 2019-06-20
几天前和同事一起喝酒,大家谈到为什么开始读书这件事。这里所说的读书不是专业的书籍,而是一些闲书。结果发现原来我们开始读书的原因很功利。都是因为生活中遇到了困惑,希望在书中找到答案。
人就是这样,即便在书中找不到答案。在看书的过程中发现,这个世界上居然有很多人是和我一样的。我解决不了的问题居然困扰了很多人。当从内而外,推己及人,发现这是一个外部世界普遍的问题,而不是自己本身的能力、性格和承受能力的问题,这时就会相对轻松,至少为自己的偷懒找到了借口。按照罗胖曾经说过的“其实人大多数时候没有自己的观点,在人生某一个阶段的观点,不过是对现状的解释罢了”
当然说到这里,我自然已经过了那个功利的阶段。因为随着你读书越多、思考越多、对世界的了解越多,会发现你所面对的未知领域越来越大,而且没有边界。转而因为兴趣读书,似乎才能带来愉快的体验。
虚拟环境是Python解释器的一个私有副本,在这个环境中你可以安装私有的包,而且不会影响系统中安装的全局的解释器。
另外一个好处是,不需要管理员权限。
虚拟环境使用第三方实用工具virtualenv创建
安装方式略。使用virtualenv创建虚拟环境,虚拟名称一般为env,当然你可以选择不同的名字
#创建虚拟环境 virtualenv env #创建完成后,env目录下出现如下目录 Include/ Lib/ Scripts/ pip-selfcheck.json tcl/
激活虚拟环境(windows下)
venv\Scripts\activate
激活后,提示符变成(venv)$
#激活后就可以直接执行语句,并通过浏览器http://127.0.0.1访问 (venv)$ python hello.py
#初始化 from flask import Flask app = Flask(__name__) #路由和视图函数 @app.route('/') def index(): return '<h1>Hello World!</h1>' #启动服务器 #debug=True 启动调试模式 #如果我们想要其他人访问,可以使用app.run(host=0.0.0.0.0,debug=True) if __name__ == '__main__': app.run(debug=True)
flask类的构造只有一个必须指定的参数,即程序主模块或包的名字。在大多数程序中,Python的__name__变量就是所需的值。
处理URL和函数之间关系的程序称为路由。
在Flask程序中定义路由最简便的方式,是使用程序实例提供的app.route修饰器。
紧随修饰器之后的函数,我们称之为视图函数[index()]。
Flask从客户端收到请求时,要让视图函数能够访问一些对象,这样才能处理请求。
那么要想让视图函数能够访问对象,一个显而易见的方法是将其作为参数传入视图函数。
如你所想,这样会导致每个视图函数都要增加一个参数。并且考虑到,如果视图函数还需要访问其他对象,那么情况可能更糟。所以,Flask使用上下文临时的把某些对象变为全局可访问。
from flask import request @app.route('/') def index(): user_agent= request.headers.get('User-Agent') return '<p>Your browser is %s</p>' % user-agent
Flask上下文分为程序上下文和请求上下文
Flask在分发请求之前激活程序和请求上下文,请求处理结束后再将其删除。
程序上下文被推送之后,就可以在线程中使用current_app 和 g 变量
请求上下文被推送后,就额可以使用request和session变量。
有时在处理请求之前或之后执行代码会很有用。例如在请求开始时,我们需要创建数据库连接或认证发起请求的用户。为了避免在每个视图中都使用重复的代码,Flask提供了注册通用函数的功能。
请求钩子使用修饰器实现。Flask支持以下4中钩子
before_first_request: 注册是一个函数,在处理第一个请求之前运行
before_request : 注册一个函数,在每次请求之前运行
after_request: 注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
teardown_request:注册一个函数,即使有未被处理的异常抛出,也在每次请求之后运行。
在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g
例如,before_request处理程序可以从数据库中加载已登录用户,并将其保存到g.user中。
随后调用视图函数时,视图函数在使用g.user获取用户。