一、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请求上下文 (转)的更多相关文章

  1. Flask(4)- flask请求上下文源码解读、http聊天室单聊/群聊(基于gevent-websocket)

    一.flask请求上下文源码解读 通过上篇源码分析,我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__call__方法返回了app的wsgi_app(en ...

  2. flask 请求上下文源码(转)

    本篇阅读目录 一.flask请求上下文源码解读 二.http聊天室(单聊/群聊)- 基于gevent-websocket 回到顶部 转:https://www.cnblogs.com/li-li/p/ ...

  3. flask请求上下文

    先看一个例子: #!/usr/bin/env python # -*- coding:utf-8 -*- import threading # local_values = threading.loc ...

  4. flask 请求上下文

    一篇引用大牛的 https://www.cnblogs.com/zhaopanpan/p/9457343.html ### 线程安全 ```python# 线程不安全class Foo(object) ...

  5. Flask请求上下文源码讲解,简单的群聊单聊web

    请求上下文流程图 群聊html代码 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  6. flask请求上下文源码分析

    一.什么是上下文 每一段程序都有很多外部变量,只有像add这种简单的函数才是没有外部变量的,一旦你的一段程序有了外部变量,这段程序就不完整了,不能独立运行,你为了使他们能运行,就要给所有的外部变量一个 ...

  7. Flask请求上下文request

  8. python 全栈开发,Day139(websocket原理,flask之请求上下文)

    昨日内容回顾 flask和django对比 flask和django本质是一样的,都是web框架. 但是django自带了一些组件,flask虽然自带的组件比较少,但是它有很多的第三方插件. 那么在什 ...

  9. flask的请求上下文源码解读

    一.flask请求上下文源码解读 通过上篇源码分析( ---Flask中的CBV和上下文管理--- ),我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__ ...

随机推荐

  1. WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参

    原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参 ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataC ...

  2. JAVASCRIPT高程笔记-------JSON与AJAX

    json对象——语法 简单值:与JS相同语法,可以是字符串,数值,布尔值,null:但不支持undefined 对象: 复杂数据类型,表示一组有序的键值对,键值对的值可以是简单数据,也可以是复杂数据 ...

  3. WPF TreeView绑定xaml的写法

    方法一 <Window x:Class="TreeViewDemo.MainWindow" xmlns="http://schemas.microsoft.com/ ...

  4. DOM解析xml实现读、写、增、删、改

    qt提供了三种方式解析xml,不过如果想实现对xml文件进行增.删.改等操作,还是DOM方式最方便. 项目配置 pro文件里面添加QT+=xml include <QtXml>,也可以in ...

  5. 从PRISM开始学WPF(番外)共享上下文 RegionContext?

    原文:从PRISM开始学WPF(番外)共享上下文 RegionContext? RegionContext共享上下文 There are a lot of scenarios where you mi ...

  6. 图像处理中的跨度(stride)

    原文:图像处理中的跨度(stride) 使用C#的BitmapData 最近要转开发平台,正研究C#.C#好是好,不过处理图片时一个像素一个像素的操作像素不是一般的慢.其实Delphi也一样,但好在D ...

  7. 零元学Expression Blend 4 - Chapter 5 2.5D转换的使用技巧

    原文:零元学Expression Blend 4 - Chapter 5 2.5D转换的使用技巧 本章将延续上篇零元学Expression Blend4 - Chapter 4元件重复运用的观念所制作 ...

  8. 【UWP开发】uwp应用安装失败

    原文:[UWP开发]uwp应用安装失败 编译出了uwp应用.appx之后双击打开,报错你需要为此应用包而安装的新证书,或者是带有受信任证书的新应用包.系统管理员或应用开发人员可以提供帮助.证书链在不受 ...

  9. 毕设(五)ListView

    ListView 控件可使用四种不同视图显示项目.通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本. 可使用 ListView 控件将称作 ListItem 对象的列表条目组织成 ...

  10. qt 自动重启(两种方法)

    所谓自动重启就是程序自动关闭后在重新打开: 一般一个qt程序main函数如下: int main(int argc, char* argv[]) { QApplication app(argc, ar ...