Flask【第十一章】:Flask中的CBV以及偏函数+线程安全
Flask中的CBV以及偏函数+线程安全
一、Flask中的CBV
之前我们是用视图函数,Flask也有视图类,就像Django一样。看一看试图类怎么使用。
步骤:
1.先导入我们的flask模块,以及之后我们所需要的模块
from flask import Flask from flask import views,render_template
2.创建一个Flask实例
app = Flask(__name__,template_folder="templates")
3.创建一个视图类
class Login(views.MethodView): methods = ["GET","POST"] decorators = ["be1","app.route"] def get(self): return render_template("login.html") def post(self): return "This is a post"
注意:methods以及一些配置可以当做字段写在视图类中,也可以写在app的路由设置中
4.创建url路由,注意一些配置,比如methods等等,可以在这里面进行配置,类似视图函数一样设置。
注意:默认当没有定义methods时,视图类中所有的函数比如get、post,只要存在就都可以访问,如果设置了methods,那么就只能允许methods中的请求访问。
app.add_url_rule("/",view_func=Login.as_view("my_login"))
5.启动app
if __name__ == "__main__": app.run(debug=True)
看一下完整的代码:
1.目录结构:
2.f1.py内容:
from flask import Flask from flask import views,render_template app = Flask(__name__,template_folder="templates") class Login(views.MethodView): methods = ["GET","POST"] decorators = ["be1","app.route"] def get(self): return render_template("login.html") def post(self): return "This is a post" app.add_url_rule("/",view_func=Login.as_view("my_login")) if __name__ == "__main__": app.run(debug=True)
3.login.html代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> 用户名:<input type="text" name="user"> 密码:<input type="password" name="pwd"> <input type="submit" value="登录"> </form> </body> </html>
4.访问浏览器
点击登录后:
二、偏函数+线程安全
1.偏函数
看一个例子:
def ab(a,b): return a+b print(ab(1,2)) ##结果为3
from functools import partial def ab(a,b): return a+b par_ab = partial(ab,5) print(par_ab(6)) #结果是11
看出来了吗,下面的那个例子就是偏函数的例子。引用了functools模块中的partial
解释:将5传值给a,然后在把ab函数赋给par_ab,这是par_ab(6)实际就是ab(5,6),所以等于11.这就是偏函数。
2.线程安全
看一个例子:我想要1秒内同时执行多多个任务
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()
结果:
D:\python3.6.6\python3.exe E:/python/Flasktest/flask1/f1.py 19 0 19 5 19 3 19 6 19 8 19 2 19 1 19 7 19 14 19 4 19 9 19 12 19 10 19 15 19 13 19 11 19 16 19 19 19 17 19 18 Process finished with exit code 0
会发现,原本应该是相对应的,结果全部都混乱了,都对应19了。这就是线程混乱。怎么解决呢,继续往下看
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) for i in range(20): th = threading.Thread(target=add,args=(i,)) th.start()
结果:
D:\python3.6.6\python3.exe E:/python/Flasktest/flask1/f1.py 2 2 0 0 4 4 3 3 1 1 6 6 7 7 10 10 9 9 11 11 12 12 14 14 5 5 18 18 8 8 13 13 16 16 17 17 15 15 19 19 Process finished with exit code 0
这回就显示正常了。这就是local所做的事情