用flask开发个人博客(4)—— flask中4种全局变量
https://blog.csdn.net/hyman_c/article/details/53512109
一 current_app
current_app代表当前的flask程序实例,使用时需要flask的程序上下文激活,我们以本专栏第一篇文章中写的test.py为例介绍下它的用法:
1.1 激活程序上下文
- >>> from test import app
- >>> from flask import current_app
- >>> from flask import g
- >>> ctx=app.app_context()
- >>> ctx.push()
app.app_context()为flask程序的上下文,简单说来就是flask程序需要运行的环境变量等等.ctx.push()是激活上下文的操作,类似的,如果我们想要回收上下文,用ctx.pop()
1.2 打印当前程序名称
- >>> current_app.name
- 'test'
二 g变量
g作为flask程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,下面的例子,通过g传递了一个名字叫做"Hyman",使用g之前也需要激活程序上下文:
- >>> g.name='Hyman'
- >>> g.name
- 'Hyman'
三 request对象
请求对象,封装了客户端发送的HTTP请求的内容.可参照<<用flask开发个人博客(2)—— Flask中的请求对象request>> .
四 session
用户会话,用来记住请求(比如前后一个GET请求和一个POST请求)之间的值,从数据格式上来说它是字典类型。它存在于连接到服务器的每个客户端中,属于私有存储,会保存在客户端的cookie中。如下面的代码,用于重定向url:
- @app.route('/', methods=['GET','POST'])
- def index():
- form = NameForm()
- if form.validate_on_submit():
- session['name']=form.name.data
- return redirect(url_for('index'))
- renturn render_template('index.html',form=form,name=session.get('name'))
------------------------------------------------
前端请求form:
- <form action="/user/add" method="get">
- <input type="text" name="username" value="111">
- <input type="submit" value="提交">
- </form>
前端提交时,后端接收参数,可以把登录数据保存在session中:
- @user.route('/add',methods=['GET'])
- def add():
- username=request.values.get('username');
- session['username']=username
- return session['username']
其中获取表单数据使用
- request.values.get('username');
复选框参数获取:
- s_option = request.values.getlist("s_option")
- for s in s_option:
- pass
使用@before_request拦截请求url
- @user.before_request
- def before_user():
- if 'username' in session:
- return '已登录'
- pass
- else:
- return '未登录'
如果已经登录,通过拦截,若果未登录,返回提示信息或跳转到登录页面
------------------------------------------------------------------------------------------------
在介绍flask中的request之前,先简单介绍下python中的ThreadLocal对象。ThreadLocal,故名思义,就是线程中的全局变量,最近才接触这个概念,之前在C++和C#中还没遇到过这个东西
。首先看下下面的代码:
- import threading
- localobj=threading.local()
- def threadfunc(name):
- localobj.name=name
- print 'localobj.name is %s' %name
- if __name__=='__main__':
- t1=threading.Thread(target=threadfunc,args=('Hyman',))
- t2=threading.Thread(target=threadfunc,args=('liuzhihui',))
- t1.start()
- t2.start()
- t1.join()
- t2.join()
localobj就是一个Threadlocal对象,他对于每个线程来说是全局的,但是对于不同线程之间又可以保持不同。而flask中的请求对象request就由是这类对象。在多线程服务器中客户端每建立一个链接,服务器就创建一个线程,每个线程中就会有一个request来表示客户端的链接请求信息。
- from flask import Flask
- from flask import request
- app=Flask(__name__)
- @app.route('/')
- def index():
- user_agent=request.headers.get('User_Agent')
- return 'user_agent is %s' %user_agent
- if __name__=='__main__':
- app.run()
启动浏览器时,输入 localhost:5000:
Github位置:https://github.com/HymanLiuTS/flaskTs
克隆本项目:
git clone Git@github.com:HymanLiuTS/flaskTs.git
获取本文源代码:
git checkout FL02
用flask开发个人博客(4)—— flask中4种全局变量的更多相关文章
- 用flask开发个人博客(26)—— 利用config.py配置文件动态的创建不同的Flask对象
原文:https://blog.csdn.net/hyman_c/article/details/52877704 对配置进行封装的目的是根据不同的使用场景,给flask的app赋予不同的config ...
- Flask搭建个人博客网站(1)—项目规划--李渣渣(lizaza.cn)
Flask搭建个人博客网站(1)—项目规划--李渣渣(lizaza.cn) 发布时间:2020-05-2413次浏览 前言 现在市面上又许多比较成熟的博客平台,例如:CSDN,博客园,新浪博客等!对于 ...
- nodejs--express开发个人博客(-)
写完了入门笔记,开始进入开发阶段吧.基于上一节的内容,现在着手开发个人博客系统.先划分一下功能吧 /:首页 /login:登陆 /reg:注册 /post:发表文章 /logout:退出 首先规划一下 ...
- iOS开发优秀博客和软件推荐
iOSBlogAndTools iOS开发优秀博客和软件推荐 本博客和工具列表由广大iOS开发者收集和推荐,如果大家有好的博客或者工具想要分享请点击:我要提交. 收到大家的提交后会及时收录与更新.Gi ...
- Django开发个人博客入门学习经验贴
[写在前面] 入门学习搭建个人博客系统首先还是参考大佬们的经验,记得刚入手Django的时候,一篇博客大佬说过一句话,做技术的不要一开始就扎头于细节中,先把握整体框架,了解这个对象之后再去了解细节,进 ...
- 基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 如何在CSDN博客自定义栏目中添加“给我写信”
在"自定义栏目"中添加"连接"(将自己的微博,QQ空间和CSDN博客关联起来)很多人都做过.但是添加"给我写信"这个功能,用的好像不太多.此 ...
- flask实战-个人博客-虚拟环境、项目结构
个人博客 博客是典型的CMS(Content Management system,内容管理系统),通常由两部分组成:一部分是博客前台,用来展示开放给所有用户的博客内容:另一部分是博客后台,这部分内容仅 ...
- Flask 学习 十 博客文章
提交和显示博客文章 app/models.py 文章模型 class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer ...
随机推荐
- 路由搭建ovpn
教程一(外网搭建): 1. 注册花生壳帐号,同时系统会赠送一个免费的域名 2.登录华硕路由,找到花生壳代码设置花生壳登录名和密码.域名,删掉前面的"#"后,点击应用本页面设置,软重 ...
- lodop简单入门教程
lodop简单入门 1 安装(这个不介绍,下载安装即可) 声明只能装windows,linux不能装,所以linux 服务器要使用直接使用http://localhost:8000/CLodopfun ...
- RP2836 OUT0-OUT7 对应关系
ARM-IO9 OUT0 PA8 备用 P5-A4管脚,可以连接74HC164D级联 ARM-IO10 OUT7 PA1 3 ...
- Android——保存和恢复用户状态
onSaveInstanceState 保存 在暂停之后和保存之前调用 onRestoreInstanceState 恢复 再启动之后和显示之前调用 package com.example.chens ...
- Scala中集合类型与java中集合类型转换
对于java中的集合元素并不能在scala中拿来就用的,需要进行相应的转换. 1. 转换规则如下 从下面可以看出,有些可以相互转换的,有些只能单向转换: scala.collection.Iterab ...
- KMP + 求最小循环节 --- HUST 1010 - The Minimum Length
The Minimum Length Problem's Link: http://acm.hust.edu.cn/problem/show/1010 Mean: 给你一个字符串,求这个字符串的最小循 ...
- Differential Geometry之第八章常Gauss曲率曲面
第八章.常Gauss曲率曲面 1.常正Gauss曲率曲面 2.常负Gauss曲率曲面与Sine-Gordon方程 3.Hilbert定理 4.Backlund变换 4.1.线汇与焦曲面 4.2.Bac ...
- Javascript特效代码大全(420个)(转)
转载自:Javascript特效代码大全(420个) 收集资料,以便使用+面试+学习 ├ Cookie脚本 ├ 随访问次数变提示 ├ 集成Cookies ├ 使窗口仅弹出一次 ├ 签名提示程序 ├ ...
- winform 递归循环阻止机构
private void GetTree() { DataTable dt = new DataTable(); var sql = @" select OUID,ParentOUID,OU ...
- Qt 等待一段时间例如1s
QTime dieTime = QTime::currentTime().addMSecs(1000); while( QTime::currentTime() < dieTime ) QCor ...