蓝图

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

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

目录结构:

  1. -templates
  2. -views
  3. -__init__.py
  4. -user.py
  5. -order.py
  6. -app.py

app.py

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

__init__.py

  1. from flask import Flask,request
  2. app = Flask(__name__)
  3. #不导入这个不行
  4. from . import account
  5. from . import order
  6. from . import user

user.py

  1. from . import app
  2. @app.route('/user')
  3. def user():
  4. return 'user'

order.py

  1. from . import app
  2. @app.route('/order')
  3. def order():
  4. return 'order'

使用蓝图  (Blueprint)

目录结构:

  1. -app01
  2. -pro
  3. -templates
  4. -__init__.py
  5. -views
  6. -manage.py

manage.py

  1. from pro import app
  2.  
  3. if __name__ == '__main__':
  4. app.run()

__init__.py

  1. from flask import Flask
  2. app=Flask(__name__)
  3. from pro import views
  4. app.register_blueprint(views.us)

views.py

  1. from flask import Blueprint,render_template
  2. us=Blueprint("user",__name__)
  3. @us.route("/")
  4. def index():
  5. 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的概念

请求上下文源码分析

  1. 第一阶段:将ctx(request,session)放到Local对象上
  2.  
  3. 第二阶段:视图函数导入:request/session
  4. request.method
  5. -LocalProxy对象.method,执行getattr方法,getattr(self._get_current_object(), name)
  6. -self._get_current_object()返回return self.__local(),self.__local(),在LocakProxy实例化的时候,object.__setattr__(self, '_LocalProxy__local', local),此处local就是:partial(_lookup_req_object, 'request')
  7.  
  8. -def _lookup_req_object(name):
  9. top = _request_ctx_stack.top #_request_ctx_stack 就是LocalStack()对象,top方法把ctx取出来
  10. if top is None:
  11. raise RuntimeError(_request_ctx_err_msg)
  12. return getattr(top, name)#获取ctx中的requestsession对象
  13.  
  14. 第三阶段:请求处理完毕
  15. - 获取session并保存到cookie
  16. - ctx删除

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

g对象

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

g对象的特性:

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

g对象和session的区别

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

代码示例

  1. from flask import Flask,g,redirect
  2.  
  3. app=Flask(__name__)
  4.  
  5. def set_g():
  6. g.name='sb' #设置g(可以单独这样设置,也可以在视图函数内设置,直接g.属性名设置)
  7.  
  8. @app.route("/")
  9. def index():
  10. set_g()
  11. return redirect("/index")
  12.  
  13. @app.route("/index")
  14. def login():
  15. print(g.name) #获取g对象
  16. return ""
  17.  
  18. if __name__ == '__main__':
  19. app.run()

信号

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

安装:pip install blinker

内置信号:

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

使用信号:

  1. from flask import Flask,signals
  2.  
  3. app = Flask(__name__)
  4. #给信号绑定要执行的函数
  5. #无需管调用,因为flask,已经给我们设置调用点
  6. def func(*args,**kwargs):
  7. print('触发型号',args,kwargs)
  8. #与该信号进行绑定
  9. signals.request_started.connect(func) #绑定信号,请求到来前就会执行绑定的函数
  10. # 触发信号: signals.request_started.send()
  11. @app.before_first_request
  12. def before_first1(*args,**kwargs):
  13. print("befor_first_request")
  14.  
  15. @app.before_request
  16. def before_first3(*args,**kwargs):
  17. print("befor_request")
  18.  
  19. @app.route('/',methods=['GET',"POST"])
  20. def index():
  21. print('视图')
  22. return "视图"

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

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

自定义信号(了解)

  1. from flask import Flask
  2. from flask.signals import _signals
  3.  
  4. app = Flask(import_name=__name__)
  5.  
  6. # 自定义信号
  7. xxxxx = _signals.signal('xxxxx')
  8.  
  9. def func(sender,a):
  10. print(sender,a)
  11. print("我是自定义信号")
  12.  
  13. # 自定义信号中注册函数
  14. xxxxx.connect(func)
  15.  
  16. @app.route("/x")
  17. def index():
  18. # 触发信号
  19. xxxxx.send("sb",a="1") #最少传递一个参数
  20. return 'Index'
  21.  
  22. if __name__ == '__main__':
  23. app.run()

 flask-session

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

安装:pip3 install flask-session

