g对象

### 保存全局变量的g属性:
g:global
1. g对象是专门用来保存用户的数据的。
2. g对象在一次请求中的所有的代码的地方,都是可以使用的。

项目结构:

g_demo.py文件代码:

from flask import Flask,g,render_template,request
from utils import login_log
app = Flask(__name__) @app.route('/',methods=['GET','POST'])
def hello_world():
return 'index' @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')
if username == 'hyq' and password == '':
#就认为当前这个用户的用户名和密码正确
g.username = 'hyq'
g.ip= 'xx'
login_log(username)
return '恭喜!登录成功'
else:
return '您的用户名或密码错误' if __name__ == '__main__':
app.run(debug=True)

utils.py文件代码:

from flask import g

def login_log(username):
print ('当前登录用户是:%s' % g.username) def login_ip_log(ip):
pass

login.html文件代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{{ url_for('login') }}" method="post">
<table>
<tbody>
<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>
</tbody>
</table>
</form>
</body>
</html>

钩子函数before_request

主app文件代码:

from flask import Flask,render_template,request,session,url_for,redirect,g
import os app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24) @app.route('/')
def hello_world():
print('index')
return 'index' @app.route('/login/',methods=['GET','POST'])
def login():
print('login')
if request.method =='GET':
return render_template('login.html')
else:
username = request.form.get('username')
password = request.form.get('password')
if username == 'hyq'and password =='yunqing141':
session['username'] = 'hyq'
return '登录成功'
else:
return '用户名或密码错误!' @app.route('/edit/')
def edit():
if hasattr(g,'username'):
return '修改成功'
else:
return redirect(url_for('login')) # before_request:在请求之前执行的
# before_request是在视图函数执行之前执行的
# before_request这个函数只是一个装饰器,他可以把需要设置为钩子函数的代码放到视图函数执行之前来执行 @app.before_request
def my_before_request():
if session.get('username'):
g.username = session.get('username')
print('hello world') if __name__ == '__main__':
app.run(debug=True)

login.html文件代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="登录"></td>
</tr>
</table>
</form>
</body>
</html>

1. before_request:
* 在请求之前执行的
* 是在视图函数执行之前执行的
* 这个函数只是一个装饰器,他可以把需要设置为钩子函数的代码放到视图函数执行之前来执行

在以上代码中,my_before_request()函数在视图函数请求执行之前就执行了,因此会把session中的username信息保存到g中,但是需要注意的是,对应前一篇博客对g函数的说明,只要重启服务器,

session.get('username')便得不到'username'的信息了。使用这个钩子函数的好处就在于,可以在视图函数执行之前,就把用户资料在数据库查询的工作完成,减少视图函数中对数据库的访问操作

钩子函数context_processor:

问题:当用户登录以后,不同的页面都需要显示用户信息,例如用户名,这个时候不同的模板,index(登陆前的主页),登录后的页面等等在用户名那个地方就要传入相同的参数,

@app.route('/')
def index():
print('index')
return render_template('index.html',username="hyq") @app.route('/edit/')
def edit(): return render_template('edit.html',username='hyq')

注意,此相应的Html文件已经插入username这个变量,但是这样太麻烦,于是用到了context_processs函数

主app文件代码:

 from flask import Flask,render_template,request,session,url_for,redirect,g
import os app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24) @app.route('/')
def index():
print('index')
return render_template('index.html') @app.route('/login/',methods=['GET','POST'])
def login():
print('login')
if request.method =='GET':
return render_template('login.html')
else:
username = request.form.get('username')
password = request.form.get('password')
if username == 'hyq'and password =='yunqing141':
session['username'] = 'hyq'
return '登录成功'
else:
return '用户名或密码错误!' @app.route('/edit/')
def edit():
# if hasattr(g,'username'):
# return '修改成功'
# else:
# return redirect(url_for('login'))
return render_template('edit.html')
# before_request:在请求之前执行的
# before_request是在视图函数执行之前执行的
# before_request这个函数只是一个装饰器,他可以把需要设置为钩子函数的代码放到视图函数执行之前来执行 @app.before_request
def my_before_request():
#if session.get('username'):
if session.get('username'):
g.username = session.get('username',username="hyq")
print('有的有的')
print('hello world') @app.context_processor
def my_context_processor():
#username = session.get('username')
#if username:
return {'username':'hyq'} if __name__ == '__main__':
app.run(debug=True)

注意,此时index和edit函数的返回渲染模板里面,已经不用加上username='hyq'这个变量了,直接由my_context_processor返回值传参,但是这里要小心的是,47行执行的时候并不能得到username,从而return {'username':username}会报错,因为还没有登录,所以47-49行代码可以考虑在数据库中查找username的值

* 上下文处理器应该返回一个字典。字典中的`key`会被模板中当成变量来渲染。
* 上下文处理器中返回的字典,在所有页面中都是可用的。
* 被这个装饰器修饰的钩子函数,必须要返回一个字典,即使为空也要返回。

 

