flask请求上下文 (转)
一、flask中的CBV
对比django中的CBV,我们来看一下flask中的CBV怎么实现?

from flask import Flask, render_template, url_for, views app = Flask(__name__) class Login(views.MethodView):
def get(self):
print(url_for("my_login")) # /login
return render_template("login.html") def post(self):
return "login success" app.add_url_rule("/login", view_func=Login.as_view("my_login")) if __name__ == '__main__':
app.run(debug=True)

注意:视图类中定义了哪些方法,就可以允许哪种方式的请求,也可以通过指定参数methods=["GET","POST"],指定参数时可以在视图类中指定,也可以在add_url_rule方法中指定。
二、werkzeug + 上下文初步解读
通过查看源码,我们知道app.run() 方法其实是执行了run_simple() 方法,源码如下:

我们可以通过下面一段代码探究run_simple() 方法都做了什么?

from werkzeug.serving import run_simple
from werkzeug.wrappers import Request, Response @Request.application
def app(req):
print(req.method) # GET
print(req.path) # /
return Response('200 ok') run_simple('0.0.0.0', 5000, app)

运行代码,发现服务运行在http://0.0.0.0:5000/上,如下:

浏览器访问该网址控制台显示的网址,输出结果如上图,且页面显示返回结果'200 ok'。由此说明视图函数app执行了,再看我们之前写的代码:

from flask import Flask, ... app = Flask(__name__) ......
app.run(debug=True) # app 是flask的实例化对象

这里重点分析app.run() 都干了什么?
首先,执行app.run() 时,源码中显示执行了执行run_simple() 方法,源码中run_simple() 方法的参数是run_simple(host, port, self, **options) ,这里重点看第三个参数self,因为app是flask的实例化对象,因此self就是指flask的实例化对象app,而上例中我们知道当有请求进来的时候,执行了app(),我们知道函数加括号是执行,而对象加括号会自动执行__call__方法,也就是说app.run() 其实是监听了flask类中的__call__方法,通过解读源码我们发现__call__方法内容如下:

__call__方法中执行了wsgi_app方法,源码如下:

request_context() 方法源码如下,其中的self仍然是Flask的实例化对象app:

RequestContext是一个类,它的__init__方法源码如下:

本篇暂时解读到这里,下篇继续解读。
三、偏函数和线程安全
1、偏函数就是把前边的值传进来但是不执行
1)示例一

from functools import partial def ab(a,b):
print(a,b) # 1 5
return a+b par_ab = partial(ab, 1) # par_ab是一个新函数,接受了括号中的参数 print(par_ab)
# functools.partial(<function ab at 0x00000203FAB01E18>, 1) print(par_ab(5))
#
# par_ab(5)会执行新函数,且partial(ab, 1)中参数1会成为新函数par_ab的第一个参数,par_ab(5)中的5会成为第二个参数,新函数的函数体是ab函数

2)示例二

from functools import partial def ab(a,*args):
print(a,args)
return a par_ab = partial(ab, 1, 5, 7, 9) print(par_ab)
# functools.partial(<function ab at 0x0000020396711E18>, 1, 5, 7, 9)
# 新函数不加括号不执行

2、线程安全
1)示例一:

import time class Foo(object):
pass foo = Foo() def add(i):
foo.num = i
time.sleep(1)
print(foo.num) for i in range(20):
add(i)

总结:等待时间长
2)示例二:开启线程

import time
import threading class Foo(object):
pass
foo = Foo() def add(i):
foo.num = i
time.sleep(1)
print(foo.num, i) for i in range(20):
th = threading.Thread(target=add, args=(i,))
th.start()

总结:数据不安全
3)示例三:

import time
import threading
from threading import local class Foo(local):
pass foo = Foo() def add(i):
foo.num = i
time.sleep(1)
print(foo.num, i, threading.current_thread().ident) for i in range(20):
th = threading.Thread(target=add, args=(i,))
th.start()