使用1  (复杂的方式)

  1. from flask import Flask,session
  2. from flask_session import RedisSessionInterface
  3. import redis
  4. app = Flask(__name__)
  5. app.secret_key="ajksda"
  6. conn=redis.Redis(host='127.0.0.1',port=6379)
  7. #use_signer设置是否需要secret_key签名,permanent设置关闭浏览器cookie是否失效
  8. app.session_interface=RedisSessionInterface(conn,key_prefix='jason',use_signer=True, permanent=False)
  9. @app.route('/')
  10. def hello_world():
  11. session['sb']='jason'
  12. return 'Hello World!'
  13.  
  14. @app.route("/index")
  15. def index():
  16. print(session['sb'])
  17. return "ok"
  18.  
  19. if __name__ == '__main__':
  20. app.run()

使用2 (简单的方式)

  1. from flask import Flask,session
  2. import redis
  3. from flask_session import Session
  4. app = Flask(__name__)
  5. app.config['SESSION_TYPE'] = 'redis'
  6. app.config['SESSION_REDIS'] =redis.Redis(host='127.0.0.1',port='')
  7. app.config['SESSION_KEY_PREFIX']="jason"
  8. Session(app)
  9.  
  10. @app.route('/')
  11. def hello_world():
  12. session['sb']='jason'
  13. return 'Hello World!'
  14.  
  15. @app.route("/index")
  16. def index():
  17. print(session['sb'])
  18. return "ok"
  19.  
  20. if __name__ == '__main__':
  21. 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. 不用VS调试.Net

    将来,任何开发人员都将需要调试应用程序,并且将无法访问Visual Studio,在某些情况下甚至无法访问源代码.例如,在生产web或应用服务器上调试问题时,我真的不想安装Visual Studio并 ...

  2. codevs 2780 ZZWYYQWZHZ

    2780 ZZWYYQWZHZ  时间限制: 1 s  空间限制: 32000 KB  题目等级: 青铜 Bronze       题目描述 Description 可爱的小管在玩吹泡泡.忽然,他想到 ...

  3. CF1237E 【Balanced Binary Search Trees】

    首先我们要注意到一个性质:由于根与右子树的根奇偶性相同,那么根的奇偶性与\(N\)相同 然后我们发现对于一个完美树,他的左右两个儿子都是完美树 也就是说,一颗完美树是由两棵完美树拼成的 注意到另一个性 ...

  4. 【JZOJ6206】【20190610】二分图边染色

    题目 ​ 对一个二分图的边染色,满足有相同端点的边的颜色一定不同; ​ 设最优染色为\(C\) ,你的染色为\(X\),只需要满足$ X \le 2^ {\lceil log  C \rceil }$ ...

  5. 【CPLEX教程03】java调用cplex求解一个TSP问题模型

    00 前言 前面我们已经搭建好cplex的java环境了,相信大家已经跃跃欲试,想动手写几个模型了.今天就来拿一个TSP的问题模型来给大家演示一下吧~ CPLEX系列教程可以关注我们的公众号哦!获取更 ...

  6. git之fatal: Could not read from remote repository

    问题背景:在git bash中使用hexo g -d命令进行文章发布 详细错误信息: fatal: Could not read from remote repository. Please make ...

  7. CTF CMS(转)

    CTF--CMS漏洞总结 海洋CMS 6.28 海洋CMS6.28命令执行漏洞 6.45-6.54 漏洞预警 | 海洋CMS(SEACMS)0day漏洞预警 8.8(未验证) 海洋cms前台到后台的g ...

  8. Python 实现毫秒级淘宝、京东、天猫等秒杀抢购脚本

    本篇文章主要介绍了Python 通过selenium实现毫秒级自动抢购的示例代码,通过扫码登录即可自动完成一系列操作,抢购时间精确至毫秒,可抢加购物车等待时间结算的,也可以抢聚划算的商品. 该思路可运 ...

  9. Mac使用秘钥登录Linux服务器

    简介 在 Mac 上配置 SSH 密钥登录远程的 Linux 相关配置 1.创建本地的 SSH 密钥 本地 生成秘钥对 ssh-keygen -t rsa -C 'youxiang@aliyun.co ...

  10. mqtt 与 MQ 的区别

    mqtt 与 MQ 的区别: mqtt:一种通信协议,类似人类交谈中的汉语.英语.俄语中的一种语言规范MQ:一种通信通道,也叫消息队列,类似人类交谈中的用电话.email.微信的一种通信方式json: ...