在Flask中处理请求时,应用会生成一个“请求上下文”对象.整个请求的处理过程,都会在这个上下文对象中进行.这保证了请求的处理过程不被干扰.处理请求的具体代码如下: def wsgi_app(self, environ, start_response): with self.request_context(environ): # with语句中生成一个`response`对象 ... return response(environ, start_response) 在Flask 0.9版本之前,…
请求上下文和应用上下文 请求上下文:可以简单理解为客户端与服务器之间数据交互请求的容器 请求上下文对象有:request.Session request:封装了HTTP请求的内容,针对的是http的请求 Session:用来记录请求回话中的信息,针对的是用户的信息 应用上下文:应用于存储应用程序中的变量,它的作用主要是帮助request获取当前的应用,它 是伴随request而生,随request而死 应用上下文对象有:current_app.g current_app存储的变量: 应用程序启动…
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__getitem__系列. __call__ 这个方法相信大家并不陌生,在单例模式中,我们可能用到过,除此之外,还想就没有在什么特殊场景中用到了.我们往往忽视了它一个很特殊的用法:对象object+()或者类Foo()+()这种很特殊的用法.在Flask上下文管理中,入口就是使用了这种方式. __getit…
1.请求上下文和应用上下文入栈 # 将ctx入栈,但是内部也将应用上下文入栈 ctx.push() def push(self): # 获取到的 top == ctx top = _request_ctx_stack.top if top is not None and top.preserved: top.pop(top._preserved_exc) # Before we push the request context we have to ensure that there # is…
先说一下和flask没有关系的: 我们都知道线程是由进程创建出来的,CPU实际执行的也是线程,那么线程其实是没有自己独有的内存空间的,所有的线程共享进程的资源和空间,共享就会有冲突,对于多线程对同一块数据处理的冲突问题,一个办法就是加互斥锁,另一个办法就是利用threadlocal ThreadLocal   实现的思路就是给一个进程中的多个线程开辟空间来保存线程中特有的值 代码实现: 1.简单示例: import threading # 实例化对象 local_values = threadi…
请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子. 请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子: before_first_request:在处理第一个请求前执行 before_request:在每次请求前执行,在该装饰函数中,一旦return,视图函数不再…
模板中特有的变量和函数 你可以在自己的模板中访问一些 Flask 默认内置的函数和对象 config 你可以从模板中直接访问Flask当前的config对象: {{config.SQLALCHEMY_DATABASE_URI}} sqlite:///database.db request 就是flask中代表当前请求的request对象: {{request.url}} http://127.0.0.1 session 为Flask的session对象 {{session.new}} True…
app上下文: 先看现象 current_app源码 手动入栈 app_context()源码 with语句入栈 request上下文 不在app上下文中 即使手动入栈也会报错,不在请求上下文中 url_for()源码 手动推入请求上下文 应用上下文和请求上下文都是存放到一个LocalStack的栈中的,和应用app相关的操作就必须用到请求上下文,比如用url_for反转视图函数1.在视图函数中,不用担心上下文的问题,因为视图函数要执行,那么肯定是通过访问url方式来执行,这种情况下,flask…
  Flask零基础到项目实战(七)请求方法.g对象和钩子函数 一.get方法 二.post方法 post请求在模板中要注意几点: input标签中,要写name来标识这个value的key,方便后台获取. 在写form表单的时候,要指定method='post',并且要指定action='/login/'. 示例代码: <form action="{{ url_for('login') }}" method="post"> <table>…
4种上下文变量 承接上一篇内容.当一个请求到来时,除了request被封装成全局变量之外,还有三个变量也是同样被封装成全局变量,那就是current_app.g.session.上面4个变量之所以能够使用,是因为程序上下文生效了. 上下文这个概念非常常见,比如在进程切换时时会保存当前进程的上下文,恢复活动进程的上下文.我见过对上下文对通透的解释就是说所谓上下文就是运行环境,恢复上下文就是恢复运行环境. 在Flask中有两种上下文:程序上下文和请求上下文.当一个请求到来时,Flask会激活这两种上…