• Flask入门flask-script 蓝本 钩子函数(三)


    1 flask-script扩展库

    概念: 是一个flask终端运行的解析器 ,因为项目完成以后,代码改动会有风险,所以借助终端完成不同启动项的配置

    安装

    pip3 install flask-script
    

    使用

    from flask_script import Manager   #导入
    manager = Manager(app)  #初始化flask运行的解析器
    manager.run()   #运行
    

    执行程序需要在启动项输入命令

    python3 当前启动文件名.py runserver  可选参数
    可选参数如下:
    -h  主机名
    -p  端口号
    --threaded 开启多线程
    -d 开启调试模式
    -r 代码修改后重新加载
    
    例如:
    python3 manage.py runserver -d -r -h127.0.0.1 -p5001 --threaded   参数全部加上
    

    2 Blueprint蓝图

    **概念 **: Blueprint通过把实现不同功能的module分开,实现分类功能,从而把一个大的application分割成各自实现不同功能的module。在一个Blueprint中可以调用另一个blueprint的view function, 但要加相应的blueprint名。本质上来说就是让程序更加松耦合,更加灵活,增加复用性,提高查错效率.

    导入

    from flask import Blueprint,session
    

    使用 : 创建蓝图路由文件userinfo.py文件

    from flask import Blueprint
    
    user = Blueprint('user',__name__)
    @user.route('/login')
    def login():
    	return 'login'
    	
    注意 : 1 Blueprint接受两个参数实例化,分别文蓝本名与蓝本所在的包与模块
           2  蓝本实质上也是一个命名空间
    

    在启动文件中注册蓝本: app/__init__.py,一般在初始化时候注册蓝图

    from mysession import user
    app.register_blueprint(user)   #app注册蓝本user
    
    app.register_blueprint(user,url_prefix='/user')  #在app中注册蓝本user,并添上前缀/user
    

    下面我们以一个具体例子说明: 假定一个文件系统

    --app
    	--main
        	__init__.py
            errors.py
            forms.py
            views.py
         __init__.py
     其中mian就是蓝本模块,错误信息保存在errors.py,视图函数保存在views.py文件中
    

    (1) 创建蓝本:

    在文件app/main/__init__.py添加定义:

    from flask import Blueprint
    main = Blueprint('admin',__name__)
    from . import views,errors
    
    注:1 通过实例化Blueprint类的对象创建一个蓝本
       2 视图与errors的导入应放在蓝本创建之后,防止循环导入问题
    

    在文件app/main/views.py中添加视图函数:

    from . import main #当前目录下导入蓝本
    from flask import render_template
    
    @main.route('/test/')
    def test():
        return render_template('main/test.html'),200
    注: 1 跳转到模板页面test.html
    

    在文件app/main/errors.py中添加错误视图函数:

    from flask import render_template
    from app.main import main  #导入蓝本
    #捕捉404状态码
    @main.app_errorhander(404)
    def page_not_found(e):
        return render_tamplate('main/404.html'),404
    #捕捉500状态码
    @main.app_errorhander(500)
    def internal_server_error(e):
        return render_template('main/500.html'),500
    

    (2) 注册蓝本

    app/__init__.py中添加注册蓝本代码

    from app.main import main   #导入蓝本
    app.register_blueprint(main,url_prefix='/admin')
    

    (3) 构造url路由

    在view视图中有函数test
    url_for('main.test')   url_for('蓝本名.视图函数名')
    

    3 钩子函数

    类似于django中间件 在使用的时候需要使用装饰器,使得 程序变成 A函数--->钩子函数---->B函数,

    flask项目中有个是应用上下文(app),一个是请求上下文(request),请求上下文request和应用上下文current_app都是一个全局变量。所有请求都共享的。Flask有特殊的机制可以保证每次请求的数据都是隔离的,即A请求所产生的数据不会影响到B请求。所以可以直接导入request对象,不会受到外界影响

    两个上下文一般包含4个属性:

    1. request : 请求上下文的对象,一般用来保存一些请求的变量。比如method、args、form等。
    2. session: 请求上下文的对象,一般用来保存一些会话信息.
    3. current_app: 返回当前App
    4. g: 全局变量,应用上下文的对象,处理请求时作为临时存储的对象 : g.message存储信息
    钩子函数 功能描述
    before_first_request 第一次请求之前
    before_request 每次请求之前
    after_request 每次请求之后
    teardown_request 不管是否异常都会在请求之后执行
    context_processor 上下文处理器,返回字典的健
    errorhandler errorhandler接收状态码,可以自定义返回状态码的响应页面

    注 : 在蓝本中使用钩子函数需要进行转化: @mysession.teardown_app_request 蓝本名.teardown_app_request

    4 g对象

    g : 全局变量,需要导入使用 from flask import g

    1. g对象专门用来保存用户数据的
    2. g对象在一次请求中所有代码都是公用的

    例如: 在提交表单中测试下 action='{{ url_for('login') }}' method='post'

    login_user.html

    <form action="{{ url_for('login') }}" method="post">
           <table>
                        <tr>
                           <td>用户名:</td>
                           <td><input type="text" placeholder="请输入用户名" name="username"></td>
                        </tr>
                        <tr>
                            <td>密码:</td>
                            <td><input type="text" placeholder="请输入密码" name="password"></td>
                        </tr>
                        <tr>
                            <td></td>
                            <td><input type="submit" value="登录"></td>
                        </tr>
           </table>
    </form>
    

    视图函数utils.py中

    from flask import g
    def login_username():
    	return u'当前登录用户:{}'.format(g.username)
    
    def login_password():
        return u'当前密码:{}'.format(g.password)
    

    在主文件视图函数中views.py

    from flask import Flask,g,request,render_template
    from utils import login_username
    
    app = Flask(__name__)
    
    @app.route('/login/',methods=['GET', 'POST'])
    def login():
        if request.method == 'GET':
            return render_template('login.html')
        else:
            username = request.form.get('username')
            password = request.form.get('password')
            g.username = username   #将username变成全局g对象信息存储
            g.password = password	#将password变成全局g对象信息存储
            login_username()
            login_password()
            return u'登录成功!'
    
    if __name__ == '__main__':
        app.run()
    
  • 相关阅读:
    C#数组的使用
    CLR设计类型之接口
    CLR类型设计之泛型(二)
    CLR类型设计之泛型(一)
    CLR类型设计之属性
    CLR类型设计之参数传递
    CLR类型设计之方法与构造器
    将博客搬至CSDN
    Unity_与android交互
    CSS3制作hover下划线动画
  • 原文地址:https://www.cnblogs.com/why957/p/9114088.html
Copyright © 2020-2023  润新知