Flask&&人工智能AI --3
一、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的更多相关文章
- Flask&&人工智能AI -- 6 人工智能初识,百度AI,图灵机器人
一.人工智能初识,百度AI的创建与应用 参考连接:https://www.cnblogs.com/xiao987334176/p/9620113.html 1. 百度ai开放平台 2. AipSpee ...
- Flask&&人工智能AI -- 8 HTML5+ 初识,HBuilder,夜神模拟器,Webview
昨日内容回顾 1.增删改查: 增: db.collections.insert({a:1}) // 官方不推荐了 db.collections.insertMany([{a:1},{b:1}]) in ...
- Flask&&人工智能AI --1
Flask初识,Response三剑客,jsonify以及send_file.Request,模板语言 Jinja2,用户登录例子,内置Sessio 一.Flask初识 首先,要看你学没学过Djang ...
- Flask&&人工智能AI --2
参考博客: https://www.cnblogs.com/xiao987334176/p/9598606.html 昨日作业讲解 昨天的作业就是,有3个视图函数,分别是/login,/student ...
- Flask&&人工智能AI --4
一.flask请求上下文源码解读 通过上篇源码分析,我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__call__方法返回了app的wsgi_app(en ...
- Flask&&人工智能AI -- 7 MongoDB
MongoDB初识,增删改查操作,数据类型,$关键字以及$修改器.“$”的奇妙用法,Array Object的特殊操作,选取跳过排序,客户端操作 一.MongoDB初识 什么是MongoDB Mong ...
- Flask&&人工智能AI --5 Flask-session、WTForms、数据库连接池、Websocket
未完待续.... DButils 什么是数据库连接池 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库 ...
- 数据挖掘(data mining),机器学习(machine learning),和人工智能(AI)的区别是什么? 数据科学(data science)和商业分析(business analytics)之间有什么关系?
本来我以为不需要解释这个问题的,到底数据挖掘(data mining),机器学习(machine learning),和人工智能(AI)有什么区别,但是前几天因为有个学弟问我,我想了想发现我竟然也回答 ...
- 【转】人工智能(AI)资料大全
这里收集的是关于人工智能(AI)的教程.书籍.视频演讲和论文. 欢迎提供更多的信息. 在线教程 麻省理工学院人工智能视频教程 – 麻省理工人工智能课程 人工智能入门 – 人工智能基础学习.Peter ...
随机推荐
- hdu 5269 ZYB loves Xor I 分治 || Trie
题目大意: 长度为\(n\)的数组A.求对于所有数对\((i,j)(i \in [1,n],j \in [1,n])\),\(lowbit(A_i xor A_j)\)之和.答案对998244353取 ...
- Unity3d中SendMessage 用法
Message相关有3条指令:SendMessage ("函数名",参数,SendMessageOptions) //GameObject自身的ScriptBroadcastM ...
- Azure blob Storage Snapshot
用户虚拟机硬盘的备份是客户在部署云应用中是一个非常重要的部分. 目前有多种平台的备份方法: 捕获镜像:可以采用Capture的方式(powershell命令为Save-AzureVMImage)捕获虚 ...
- c++17 filesystem, regex 遍历目录
linux 遍历目录+文件(优化版本) c++17 FS 还是挺好用的, VS2017支持,但是linux g++7.3 还是不支持 filesystem #include<filesystem ...
- oracle--循环PL/SQL--demo1---
--简单的条件判断if–then --编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该员工工资增加10%. create or replace procedure sp_pro6 ...
- jquery插件开发常用总结一
由于使用jquery插件后当form表单提交的时候,若发生错误,同时有验证错误文本时,即使用rules和message后,会自动生成一个label标签里面装有错误文件值. 我们可以替换它: 方式为:v ...
- 创建sharepoint网站
1.首先打开管理中心 输入用户名和密码(默认是本机的管理员名称及密码) 在“应用程序管理”选择“管理WEB应用程序” 新建应用程序 选择一个没有占用的端口,选择允许匿名访问 数据库名称一般为WSS_C ...
- [xdoj1158]阶乘求逆元(常用于求组合数)
http://acm.xidian.edu.cn/problem.php?id=1158 解题关键:此题注意将$\sum\limits_{i = 0}^x {C_x^iC_y^{i + k}}$转化为 ...
- 业务逻辑:完成基于CRM地址完全匹配的自动分单业务逻辑
思路: 后台系统的业务接口服务处理接收到的数据并使用Webservice技术来远程调用CRM系统的业务接口服务来进行定区的查询操作,随后从该定区中匹配一个快递员来分配工单并发送短信通知取件 操作步骤: ...
- nginx manager
====================================================@echo offrem 当前bat的作用 echo ==================beg ...