一、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()

    总结:完美解决问题,采用了以空间换取时间的方法,为每个线程保存了一块空间,使线程之间互相不受影响。

Flask&&人工智能AI --3的更多相关文章

  1. Flask&&人工智能AI -- 6 人工智能初识,百度AI,图灵机器人

    一.人工智能初识,百度AI的创建与应用 参考连接:https://www.cnblogs.com/xiao987334176/p/9620113.html 1. 百度ai开放平台 2. AipSpee ...

  2. Flask&&人工智能AI -- 8 HTML5+ 初识,HBuilder,夜神模拟器,Webview

    昨日内容回顾 1.增删改查: 增: db.collections.insert({a:1}) // 官方不推荐了 db.collections.insertMany([{a:1},{b:1}]) in ...

  3. Flask&&人工智能AI --1

    Flask初识,Response三剑客,jsonify以及send_file.Request,模板语言 Jinja2,用户登录例子,内置Sessio 一.Flask初识 首先,要看你学没学过Djang ...

  4. Flask&&人工智能AI --2

    参考博客: https://www.cnblogs.com/xiao987334176/p/9598606.html 昨日作业讲解 昨天的作业就是,有3个视图函数,分别是/login,/student ...

  5. Flask&&人工智能AI --4

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

  6. Flask&&人工智能AI -- 7 MongoDB

    MongoDB初识,增删改查操作,数据类型,$关键字以及$修改器.“$”的奇妙用法,Array Object的特殊操作,选取跳过排序,客户端操作 一.MongoDB初识 什么是MongoDB Mong ...

  7. Flask&&人工智能AI --5 Flask-session、WTForms、数据库连接池、Websocket

    未完待续.... DButils 什么是数据库连接池 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库 ...

  8. 数据挖掘(data mining),机器学习(machine learning),和人工智能(AI)的区别是什么? 数据科学(data science)和商业分析(business analytics)之间有什么关系?

    本来我以为不需要解释这个问题的,到底数据挖掘(data mining),机器学习(machine learning),和人工智能(AI)有什么区别,但是前几天因为有个学弟问我,我想了想发现我竟然也回答 ...

  9. 【转】人工智能(AI)资料大全

    这里收集的是关于人工智能(AI)的教程.书籍.视频演讲和论文. 欢迎提供更多的信息. 在线教程 麻省理工学院人工智能视频教程 – 麻省理工人工智能课程 人工智能入门 – 人工智能基础学习.Peter ...

随机推荐

  1. nginx uwsgi wsgi django 这些东西究竟是什么关系

    有太多的文章告诉我们nginx uwsgi django 这些东西怎么用了,太多的人知道这些东西的怎么使用,怎么配置,怎么优化,但是还是有一部分人比如我这种水货不知道这些东西到底是啥,为啥一个项目的发 ...

  2. javascript中eval()函数使用方法

    本教程主要重介绍eval()函数的语法与使用方法,及在后面我还补充了eval()解析json数据的相关例子,希望文章能帮助到各位深入理解eval()使用方法吧.   前几天说到js中尽量不要使用eva ...

  3. 冷备手工完全恢复(recover database,recover tablespace,recover datafile)

    冷备手工完全恢复 1.   手工完全恢复三种级别: recover database: 所有或大部分datafile丢失,一般是在mount状态完成.recover tablespace:    非关 ...

  4. 洛谷【P3612】[USACO17JAN]Secret Cow Code秘密奶牛码

    我对分治的理解:https://www.cnblogs.com/AKMer/p/9728574.html 题目传送门:https://www.luogu.org/problemnew/show/P36 ...

  5. bzoj 2406 矩阵 —— 有源汇上下界可行流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406 这题,首先把题目那个式子的绝对值拆成两个限制,就成了网络流的上下界: 有上下界可行流原 ...

  6. 彻底删除kafka下面的topic

    如果只是用kafka-topics.sh的delete命令删除topic,会有两种情况: 如果当前topic没有使用过即没有传输过信息:可以彻底删除 如果当前topic有使用过即有过传输过信息:并没有 ...

  7. CentOS安装配置radius服务器

    1.安装 Yum install -y freeradius freeradius-mysql freeradius-utils 2.配置 1)修改 clients.conf # vi /usr/lo ...

  8. eclipse tomcat 无法加载导入的web项目,There are no resources that can be added or removed from the server. .

    应该是项目自己的setting文件夹下的描述信息和.project文件的描述信息,不能适用于这个eclipse和tomcat. 解决方法: 1,找相同类型的工程(tomcat能引用的)2,把新建项目里 ...

  9. 【原】spring jar 下载

    作者:david_zhang@sh [转载时请以超链接形式标明文章] 链接:http://www.cnblogs.com/david-zhang-index/p/8098965.html 1.进入官网 ...

  10. hive一些思考

    Hive查询 1.hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行.其优点是学习 ...