Flask web的环境、网络与上下文

Flask

环境配置

使用pipenv包来创建flask的虚拟运行环境和实现包管理。在虚拟运行环境中,扩展和包的安装与python全局的环境隔开,避免多个项目之间包依赖出现问题,同时方便包管理和项目的移植。

flask虚拟环境的配置命令:

$ pip install pipenv
# `cd `进入项目根目录
$ pipenv install	# 创建虚拟环境 
$ pipenv shell	# 激活虚拟环境子shell
# 可以使用`$ piprnv run `执行每一条命令而不用激活子shell
$ pipenv install flask	# 安装flask
$ pipenv update flask # 升级库
$ pipenv install python_dotenv 	# 自动加载配置文件
$ pipenv install watchdog --dev	# 提高开发过程中重载的准确性和效率 
# --dev选项用于声明包为开发依赖 pipenv区别处理
# 复现运行环境时也需要使用额外的`--dev`来安装包
$ flask run	# 启动

设置运行环境配置文件:

# .env
SECRET_KEY = temp	# 开发环境下使用固定的字符串便于调试 生产环境应随机生成更复杂的字符串

# .flaskenv
FLASK_APP = app	# 根据项目名调整
FLASK_RUN_HOST = 127.0.0.1	# 局域网调试使用0.0.0.0
FLASK_RUN_PORT = 5000	# 端口设置
FLASK_ENV = development	# 启动模式 development会自动开启debug 生产环境下应使用production
# FLASK_DEBUG 不推荐手动设置

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对象讲道理应该是不可修改的),方便后期使用。

你可能感兴趣的:(flask,前端,网络,python,后端)