总结:完美解决问题,采用了以空间换取时间的方法,为每个线程保存了一块空间,使线程之间互相不受影响。
转:https://www.cnblogs.com/li-li/p/10247054.html#autoid-2-0-0
flask请求上下文 (转)的更多相关文章
- Flask(4)- flask请求上下文源码解读、http聊天室单聊/群聊(基于gevent-websocket)
一.flask请求上下文源码解读 通过上篇源码分析,我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__call__方法返回了app的wsgi_app(en ...
- flask 请求上下文源码(转)
本篇阅读目录 一.flask请求上下文源码解读 二.http聊天室(单聊/群聊)- 基于gevent-websocket 回到顶部 转:https://www.cnblogs.com/li-li/p/ ...
- flask请求上下文
先看一个例子: #!/usr/bin/env python # -*- coding:utf-8 -*- import threading # local_values = threading.loc ...
- flask 请求上下文
一篇引用大牛的 https://www.cnblogs.com/zhaopanpan/p/9457343.html ### 线程安全 ```python# 线程不安全class Foo(object) ...
- Flask请求上下文源码讲解,简单的群聊单聊web
请求上下文流程图 群聊html代码 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- flask请求上下文源码分析
一.什么是上下文 每一段程序都有很多外部变量,只有像add这种简单的函数才是没有外部变量的,一旦你的一段程序有了外部变量,这段程序就不完整了,不能独立运行,你为了使他们能运行,就要给所有的外部变量一个 ...
- Flask请求上下文request
- python 全栈开发,Day139(websocket原理,flask之请求上下文)
昨日内容回顾 flask和django对比 flask和django本质是一样的,都是web框架. 但是django自带了一些组件,flask虽然自带的组件比较少,但是它有很多的第三方插件. 那么在什 ...
- flask的请求上下文源码解读
一.flask请求上下文源码解读 通过上篇源码分析( ---Flask中的CBV和上下文管理--- ),我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__ ...
随机推荐
- iTerm - 让你的 MAC 命令行更加丰富多彩
今天要给大家介绍一个工具: iTerm.这次我们讲的和开发技术无关,只是一个工具.但虽然是一个工具,却能让你的功力提升一个层级.下面我们就来一看究竟.每一位开发者都难免要用到命令行,从 git 版本库 ...
- 一个Windows C++的线程类实现(封装API,形成一个类,但不完善。其实可以学习一下Delphi的TThread的写法)
Thread.h #ifndef __THREAD_H__ #define __THREAD_H__ #include <string> #include <windows.h& ...
- 最简单的IdentityServer实现——项目基本结构与流程
项目结构 共分为三个组成部分: IdentityServer:用于登录.身份认证与授权 Api:提供获得授权后调用的各接口 Client(客户端,控制台):访问IdentityServer授权,再访问 ...
- [WPF]获取控件间的相对位置
原文:[WPF]获取控件间的相对位置 [WPF]获取控件间的相对位置 周银辉 我们知道WPF有着比较灵活的布局方式,关于某个控件的坐标,Canv ...
- jvm常用参数设置 专题
在jdk8中 -Xms2g不合法,能通过的:-Xms2G #!/bin/bash JAVA_OPTS="-Xms4G -Xmx4G -XX:+HeapDumpOnOutOfMemoryErr ...
- WPF TreeView HierarchicalDataTemplate
原文 WPF TreeView HierarchicalDataTemplate HierarchicalDataTemplate 的DataType是本层的绑定,而ItemsSource是绑定下层的 ...
- mingw 构建 mysql-connector-c-6.1.9记录(26种不同的编译错误,甚至做了一个windows系统返回错误码与System V错误码的一个对照表)
http://www.cnblogs.com/oloroso/p/6867162.html
- Win10《芒果TV》跨年邀你嗨唱,同步直播《湖南卫视2017-2018跨年演唱会》
由天天兄弟.快本家族联袂主持,不容错过的年度盛典<湖南卫视2017-2018跨年演唱会>将于2017年12月31日19:30起由芒果TV同步直播,果妈备上礼物邀您一起跨年嗨唱. 跨年邀你嗨 ...
- 利用docker在window7下安装TensorFlow
安装过程下碰了不少坑,记录一下安装过程,方便以后有需要时复用. 1.安装docker 下载最新版本的docker并且默认安装即可,安装后打开Docker Quickstart Terminal,初次进 ...
- msys2 安装笔记(可以按照这个关键字搜索)
以前一直在用 msys,最近发现还有个 msys2,并且msys2 配套的编译器是MinGW-w64. 就试着用了用,感觉还不错,这里把安装过程记录一下. 简单的说,MSYS2 是MSYS的一个升级版 ...