Flask web开发 处理Session
本文我们在上篇文章《Flask web开发 处理POST请求(登录案例)》的基础上,来讲述Flask对session的支持。
在上面案例上,我们需要修改和新增如下功能
1、登录成功后的 url不再是 http://192.168.142.138/home?username=admin
而是http://192.168.142.138/home
其中在页面显示的username信息,由模板代码从session中获取
2、当没有登录之前,在浏览器输入http://192.168.142.138/xxxx 地址,会跳转到http://192.168.142.138/login页面,
当登录成功后,会进入http://192.168.142.138/xxxx页面。 其中xxx是已经存在的url。
下面我们来一步步的实现(代码在上个案例基础上改进的,这里不再从头说起):
1、修改run.py文件,修改后的文件内容如下
from flask import Flask
from flask import render_template, redirect,url_for
from flask import request,session app = Flask(__name__) @app.route('/login', methods=['POST','GET'])
def login():
error = None
if request.method == 'POST':
if request.form['username']=='admin':
session['username'] = request.form['username']
return redirect('/home')
else:
error = 'Invalid username/password'
return render_template('login.html', error=error) @app.route('/home')
def home():
return render_template('home.html',username=session['username']) app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT' if __name__ == '__main__':
app.debug = True
app.run('0.0.0.0',80)
修改的内容有:
1)登录成功,将用户名保留到session中,代码如session['username'] = request.form['username']
2)登录成功,重定向到home上,不需要带username查询参数
3)home()方法传入模板的username参数直接从session中使用
4)为了让session有效,需要设置一个key
注意:上面的代码有个问题,如果在登录前,直接在浏览器输入home,是会报错的,因为这时session中的username还不存在。这个问题我们在下面会解决。
因为加了app.debug=true的设置,run.py修改后,服务自动重启。这时我们在浏览器中重新访问,发现 登录成功后的 url不再是 http://192.168.142.138/home?username=admin ,而是http://192.168.142.138/home。 这样文章开头说的第一个问题解决了。
下面我们来解决第二个问题。
2、在templates目录下,增加一个test.html文件,内容可以是随意一些文字。
我们下面要解决的是,当在登录之前在浏览器输入 test.html,会跳转到 login页面,登录成功后会自动跳转到test.html页面。
3、在run.py中增加一个对test.html的路由,代码如
@app.route('/test')
def test():
return render_template('test.html');
4、修改run.py文件,修改后的内容如下
from flask import Flask
from flask import render_template, redirect,url_for
from flask import request,session app = Flask(__name__) @app.route('/login', methods=['POST','GET'])
def login():
error = None
if request.method == 'POST':
if request.form['username']=='admin':
session['username'] = request.form['username']
if 'newurl' in session:
newurl = session['newurl']
session.pop('newurl', None)
return redirect(newurl)
else:
return redirect('/home')
else:
error = 'Invalid username/password'
return render_template('login.html', error=error) @app.route('/home')
def home():
return render_template('home.html',username=session['username']) @app.route('/test')
def test():
if 'username' in session:
return render_template('test.html')
else:
session['newurl']='test'
return redirect(url_for('login')) app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT' if __name__ == '__main__':
app.debug = True
app.run('0.0.0.0',80)
上面的代码,与前面相比。在test请求的响应处理中,判断session中是否存在username,不存在就跳转到login页面,并把test地址在session中保存。
然后在login的post请求中,检查newurl是否存在,存在的话表示是由别的页面跳转到登录页面的,这样登录成功后跳转到相应页面,缺省是跳转到home页面。
这样我们文章开头提的第2个问题看上去也解决了。为什么说看上去呢? 因为实际是有问题的。 我们这个是对test请求做了特殊处理。我们应该能对所有的请求(包括还存在问题的home请求)做拦截,判断是否登录,如果没登录,就跳转到登录页面。
这个问题我们在后续的文章中处理,处理的核心思路是在请求达到每个具体的路由代码之前,能进行拦截和判断是否登录。
Flask web开发 处理Session的更多相关文章
- Flask web开发 请求拦截和预处理
我们在开发WEB应用时,往往会需要对所有的url请求进行拦截,做些预处理,比如权限处理.日志等统一处理. 本文介绍一下Flask中的处理机制.我们通过一个简单的例子来说明. 1.编写一个简单应用 ru ...
- 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)
目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构 前言 学习Python也有一个半月时间了,学到现在感觉 ...
- 《Flask Web开发实战:入门、进阶与原理解析(李辉著 )》PDF+源代码
一句话评价: 这可能是市面上(包括国外出版的)你能找到最好的讲Flask的书了 下载:链接: https://pan.baidu.com/s/1ioEfLc7Hc15jFpC-DmEYBA 提取码: ...
- 学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码
在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> ...
- Flask Web开发读书笔记
开篇:目前想自学Flask Web开发--基于Python,找了几本书准备啃啃,同时也会分享读书笔记.希望和大家一起进步. Flask是小型框架,可以算是微框架,但是他的功能还是比较多 Flask有三 ...
- Flask Web开发从入门到放弃(一)
第1章 章节一 01 内容概要 02 内容回顾 03 路飞学城之加入购物车 04 路飞学城之结算 05 路飞学城之立即支付 06 路飞学城之后续计划 07 Flask框架简介和快速使用 08 FLas ...
- [flask/python/web] 解析flask web开发(Miguel著)一书第11章主页不显示博文表单的问题
---------------------------------------------以下内容2017.7.14更新---------------------------------------- ...
- 三 Flask web开发快速入门
1:会话: from flask import Flask, url_for, request, render_template, session from werkzeug.utils import ...
- 《Flask Web开发》学习笔记
第一部分 Flask简介 前言:想熟练掌握一门web框架,为以后即将诞生的测试工具集做准备.为什么选择flask要做熟练掌握的一门框架,而不是其他的,最主要的原因是可以随意定制. 特别提醒:这本书的代 ...
随机推荐
- linux如何关闭selinux?
首先我们可以用命令来查看selinux的状态getenforce 这个命令可以查看到selinux的状态,当前可以看到是关闭状态的.还有一个命令也可以查看出selinux的状态.sestatus -v ...
- C标准函数库中获取时间与日期、对时间与日期数据操作及格式化
表示时间的三种数据类型[编辑] 日历时间(calendar time),是从一个标准时间点(epoch)到现在的时间经过的秒数,不包括插入闰秒对时间的调整.开始计时的标准时间点,各种编译器一般使用19 ...
- levelDB缓存实现
leveldb的缓存机制 leveldb采用LRU机制, 利用键的哈希值前n位作为索引, 将要插入的键值对分派到指定的缓存区, 当缓存区的使用率大于总容量后, 优先淘汰最近最少使用的缓存, 独立的缓存 ...
- Xcode - 详解真机测试步骤
第一种从iOS9.0之后推出的免费开发者账号 1.注册开发者 * 注册Apple ID * 使用Apple ID登录苹果开发者中心,注册成为开发者 * 此过程为免费,只是为了让普通的Apple ID具 ...
- quartz搭建与应用
1.添加依赖 依赖包括Quartz和logback <dependencies> <dependency> <groupId>org.quartz-schedule ...
- 去掉word2007回车后自动编号
1. 在使用word自动编号时,回车续写上一编号内容可能会行距很宽,这时候使用shift+回车不会自动下一编号,而且是正常行距 取消回车自动编号: 打开Word文档,单击菜单栏上的[格式]→[自动套用 ...
- C++对C语言的非面向对象特性扩充(2)
上一篇随笔写了关于C++在注释,输入输出,局部变量说明的扩充,以及const修饰符与C中的#define的比较,也得到了几位学习C++朋友们的帮助讲解,十分感谢,我也希望欢迎有更多学习C++的朋友一起 ...
- [Swust OJ 801]--Ordered Fractions
题目链接:http://acm.swust.edu.cn/problem/801/ Time limit(ms): 1000 Memory limit(kb): 10000 Description ...
- [LeetCode]题解(python):019-Remove Nth Node From End of List
题目来源: https://leetcode.com/problems/remove-nth-node-from-end-of-list/ 题意分析: 这道题是给定一个链表,删除倒数第n个节点.提醒, ...
- Regex阅读笔记(一)之入门
在检查一行文本时,^代表一行的开始,$代表结束. 字符数组:[],在里面列举任意多个字符,可以匹配其中任意一个字符,字符组元字符'-'表示一个范围. ^$表示一个空行(没有任何字符,包括空白字符) [ ...