蓝图

作用:对程序进行目录结构划分

不使用蓝图情况下,自己分文件

目录结构:

-templates
-views
-__init__.py
-user.py
-order.py
-app.py

app.py

from views import app
if __name__ == '__main__':
app.run()

__init__.py

from flask import Flask,request
app = Flask(__name__)
#不导入这个不行
from . import account
from . import order
from . import user

user.py

from . import app
@app.route('/user')
def user():
return 'user'

order.py

from . import app
@app.route('/order')
def order():
return 'order'

使用蓝图  (Blueprint)

目录结构:

-app01
-pro
-templates
-__init__.py
-views
-manage.py

manage.py

from  pro import app

if __name__ == '__main__':
app.run()

__init__.py

from flask import Flask
app=Flask(__name__)
from pro import views
app.register_blueprint(views.us)

views.py

from flask import Blueprint,render_template
us=Blueprint("user",__name__)
@us.route("/")
def index():
return render_template("index.html")

总结:

1 xxx = Blueprint('account', name,url_prefix='/xxx') :蓝图URL前缀,表示url的前缀,在该蓝图下所有url都加前缀

2 xxx = Blueprint('account', name,url_prefix='/xxx',template_folder='tpls'):给当前蓝图单独使用templates,向上查找,当前找不到,会找总templates

3 蓝图的befort_request,对当前蓝图有效

4 大型项目,可以模拟出类似于django中app的概念

请求上下文源码分析

第一阶段:将ctx(request,session)放到Local对象上

第二阶段:视图函数导入:request/session
request.method
-LocalProxy对象.method,执行getattr方法,getattr(self._get_current_object(), name)
-self._get_current_object()返回return self.__local(),self.__local(),在LocakProxy实例化的时候,object.__setattr__(self, '_LocalProxy__local', local),此处local就是:partial(_lookup_req_object, 'request') -def _lookup_req_object(name):
top = _request_ctx_stack.top #_request_ctx_stack 就是LocalStack()对象,top方法把ctx取出来
if top is None:
raise RuntimeError(_request_ctx_err_msg)
return getattr(top, name)#获取ctx中的request或session对象 第三阶段:请求处理完毕
- 获取session并保存到cookie
- 将ctx删除

程序运行,两个LocalStack()对象,一个里面放request和session,另一个放g和current_app

g对象

专门用来存储用户信息的g对象,g的全称的为global

g对象的特性:

当前请求内你设置就可以取,必须先设置,后取,当前请求可以取无限次。就算你在当前请求设置了g对象,如果不取,其他的请求也取不到。

g对象和session的区别

session对象是可以跨request的,只要session还未失效,不同的request的请求会获取到同一个session,但是g对象不是,g对象不需要管过期时间,请求一次就g对象就改变了一次,或者重新赋值了一次

代码示例

from  flask import Flask,g,redirect

app=Flask(__name__)

def set_g():
g.name='sb' #设置g(可以单独这样设置,也可以在视图函数内设置,直接g.属性名设置) @app.route("/")
def index():
set_g()
return redirect("/index") @app.route("/index")
def login():
print(g.name) #获取g对象
return "" if __name__ == '__main__':
app.run()

信号

Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为

安装:pip install blinker

内置信号:

request_started = _signals.signal('request-started')                # 请求到来前执行
request_finished = _signals.signal('request-finished') # 请求结束后执行 before_render_template = _signals.signal('before-render-template') # 模板渲染前执行
template_rendered = _signals.signal('template-rendered') # 模板渲染后执行 got_request_exception = _signals.signal('got-request-exception') # 请求执行出现异常时执行 request_tearing_down = _signals.signal('request-tearing-down') # 请求执行完毕后自动执行(无论成功与否)
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 应用上下文执行完毕后自动执行(无论成功与否) appcontext_pushed = _signals.signal('appcontext-pushed') # 应用上下文push时执行
appcontext_popped = _signals.signal('appcontext-popped') # 应用上下文pop时执行
message_flashed = _signals.signal('message-flashed') # 调用flask在其中添加数据时,自动触发

使用信号:

from flask import Flask,signals

app = Flask(__name__)
#给信号绑定要执行的函数
#无需管调用,因为flask,已经给我们设置调用点
def func(*args,**kwargs):
print('触发型号',args,kwargs)
#与该信号进行绑定
signals.request_started.connect(func) #绑定信号,请求到来前就会执行绑定的函数
# 触发信号: signals.request_started.send()
@app.before_first_request
def before_first1(*args,**kwargs):
print("befor_first_request") @app.before_request
def before_first3(*args,**kwargs):
print("befor_request") @app.route('/',methods=['GET',"POST"])
def index():
print('视图')
return "视图"

 一个信号触发点的流程:(了解知识点)

a. before_first_request
b. 触发 request_started 信号
c. before_request
d. 模板渲染
渲染前的信号 before_render_template.send(app, template=template, context=context)
rv = template.render(context) # 模板渲染
渲染后的信号 template_rendered.send(app, template=template, context=context)
e. after_request
f. session.save_session()
g. 触发 request_finished信号
如果上述过程出错:
触发错误处理信号 got_request_exception.send(self, exception=e) h. 触发信号 request_tearing_down

自定义信号(了解)

from flask import Flask
from flask.signals import _signals app = Flask(import_name=__name__) # 自定义信号
xxxxx = _signals.signal('xxxxx') def func(sender,a):
print(sender,a)
print("我是自定义信号") # 自定义信号中注册函数
xxxxx.connect(func) @app.route("/x")
def index():
# 触发信号
xxxxx.send("sb",a="1") #最少传递一个参数
return 'Index' if __name__ == '__main__':
app.run()

 flask-session

