10.请求扩展

1 before_request

类比django中间件中的process_request,在青丘收到之前绑定一个函数做一些事情

#基于它做用户登录认证
@app.before_request
def process_request(*args,**kwargs):
if request.path == '/login':
return None
user = session.get('user_info')
if user:
return None
return redirect('/login')

2 after_request

类比django中间件的process_response,每一个请求之后绑定一个函数,如果请求没有异常

@app.after_request
def process_response1(response):
print('process_response1 走了')
return response

3 before_first_request

第一次请求时,跟浏览器无关

@app.before_first_request
def first():
pass

4 teardown_request

每一个请求之后绑定一个函数,即使遇到了异常

@app.teardown_request
def test(e):
pass

5 errorhandler

路径不存在404,服务器内部错误500

@app.errorhandler(404)
def error_404(arg):
return "404错误了"

6 template_global

标签:将做修饰的函数编程一个标签,然后在前端页面上加括号执行

@template_global()
def test(a,b):
return a+b #{{test(2,3)}}

7 template_filter

过滤器

@app.template_filter()

def db(a1,a2,a3):

  return a1+a2+a3

#{{1|db(1,2)}}

总结:

  1 总店掌握before_request和after_request

  2 注意有多个的情况,执行顺序

  3 before_request请求拦截后(也就是有return值),response所有都执行

11 中间件(了解)

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
return 'Hello World!'
# 模拟中间件
class Md(object):
def __init__(self,old_wsgi_app):
self.old_wsgi_app = old_wsgi_app def __call__(self, environ, start_response):
print('开始之前')
ret = self.old_wsgi_app(environ, start_response)
print('结束之后')
return ret if __name__ == '__main__':
#把原来的wsgi_app替换为自定义的
app.wsgi_app = Md(app.wsgi_app)
app.run()

12.蓝图

对程序进行目录结构划分

不使用蓝图,自己分文件

目录结构:

-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'

使用蓝图之中小型系统

详见代码:

目录结构:


        

_init.py

from flask import Flask

app = Flask(__name__)
#3 把蓝图注册到app中
from flask_test.views import order
from flask_test.views import user
app.register_blueprint(order.order_blue)
app.register_blueprint(user.user_blue)

manage.py

from flask_test import app
app.debug = True
if __name__ == '__main__':
app.run()

user.py

#1 创建蓝图
from flask import Blueprint
#2 使用蓝图
user_blue = Blueprint('user',__name__,url_prefix='/app01')
#加上url_prefix='/app01' 的时候,在地址输入时http://127.0.0.1:5000/app01/login
# 或者http://127.0.0.1:5000/app01/logout @user_blue.route('/login')
def login():
return 'login 页面' @user_blue.route('/logout')
def logout():
return 'logout 页面'

order.py

#1 创建蓝图
from flask import Blueprint
#2 使用蓝图
order_blue=Blueprint('order',__name__,url_prefix='/app02')
#加上url_prefix='/app01' 的时候,在地址输入时http://127.0.0.1:5000/app02/order @order_blue.route('/order')
def order():
return 'order 页面'

ps:使用蓝图是按照上述结构搭建项目,然后完成

第一步:在视图文件中创建蓝图

from flask import Blueprint

第二步:在视图函数中使用蓝图

order_blue=Blueprint('order',__name__,url_prefix='/app02',template_folder='tt')

#url_prefix就是对视图函数进行分类,比如  http://127.0.0.1:5000/app01/login
http://127.0.0.1:5000/app01/logout
http://127.0.0.1:5000/app02/order #template_folder就是在视图函数中创建一个'tt'作为模板的文件夹,里面放模板文件 )
#加上url_prefix='/app01' 的时候,在地址输入时http://127.0.0.1:5000/app02/order @order_blur.route('/order')
def order():
return 'order 页面'

template_folder用法图示如下

第三步:

在__init__构造函数中把蓝图注册到app中
from flask_test.views import order
from flask_test.views import user
app.register_blueprint(order.order_blue)
app.register_blueprint(user.user_blue)

使用蓝图之大型系统

详见代码:

目录结构:

admin

  --__init__.py

from flask import Blueprint

admin = Blueprint(
'admin',
__name__,
template_folder='templates',
static_folder='static'
)
from . import views

admin

  -views.py

from . import admin

@admin.route('/index')
def index():
return 'Admin.Index'

web

  -__init__.py

  

from flask import Blueprint

web = Blueprint(
'web',
__name__,
template_folder='templates',
static_folder='static'
)
from . import views

web

  -views.py

from . import web

@web.route('/index')
def index():
return 'Web.Index'

pro_flask

  -__init__.py

from flask import Flask
from .admin import admin
from .web import web app = Flask(__name__)
app.debug = True app.register_blueprint(admin, url_prefix='/admin')
app.register_blueprint(web)

