关于 flask g 全局变量的简单用法

Posted 藕丝空间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于 flask g 全局变量的简单用法相关的知识,希望对你有一定的参考价值。

        很多些时候,在做 flask 程序的时候,我们需要用到一些全局变量,比如用户的登录信息等,关于全局变量,本文不做详细讨论,仅仅以全局搜索举例,来说明 g 变量的一些简单用法。

需求分析

        blog 中的搜索功能,需要在不同的页面都显示搜索,最笨的方法是每个页面都实现一个搜索功能,但是这样太重复,太繁琐,违反了“简单”原则。一个好的程序员会把重复的事情都模块化,简单化。

如下三张图所示:

关于 flask g 全局变量的简单用法

关于 flask g 全局变量的简单用法

        每个 url 都用到了同意同一个搜索功能。这需要我们用到一个全局的搜索功能。

构建表单类

# -*- coding:utf-8 -*-
__author__ = '东方鹗'
__blog__ = 'http://www.os373.cn'
from flask_wtf import Form
from wtforms import StringField
from wtforms.validators import DataRequired
class SearchForm(Form):    search = StringField('search', validators=[DataRequired()])

构建视图函数

...
...
...@main.before_requestdef before_request():
    ...
    g.search_form = SearchForm(prefix='search')

...
...
...@main.route('/search/', methods=['GET', 'POST'])def search():
    '''构建搜索视图'''
    if not g.search_form.validate_on_submit():
       return redirect(url_for('.index')) # 由于表单类进行了验证,要求必须有内容,所以,在搜索框内无关键字的情况下返回 blog 主页。    return redirect(url_for('.search_results', query=g.search_form.search.data.strip())) # 反之,则返回搜索结果页面。

@main.route('/search_results/<query>', methods=['GET', 'POST'])
def search_results(query):    '''搜索结果视图函数'''    page = request.args.get('page', 1, type=int)    articles = Article.query.filter(Article.body.like('%%%s%%' % query)).order_by(Article.timestamp.desc()).        paginate(page, per_page=current_app.config['OUSI_POSTS_PER_PAGE'], error_out=False)
   return render_template('default/search_result.html', articles=articles)

        本文的主要精髓就是在 before_request()函数中调用表单类,即:g.search_form = SearchForm(prefix='search')。这样操作,就可以模块化的在每个页面引用表单类啦。

构建页面

sidebar.html 页面:

<div class="col-xs-6 col-sm-3 sidebar-offcanvas small" id="sidebar">
    {% include 'default/common/search.html' %}    <ul class="nav nav-pills">
        <li role="presentation" class="col-lg-12">
            <h3>简介</h3>
            <br>
        </li>
        <li>
            <p>喜欢markdown,爱上藕丝空间。</p>
        </li>
    </ul></div><!--/.sidebar-offcanvas-->

search.html 页面:

<ul class="nav nav-pills">
    <li role="presentation" class="col-xs-12">
        <h3>搜索</h3>
    </li>
    <li role="presentation" class="col-xs-12">
        <form method="post" role="form" action="{{ url_for('main.search') }}">
            {{ g.search_form.hidden_tag() }}            <div class="input-group">
                {{ g.search_form.search(class="form-control", placeholder="搜索") }}                <span class="input-group-btn">
                    <button class="btn btn-default" type="submit"><i class="glyphicon glyphicon-search"></i></button>
                </span>
            </div>
        </form>
    </li></ul>

搜索结果页面如下:

引用

请看下面这段文档:

flask.gJust store on this whatever you want. For example a database connection or the user that is currently logged in.Starting with Flask 0.10 this is stored on the application context and no longer on the request context which means it becomes available if only the application context is bound and not yet a request.

        也就是说从0.10开始g兑现就不是在request的级别,而是在应用上下文的级别。

链接:API — Flask Documentation (0.10)

        而 app context (应用上下文)却有点误导性,它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓local proxy。它的作用主要是帮助 request 获取当前的应用,它是伴 request 而生,随 request 而灭的。

文档:

  1. Flask request,g,session的实现原理

  2. flask 上下文全局变量

以上是关于关于 flask g 全局变量的简单用法的主要内容,如果未能解决你的问题,请参考以下文章

C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段

Flask 学习-66.全局g对象的使用

flask中的g到底是什么?

深入浅出Flask:flask使用请求的全局对象g

用flask开发个人博客—— flask中4种全局变量

flask的简单用法