Flask Web Development ---关于应用上下文

应用上下文:

应用上下文是用来跟踪在一次请求中的应用级别的数据。

请求上下文是用来跟踪在一次请求中的请求级别的数据。

当一个请求上下文被推送后,其相应的应用上下文也会被推送。

上下文的目的:

Flask应用对象有一些属性,例如:“config”,有时候在视图中访问会很有用。然后,把程序实例(application instance)导入到项目的模块中去容易导致循环导入的问题。

flask使用程序上下文(application context)来解决这个问题,例如:使用current_app这个代理,来作为当前正在处理活动的程序实例,而不是直接引用程序实例。

当处理一个请求的时候,flask会自动推送一个程序上下文(application context),这时,在当前请求中的view function 就能够访问current_app 这个代理。

上下文的生命周期:

当flask程序开始处理一个请求时,就推送一个程序上下文(application context)和一个请求上下文(request context)。然后当请求结束时,就会pop 请求上下文(request context)和程序上下文(application context)。

通常,程序上下文(application context)和 请求上下文(request context)具有一样的lifetime。

手动推送一个上下文:

如果你在 outside an application context,就想访问current_app变量,会得到如下的错误:

RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that
needed to interface with the current application object in some way.
To solve this, set up an application context with app.app_context().

当你在配置你的程序的时候看到这个错误,例如在初始化扩展时,由于你能直接访问程序实例,你可以手动的推送一个上下文。

def create_app():
    app = Flask(__name__)

    with app.app_context():
        init_db()

    return app

在with这个语句块中,使用app_context() 这个函数,这样在with这个语句块中,就可以访问current_app变量。

存储数据:

在一次请求过程当中,程序上下文(application context)是存储 common data的好地方。flask使用 g 这个对象,这是一个简单的namespace object,和current_app拥有一样的lifetime。

注意:g 代表 “global” , 但这是指在一个上下文中的data 才是 全局的。上下文结束了,g也会消失,因此在不同的请求之间(between request)存储数据可不行。跨请求(across request)之间的数据存储用 session 或者 数据库比较好。

g的常用用法:在一次请求的过程中管理资源:

后面由于不懂相关原理,暂时不翻译,以后遇到问题再具体解决!!!!!!

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flask-Paginate是一个Flask扩展,它提供了一种简单的方法来实现分页功能。它基于SQLAlchemy,并且可以与任何SQLAlchemy支持的数据库一起使用。 首先,你需要安装Flask-Paginate扩展。可以通过以下命令来安装: ``` pip install Flask-Paginate ``` 然后,你需要导入Flask-Paginate扩展并创建一个分页器。以下是一个简单的示例: ```python from flask_paginate import Pagination, get_page_args @app.route('/') def index(): # 获取当前页码和每页显示的数量 page, per_page, offset = get_page_args(page_parameter='page', per_page_parameter='per_page') # 从数据库中获取数据 data = get_data_from_database(offset=offset, per_page=per_page) # 创建分页器 pagination = Pagination(page=page, per_page=per_page, total=count_total_items_in_database(), css_framework='bootstrap4') # 渲染模板 return render_template('index.html', data=data, pagination=pagination) ``` 在上面的示例中,我们首先使用`get_page_args`函数从请求参数中获取当前页码和每页显示的数量。然后,我们从数据库中获取数据,并使用`Pagination`类创建一个分页器对象。最后,我们将数据和分页器对象传递给模板进行渲染。 在模板中,你可以使用`prev_href`,`next_href`和`links`属性来生成分页器的HTML代码。以下是一个简单的示例: ```html <div class="pagination"> <a href="{{ pagination.prev_href() }}">Previous</a> {% for page in pagination.links %} {% if page == '...' %} <span class="ellipsis">...</span> {% elif page == pagination.page %} <span class="current">{{ page }}</span> {% else %} <a href="{{ page }}">{{ page }}</a> {% endif %} {% endfor %} <a href="{{ pagination.next_href() }}">Next</a> </div> ``` 上面的代码会生成一个类似于以下HTML代码的分页器: ```html <div class="pagination"> <a href="/?page=1&per_page=10">Previous</a> <a href="/?page=1&per_page=10">1</a> <a href="/?page=2&per_page=10">2</a> <a href="/?page=3&per_page=10">3</a> <a href="/?page=4&per_page=10">4</a> <a href="/?page=5&per_page=10">5</a> <span class="ellipsis">...</span> <a href="/?page=10&per_page=10">10</a> <a href="/?page=2&per_page=10">Next</a> </div> ``` 此外,你还可以使用`prev_disabled`和`next_disabled`属性来禁用“上一页”和“下一页”链接,如果当前页码是第一页或最后一页的话。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值