作用:将默认保存的签名cookie中的值 保存到 redis/memcached/file/Mongodb/SQLAlchemy

安装:pip3 install flask-session

使用1  (复杂的方式)

from flask import Flask,session
from flask_session import RedisSessionInterface
import redis
app = Flask(__name__)
app.secret_key="ajksda"
conn=redis.Redis(host='127.0.0.1',port=6379)
#use_signer设置是否需要secret_key签名,permanent设置关闭浏览器cookie是否失效
app.session_interface=RedisSessionInterface(conn,key_prefix='jason',use_signer=True, permanent=False)
@app.route('/')
def hello_world():
session['sb']='jason'
return 'Hello World!' @app.route("/index")
def index():
print(session['sb'])
return "ok" if __name__ == '__main__':
app.run()

使用2 (简单的方式)

from flask import Flask,session
import redis
from flask_session import Session
app = Flask(__name__)
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] =redis.Redis(host='127.0.0.1',port='')
app.config['SESSION_KEY_PREFIX']="jason"
Session(app) @app.route('/')
def hello_world():
session['sb']='jason'
return 'Hello World!' @app.route("/index")
def index():
print(session['sb'])
return "ok" if __name__ == '__main__':
app.run()

flask框架(七)——蓝图、请求上下文、g对象、信号、flask_session的更多相关文章

  1. flask的请求上下文request对象

    Flask从客户端收到请求时,要让视图函数能访问请求对象request ,才能处理请求.我们可以将request对象作为参数传到试图函数里,比如: from flask import Flask, r ...

  2. 【Flask源码分析——请求上下文与应用上下文】

    Flask中有两种上下文,请求上下文和应用上下文.两者的作用域都处于一个请求的局部中. 查看源代码,上下文类在flask.ctx模块中定义 AppContext类定义应用上下文,app是当前应用Web ...

  3. flask基础之AppContext应用上下文和RequestContext请求上下文(六)

    前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...

  4. Flask框架中特有的变量/函数及上下文

    模板中特有的变量和函数 你可以在自己的模板中访问一些 Flask 默认内置的函数和对象 config 你可以从模板中直接访问Flask当前的config对象: {{config.SQLALCHEMY_ ...

  5. flask框架上下文

    上下文 上下文:相当于一个容器,保存了 Flask 程序运行过程中的一些信息. Flask中有两种上下文,请求上下文和应用上下文 请求上下文(request context) 在 flask 中,可以 ...

  6. flask框架基本使用(1)(基本框架搭建与请求参数接收)

    #转载请留言联系 Flask 是一个 Python 实现的 Web 开发微框架. 1.搭建Flask开发环境 在你开发项目的时候,你拥有的项目越多,同时使用不同版本的 Python 工作的可能性也就越 ...

  7. Flask框架知识点整合

    Flask 0.Flask简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收ht ...

  8. 浅谈 Flask 框架

    一.框架对比 Django —— 教科书式框架 优势:组件全,功能全,教科书 劣势:占用资源,创建复杂度高 Flask —— 以简单为基准开发,一切从简,能省则省 优势:轻,块 劣势:先天不足,第三方 ...

  9. flask框架的教程--程序的基本结构[二]

    一个简单的程序 from flask import Flask # 实例化app 对象 app = Flask(__name__) @app.route('/') def index(): retur ...

  10. flask框架下的jinja2模板引擎(3)(模板继承与可以在模板使用的变量、方法)

    flask 框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html flask 框架下的jinja2模块引擎(2):http ...

随机推荐

  1. C++ 模板元编程 学习笔记

    https://blog.csdn.net/K346K346/article/details/82748163 https://www.jianshu.com/p/b56d59f77d53 https ...

  2. SQL必知必会收集学习

    1.按查询列位置排序:如按第一列 降序排序 desc

  3. 计蒜客——Goldbach

    Goldbach 判断大素数 #include<cstdio> #include<cstdlib> using namespace std; #define N 10000 t ...

  4. C Primer Plus--高级数据结构之二叉树

    目录 二叉搜索树 Binary Search Tree 用C构建二叉树ADT 树结构的定义 C Primer Plus--高级数据结构表示之二叉树 二叉搜索树 Binary Search Tree 二 ...

  5. element ui 里面的table怎么弹出一个框让表中数据点击出现弹框

    <el-table-column label="团队" prop="name" min-width="120px" align=&qu ...

  6. SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步

    最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...

  7. 配置docker阿里云加速器

    1. 安装/升级Docker客户端 推荐安装1.10.0以上版本的Docker客户端,参考文档 docker-ce 2. 配置镜像加速器 针对Docker客户端版本大于 1.10.0 的用户 您可以通 ...

  8. flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台,更名:FXTest 接受定制开发(java版开发完毕)

    **背景: 1.平时测试接口,总是现写代码,对测试用例的管理,以及测试报告的管理持久化做的不够,              2.工作中移动端开发和后端开发总是不能并行进行,需要一个mock的依赖来让他 ...

  9. C#中将xml文件反序列化为实例时采用基类还是派生类的问题

    基类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  10. Python面向对象编程核心思想

    原文地址https://blog.csdn.net/weixin_42134789/article/details/80194788 https://blog.csdn.net/happyjxt/ar ...