run.py

from pro_flask import app

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

ps:admin和web可以看成是一个个的app,每一个app都有自己一套的规范

总结:

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的概念

PythonWEB框架之Flask--2的更多相关文章

  1. PythonWEB框架之Flask

    前言: Django:1个重武器,包含了web开发中常用的功能.组件的框架:(ORM.Session.Form.Admin.分页.中间件.信号.缓存.ContenType....): Tornado: ...

  2. python学习笔记:接口开发——PythonWEB框架之Flask

    Flask是一个使用 Python 编写的轻量级 Web 应用框架,安装命令如下 pip install flask 一.服务端接口是怎么开发的? 1.启动一个服务 2.接收到客户端传过来的数据3.登 ...

  3. 15 . PythonWeb框架本质

    PythonWeb框架的本质 简单描述就是:浏览器通过你输入的网址给你的socket服务端发送请求,服务端接受到请求给其回复一个对应的html页面,这就是web项目.所有的Web应用本质上就是一个so ...

  4. python 三大框架之一Flask入门

    Flask轻量级框架,Flask是python中的轻量级框架. 打开终端 输入pip install Flask 命令 下载以及安装Flask框架 检查是否下载成功及能否使用 首先导入python环境 ...

  5. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  6. python框架之Flask

    介绍:Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . WSGl:Web Server Gateway ...

  7. Python-Web框架之 - 利用SQLALchemy创建与数据库MySQL的连接, 详解用Flask时会遇到的一些大坑 !

    经过这个小项目算是对Django与Flask这两个web框架有了新的认识 , Django本身的轮子非常齐全 , 套路也很固定 , 新手在接触Django框架时 , 不会陷入到处找轮子的大坑 ; 那么 ...

  8. pythonweb框架Flask学习笔记05-简单登陆

    源代码从下链接引用:https://www.cnblogs.com/felixwang2/p/9261493.html 我使用的是python3.6 在运行代码的时候遇到了以下问题 session[' ...

  9. pythonweb框架Flask学习笔记04-模板继承

    # -*- coding:utf-8 -*- from flask import render_template,Flask app=Flask(__name__) @app.route('/hell ...

  10. pythonweb框架Flask学习笔记03-变量规则

    #-*- coding:utf-8 -*- from flask import Flask app=Flask(__name__) @app.route('/post/<int:postid&g ...

随机推荐

  1. 更改maven下载jar的仓库为阿里云仓库

    修改settings.xml <!-- 配置本地maven的仓库 --> <localRepository>D:\file\path\maven\repository</ ...

  2. 压缩文件tar.gz和zip之间的区别

    我们在开发的时候通常要先下载相关的软件或者是源码,或者是jar包.在下载东西的时候总是碰见后缀是.tar.gz和.zip的问题,搞不清楚是怎么回事,不晓得下载哪个文件才是对自己有用的.现在我知道了,其 ...

  3. C++析构函数的自动调用问题

    首先要明确一点,系统只会自动释放栈内空间,而堆内空间需要用户自己维护. C++中,除了new来的空间存放在堆内,其他均存放在栈中. 当单纯的创建对象的时候,对象存放在栈中,此时在程序块的}后面,系统会 ...

  4. 分类模型评估之ROC-AUC曲线和PRC曲线

    http://blog.csdn.net/pipisorry/article/details/51788927 在样本分布及其不均匀的情况下,建议用PRC...可以看下这个精确率.召回率.F1 值.R ...

  5. redis的五种常见数据类型的常用指令

      一.String字符串,key-value 应用场景:string是redis的最基本数据类型,key-value格式,一个key对应一个值的情况下 1.设置key = value:set key ...

  6. jQuery源码解读三选择器

    直接上jQuery源码截取代码 // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ i ...

  7. 安装和使用iOS的包管理工具CocoaPods

    CocoaPods是ruby实现的,需要用ruby进行安装,mac自带ruby,如果没有ruby的需要先安装ruby.   安装CocoaPods命令 安装CocoaPods命令:sudo gem i ...

  8. SQL Server 2016/2014/2012/2008/2005/2000简体中文企业版下载地址

    为什么只提供企业版下载呢?因为不管你是学生还是工作研究人员,企业版都是功能最为齐全的一个版本,比如企业版都集成了SQL Server Management Studio管理界面(俗称企业管理器的可视化 ...

  9. float数据类型研究,发现其能显示的有效数字极为有限

    1. 范围  float和double的范围是由指数的位数来决定的.  float的指数位有8位,而double的指数位有11位,分布如下:  float:  1bit(符号位) 8bits(指数位) ...

  10. html节点操作与事件

    <div id='a' style="width: 500px;height: 500px;background-color: grey;"> </div> ...