PythonWEB框架之Flask--2

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

原文地址:https://www.cnblogs.com/ouyang99-/p/10395852.html