Flask
环境配置
使用pipenv包来创建flask的虚拟运行环境和实现包管理。在虚拟运行环境中,扩展和包的安装与python全局的环境隔开,避免多个项目之间包依赖出现问题,同时方便包管理和项目的移植。
flask虚拟环境的配置命令:
$ pip install pipenv
$ pipenv install
$ pipenv shell
$ pipenv install flask
$ pipenv update flask
$ pipenv install python_dotenv
$ pipenv install watchdog --dev
$ flask run
设置运行环境配置文件:
SECRET_KEY = temp
FLASK_APP = app
FLASK_RUN_HOST = 127.0.0.1
FLASK_RUN_PORT = 5000
FLASK_ENV = development
Flask类是什么?为什么实例化要传入__name__ 参数?
网络
对于装饰器route()和函数url_for(),今天有了更深一步的理解。route()除了将请求URL与视图函数之间建立映射、指定请求方法之外,还有着建立URL规则和简单变量转换的功能,使其有更灵活的运用。url_for()传入的参数和我之间直接传入视图函数的函数名有所差别,真正应该传入的是端点endpoint。端点应是在route()中设置的(endpoint参数设置路由的端点),其默认值是所路由的视图函数的函数名。
与url_for()密切相关的是URL,URL在这里分为相对(内部)URL和绝对URL,使用url_for()函数生成的是相对URL,不包含根URL。可以添加_external=1 参数设置生成绝对URL。这解决了我之前在设置三级目录的视图时,静态资源无法加载的问题(大作业太赶了我直接改成二级目录糊弄了)是因为这时的相对URL会生成错误,需要使用内置的静态资源端点加载文件。
在运行flask时,默认的127.0.0.1和开放到局域网的0.0.0.0有什么区别?绑定到127.0.0.1只会监听来自本地的请求,绑定到0.0.0.0是监听所有来源的请求,这个应该是cidr的网段和ip匹配。
session是特殊的Cookie,在传输过程中会被加密,且带有数字签名,常用于验证用户身份,有防篡改的作用。
上下文
对全局变量g的疑惑:g在每一次请求中被视图函数设置了,那而后请求是另一个用户发来的,这个用户是会得到有前一个用户g的数据吗,如果不会,flask又是如何分辨不同用户之间的g呢(一个请求,不同用户,g如何处理?)?这一个请求中的g,在这个用户进入其他视图函数,是否仍然起作用(不同请求,一个用户,g如何处理?)?
需要注意的是,Flask在处理请求的时候后单独为每一个请求开一个线程,线程之间没有影响(本地线程thread local技术)。每个请求中包含有程序上下文和请求上下文,这两个上下文在线程内是全局作用的。在请求处理完成,return之后,线程会被关闭,自然上下文也被销毁。这就可以回答上述问题了:
对于一个请求,不同用户的情况,其实我的描述有问题,应该是来自不同用户的同一个动作(请求同一资源)的不同请求。这些请求虽然请求的是同一个东西,但他们之间并没有什么关系,每一次请求是新开一个线程,用完即焚。对于不同请求,一个用户的情况,需要理解所谓的全局是指在线程内全局,不管是不是一个用户、一个ip,都不会有影响。
那又有问题了,g这个全局变量只能在线程内使用,有什么作用呢?一般来说结合请求钩子使用,结合我大作业的业务场景具体来看,基本上每一个页面都会使用到用户信息,我不得不在每个视图函数内重复数据库查询动作,冗余性高,可维护性低。我又不能将数据库查出来的数据保存在session中,容易造成数据不一致的情况,而且不安全,浪费带宽。将请求钩子和全局变量g结合,在请求到来时就统一进行数据库查询,查询的数据保存到g中(request对象讲道理应该是不可修改的),方便后期使用。
|