Flask web开发之路十三的更多相关文章

  1. Flask web开发之路九

    flask_scripts介绍 项目结构如下: flask_script_demo.py文件: from flask import Flask app = Flask(__name__) @app.r ...

  2. Flask web开发之路一

    之前学过一段时间的flask,感觉还是挺好用的,自己的专利挖掘项目也想这个web框架来搭建,于是重新开始基础学习 环境:win10,python3.6,pycharm2017,虚拟环境virtuale ...

  3. Flask web开发之路十四

    今天开始Flask的实战,创建一个项目,实现包括用户登录.注册.注销.发表博客.评论以及检索等功能 首先给出项目结构: 1.config.py文件: 存放各种配置信息 import os # dial ...

  4. Flask web开发之路十二

    ge请求和post请求 ### get请求和post请求:1. get请求: * 使用场景:如果只对服务器获取数据,并没有对服务器产生任何影响,那么这时候使用get请求. * 传参:get请求传参是放 ...

  5. Flask web开发之路十一

    首先写一下cookie和session的概念,然后是Flask中session的工作机制以及操作session ### cookie: 1. `cookie`出现的原因:在网站中,http请求是无状态 ...

  6. Flask web开发之路十

    首先介绍循环引用的问题: 当一个模块需要引用另一个模块的类,而另一个模块又需要引用这个模块的类时,就出现了循环引用,而没法导入类,这时候可以切断其中一条引用路径,增加一个模块 项目结构: models ...

  7. Flask web开发之路八

    今天写Flask_SQLAlchemy的外键及其关系 ### Flask-SQLAlchemy外键及其关系: 主app文件代码: from flask import Flask from flask_ ...

  8. Flask web开发之路七

    今天写SQLAlchemy数据库 首先介绍ORM的概念: ORM,Object类,Relationship:关系,Mapping:映射,也就是模型关系映射 flask-sqlalchemy是一套ORM ...

  9. Flask web开发之路六

    紧接着上篇文档,写模板继承和block,URL链接和加载静态文件 模板继承和block 项目结构 主app文件代码: from flask import Flask,render_template a ...

随机推荐

  1. mod_wsgi的工作模式和配置

    Openstack所有提供API接口的服务都是python web server,而其本身性能很弱,目前已经将它们配置到了apache上.但对于如何设置mod_wsgi的参数,我一直没有好好去阅读其文 ...

  2. mysql函数和操作符

    mysql,); //取模函数 +-----------+ ,) | +-----------+ | +-----------+ row in set (0.00 sec) mysql,); +--- ...

  3. 如何在 Github 上发现优秀的开源项目?

    之前发过一系列有关 GitHub 的文章,有同学问了,GitHub 我大概了解了,Git 也差不多会使用了,但是还是搞不清 GitHub 如何帮助我的工作,怎么提升我的工作效率? 问到点子上了,Git ...

  4. 基于Centos搭建 Hadoop 伪分布式环境

    软硬件环境: CentOS 7.2 64 位, OpenJDK- 1.8,Hadoop- 2.7 关于本教程的说明 云实验室云主机自动使用 root 账户登录系统,因此本教程中所有的操作都是以 roo ...

  5. 鱼缸的启示:Scale-out和Scale-up架构

    提到Scale-out和Scale-up,初看到可能会有点晕.其实我认为Scale-out和Scale-up的概念可以用一个简单的例子来解释. 不知您有没有养过鱼?当你只有六七条鱼的时候,一个小型鱼缸 ...

  6. 在 Swift 中调用 OC 代码

    前言 在 Swift 语言中,我们可以使用 Objective-C.C 语言编写代码,我们可以导入任意用 Objective-C 写的 Cocoa 平台框架.Objective-C 框架或 C 类库. ...

  7. 拯救安卓手机的数据(无法进入系统只能打开recovery)

    这里不得不赞一个谷歌的开放,如果不是这样读取数据就很糟糕了,记得一千带着我的mac本子到苹果店,那个所谓的“天才”就说苹果的数据无法读取,我了个艹,为了避免丢失你必须得准备一个TM.好了废话不多说,进 ...

  8. iOS多个storyboard间跳转

    Stroyboard 可以被看作一个管理View画面的集合.也就是说一个iOS专案裡面并没有限制只能有一个Storyboard.所以在你的APP专案中,你可以把功能相近的View放到同一个APP之中, ...

  9. [k8s]k8s-ceph-statefulsets-storageclass-nfs 有状态应用布署实践

    k8s stateful sets storageclass 有状态应用布署实践v2 Copyright 2017-05-22 xiaogang(172826370@qq.com) 参考 由于网上的文 ...

  10. Tomcat是什么:Tomcat与Java技、Tomcat与Web应用以及Tomcat基本框架及相关配置

    1.Tomcat是什么       Apache Tomcat是由Apache Software Foundation(ASF)开发的一个开源Java WEB应用服务器. 类似功能的还有:Jetty. ...