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(一)的更多相关文章

  1. flask+sqlite3+echarts2+ajax数据可视化

    前提: 准备Python + Flask+Sqlite3的平台环境(windows系统) 前面一节介绍flask怎么安装了,剩下sqlite3下载后解压,然后环境变量添加解压路径就行了 附加下载地址: ...

  2. flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法

    flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...

  3. Windows下快速安装Flask的一次经历

    前提: 1.已安装python版本(一般都是2.X) 2.已安装easy_install python安装,记得配置Python的环境变量,例如:我的直接在Path上加 G:\Python 验证安装P ...

  4. 使用Flask设计带认证token的RESTful API接口[翻译]

    上一篇文章, 使用python的Flask实现一个RESTful API服务器端  简单地演示了Flask实的现的api服务器,里面提到了因为无状态的原则,没有session cookies,如果访问 ...

  5. 使用python的Flask实现一个RESTful API服务器端[翻译]

    最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务 ...

  6. python flask (一)

    from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World ...

  7. flask源码分析

    本flask源码分析不间断更新 而且我分析的源码全是我个人觉得是很beautiful的 1 flask-login 1.1 flask.ext.login.login_required(func),下 ...

  8. Python flask 基于 Flask 提供 RESTful Web 服务

    转载自 http://python.jobbole.com/87118/ 什么是 REST REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转 ...

  9. Python flask @app.route

    转载自 http://python.jobbole.com/80956/ 下面是Flask主页给我们的第一个例子,我们现在就由它入手,深入理解“@app.route()”是如何工作的.         ...

  10. Flask 框架入门

    Flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 安装 Flask 依赖两个外部库, We ...

随机推荐

  1. helm安装metrics-server-3.8.2

    Application version 0.6.1 Chart version 3.8.2 获取chart包 helm repo add metrics-server https://kubernet ...

  2. 从 Hadoop 到云原生, 大数据平台如何做存算分离

    Hadoop 的诞生改变了企业对数据的存储.处理和分析的过程,加速了大数据的发展,受到广泛的应用,给整个行业带来了变革意义的改变:随着云计算时代的到来, 存算分离的架构受到青睐,企业开开始对 Hado ...

  3. Linux命令之find、grep、echo、tar、whoami、uname

    1. whoami--查看当前登录的用户名 book@100ask:~/linux$ whoami book 2. echo--打印命令,配合'>'或者'>>'使用 echo 打印信 ...

  4. 基于.NET6的简单三层管理系统

    前言 笔者前段时间搬砖的时候,有了一个偷懒的想法:如果开发的时候,简单的CURD可以由代码生成器完成,相应的实体.服务都不需要再做额外的注册,这样开发人员可以省了很多事. 于是就开了这个项目,期望实现 ...

  5. 从云AK泄露利用看企业特权管理

    从云AK泄露利用看企业特权管理 目录 - 缘起 - 当前主流AK泄露检测方式 - 防止AK滥用的关键要素? - 哪些算特权账号管理? - 如何做特权账号管理? - 特权管理与堡垒机.IAM.零信任的关 ...

  6. 互联网公司员工职级、研发效能度量、OKR与绩效考核

    今天要写这篇文章,来自最近有两个点触动了我.第一个触动点是奈飞(netflix)做出了一个巨大动作<"不搞职级.人人平等" 25 年后行不通了?Netflix 破天荒引入细分 ...

  7. Docker容器优雅重启

    默认情况下,当 Docker 守护进程终止时,它将关闭正在运行的容器.您可以配置守护程序,以便容器在守护程序不可用时保持运行.此功能称为live-restore.live-restore选项有助于减少 ...

  8. PostgreSQL 选择数据库

    数据库的命令窗口 PostgreSQL 命令窗口中,我们可以命令提示符后面输入 SQL 语句: postgres=# 使用 \l 用于查看已经存在的数据库: postgres=# \l List of ...

  9. 修改因python是3版本导致的yum问题

    问题原因: 系统自带的python出来的是2版本,但是因为某些原因,比如安装使用ElartAlert,导致执行python出来的是3版本. 此时执行yum相关的命令,会报错,具体错误信息如下: [ro ...

  10. 组件化开发2-安装cocoaPods

    第一步:安装ruby 不能一上来就换ruby源.虽然mac自带了ruby,但是版本一般都偏低,如果不进行更新会导致版本依赖问题. 这里使用rvm来管理ruby,它允许共存多个ruby.RVM:Ruby ...