Flask(一)
pip install flask
依赖wsgi
flask框架是基于werkzegu的wsgi实现,flask没有自己的wsgi
用户一旦请求,就会调用app.__call__方法
flask 路由:
@app.route('/login',methods=['GET','POST'])
def login():
if request.method == "GET":
路由参数:endpoint默认为函数名
增加路由的两种方式:
@app.route('/testflask')
def index():
return render_template('testflask.html')
def login():
return render_template('login.html')
app.add_url_rule('/login','login',login)
路由源码流程:
将url和函数打包成rule对象
将url对象添加到map对象中
app.url_map = map对象
支持动态路由:
@app.route('/del/<int:nid>')
def delete(nid):
del DATA_DICT[nid]
2.获取提交的数据
request.args GET形式传递参数
request.form Post形式提交参数
返回数据
return render_template('edit.html',info=info)
return jsonify({'code':200,'data':[1,2,3]})
return redirect(url_for('idx'))
return "string"
模板处理:
{{x}}
{% for key,value in data_dict.items() %}
<tr>
<td>{{key}}</td>
<td>{{value.name}}</td>
<td>{{value.age}}</td>
<td>
<a href="/edit?nid={{key}}">编辑</a>
<a href="/del/{{key}}">删除</a>
</td>
</tr>
{% endfor %}
蓝图
装饰器:
def auth(func):
@functools.wraps(func)
def inner(*args,**kwargs):
username = session.get('xxx')
if not username:
return redirect(url_for('login'))
return func(*args,**kwargs)
return inner()
静态文件处理:
app = Flask(__name__,template_folder='templates',static_folder='static',static_url_path='/static')
<!--<img src="/static/aa.jpg"/>-->
<img src="{{url_for('static',filename='aa.jpg')}}">
配置文件:
方法一:
#settings.py 服务器配置文件
XX=123
DB_HOST = '192.168.0.1'
PORT = 3306
SECRET_KEY='hjhhdibhdi'
try:
from .localsettings import *
except ImportError:
pass
#localsettings.py
DB_HOST = '127.0.0.1'
PORT = 3306
#基于全局变量
app.config.from_object('config.settings')
方法二:基于类
class BaseSettings(object):
#放公共配置数据
PORT = 3306
class DevSettings(BaseSettings):
Host='127.0.0.1'
class ProdSettings(BaseSettings):
Host = '127.0.3.1'
视图:
FBV
CBV(返回一个view函数,闭包的应用场景)
模板:
全局模板方法两种:
@app.template_global() #{{func("tttt")}}
def func(arg):
return render_template('aa.index')
@app.template_filter()#{{"bbbb"|f1()}}
def f1(arg):
return render_template('bb.index')
特殊的装饰器:
flask上下文管理
wsgi是web服务网管接口,它是一个协议,实现它的协议有:wsgi/
栈:
后进先出,通过列表可以实现一个栈 append() pop()
class Local(object):
def __init__(self):
self.storage={}#这样写 容易递归 进入死循环
object.__setattr__(self,'storage',{})
def __setattr__(self, key, value):
self.storage[key] = value
def __getattr__(self, item):
return self.storage.get(item)
loacl = Local()
loacl.x1 = 123
print(loacl.x1)
线程的唯一标识:
import threading
from threading import get_ident
def task():
ident = get_ident()
print(ident)
for i in range(20):
t = threading.Thread(target=task)
t.start()
自定义threading local
import threading
class Local(object):
def __init__(self):
object.__setattr__(self,'storage',{})
def __setattr__(self, key, value):
ident = threading.get_ident()
if ident in self.storage:
self.storage[ident][key] = value
else:
self.storage[ident] = {key:value}
def __getattr__(self, item):
ident = threading.get_ident()
if ident not in self.storage:
return
return self.storage[ident].get(item)
local = Local()
def task(arge):
local.x = arge
print(local.x)
for i in range(20):
t = threading.Thread(target=task,args=(i,))
t.start()
'''
加强版的 Threading Local list栈
'''
import threading
class Local(object):
def __init__(self):
object.__setattr__(self, 'storage', {})
def __setattr__(self, key, value):
ident = threading.get_ident()
if ident in self.storage:
self.storage[ident][key].append(value)
else:
self.storage[ident] = {key: [value,]}
def __getattr__(self, item):
ident = threading.get_ident()
if ident not in self.storage:
return
return self.storage[ident][item][-1]
local = Local()
def task(arge):
local.x = arge
print(local.x)
for i in range(20):
t = threading.Thread(target=task, args=(i,))
t.start()
在flask中有一个Local 类,它和 threading local的功能一样,每个线程开辟一个空间,存储数据
内部实现机制:内部会维护一个字典,这个字典以线程(协程)id为key,进程数据隔离,如:
__storage__ = {
1211:{'k1':123}
}
obj = Local()
obj.k1 = 123
在flask 还有一个Localstack的类,它内部依赖Local对象,local对象负责存储数据,localstack对象用于将local的值维护成一个栈。
__storage__ = {
1211:{'stack':['k1',]}
}
obj = LocalStack()
object.push('k1')
obj.top
obj.pop()
上下文管理:
app
最新文章
- C# Lamda中类似于SQL 中的 In 功能
- selenium ide脚本回放出现element not found
- 获得触发hover事件的元素id
- mysql链接数据库时报错
- xcode arc引起的autorelease报错问题
- javascript中argument1 === void 0的意思
- Android照相机应用
- Android开发之漫漫长途 番外篇——自定义View的各种姿势2
- [Python] 练习代码
- 理解I/O:随机和顺序
- React Native桥接器初探
- 根据key删除Map集合中的key-value映射
- C#语言,求成绩平均数。
- JPA学习笔记(8)——映射一对多关联关系
- PHP服务器访问优化
- Ansible 操作windows
- LeetCode: Surrounded Regions 解题报告
- 如何修改WP文章字体格式、字号大小、字体颜色
- 转载:【Oracle 集群】RAC知识图文详细教程(一)--集群概念介绍
- 【angularJS】简介
热门文章
- Linux下自动删除过期备份和自动异地备份
- 璞华HawkEye平台助力乳品行业巨头在数字化转型中领“鲜”一步!
- ConcurrentDictionary<;T,V>; 的这两个操作不是原子性的
- Git&;GitHub 03 使用 SSH 协议
- Windows安装Jenkins详细教程(图文教程)
- ProxySQL(8):SQL语句的重写规则
- 胎压监测系统(DWS)
- frps服务端与nginx可共用443端口
- useContext 解决函数父子组件传值
- 《3-D Deep Learning Approach for Remote Sensing Image Classification》论文笔记