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
Flask(一)的更多相关文章
- flask+sqlite3+echarts2+ajax数据可视化
前提: 准备Python + Flask+Sqlite3的平台环境(windows系统) 前面一节介绍flask怎么安装了,剩下sqlite3下载后解压,然后环境变量添加解压路径就行了 附加下载地址: ...
- flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法
flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...
- Windows下快速安装Flask的一次经历
前提: 1.已安装python版本(一般都是2.X) 2.已安装easy_install python安装,记得配置Python的环境变量,例如:我的直接在Path上加 G:\Python 验证安装P ...
- 使用Flask设计带认证token的RESTful API接口[翻译]
上一篇文章, 使用python的Flask实现一个RESTful API服务器端 简单地演示了Flask实的现的api服务器,里面提到了因为无状态的原则,没有session cookies,如果访问 ...
- 使用python的Flask实现一个RESTful API服务器端[翻译]
最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务 ...
- python flask (一)
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World ...
- flask源码分析
本flask源码分析不间断更新 而且我分析的源码全是我个人觉得是很beautiful的 1 flask-login 1.1 flask.ext.login.login_required(func),下 ...
- Python flask 基于 Flask 提供 RESTful Web 服务
转载自 http://python.jobbole.com/87118/ 什么是 REST REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转 ...
- Python flask @app.route
转载自 http://python.jobbole.com/80956/ 下面是Flask主页给我们的第一个例子,我们现在就由它入手,深入理解“@app.route()”是如何工作的. ...
- Flask 框架入门
Flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 安装 Flask 依赖两个外部库, We ...
随机推荐
- 大数据Hadoop平台安装及Linux操作系统环境配置
配置 Linux 系统基础环境 查看服务器的IP地址 设置服务器的主机名称 hostnamectl set-hostname hadoop hostname可查看 绑定主机名与IP 地址 vim /e ...
- 【读书笔记】C#高级编程 第二十五章 事务处理
(一)简介 事务的主要特征是,任务要么全部完成,要么都不完成. (二)概述 事务由事务管理器来管理和协调.每个影响事务结果的资源都由一个资源管理器来管理.事务管理器与资源管理器通信,以定义事务的结果. ...
- 部署Zabbix4.0和Grafana
部署Zabbix4.0和Grafana 一.Zabbix 1.安装 rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-r ...
- Linux下进行Oracle数据库安装
一般来说我们Windows下进行安装Oracle都很简单,但Linux下却要输入很多命令,以下的安装步骤是本人经过多次安装Linux下的Oracle经验,希望能帮到大家 一.在Linux服务器上创建o ...
- 2021年3月-第01阶段-Linux基础-Linux系统概念-Linux命令
Linux系统基本概念 图形界面: Ctrl+Shift +号 //调整命令终端变大 Ctrl - 号 //调整命令终端变小 命令终端: ~ 家目录:用户的私有场所,其他用户不能随便访问 root超级 ...
- 前端必读2.0:如何在React 中使用SpreadJS导入和导出 Excel 文件
最近我们公司接到一个客户的需求,要求为正在开发的项目加个功能.项目的前端使用的是React,客户想添加具备Excel 导入/导出功能的电子表格模块. 经过几个小时的原型构建后,技术团队确认所有客户需求 ...
- PPR管及管件的类型、规格与选用
1. PPR管的类型及参数识读 2. 常用的PPR管件及规格 3. 住宅给水管的PPR管及管件的需求量
- 『现学现忘』Git后悔药 — 32、revert撤销(一)
目录 1.Git的三种后悔药 2.revert命令原理 3.revert命令的使用 (1)移除某次提交的修改 (2)revert命令说明 1.Git的三种后悔药 在Git中后悔药有三种:amend.r ...
- IDEA 调试起来太费劲?你需要了解这几招!
各位好啊,我是会编程的蜗牛,我们在使用IDEA开发java项目时,经常需要用到IDEA的调试功能,不过平时我们用的调试方法可能过于简单了,其实IDEA还给我们提供了非常强大的调试功能,下面让我来看一看 ...
- String简介
String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String实现了Serializable接口:表示字符串是支持序列化的.实现了 ...