热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

重定向和用户会话

出现的问题:用户提交表单后,在刷新浏览器,会有上图的一个提醒出现原因:刷新浏览器会重新发送之前发送的最后一个请求

出现的问题:


用户提交表单后,在刷新浏览器,会有上图的一个提醒

出现原因:

刷新浏览器会重新发送之前发送的最后一个请求,若该请求是一个包含表单数据的post请求,刷新浏览器后会再次提交表单

解决方法:

不讲web程序发送的POST请求最为浏览器发送的最后一个请求

需求的实现方式:

不适用常规的响应,使用重定向作为POST请求的响应

重定向

是一种特殊的响应方式,响应的内容是url,不是包含HTML代码的字符串,
浏览器收到这种响应后,会向重定向的url发起GET请求,显示页面的内容
现在最后一个请求是get请求

重定向实现中的问题:

程序处理post时,使用form.name.data获取用户输入,但是一旦这个请求结束,数据也丢失了,所以程序需要保存输入的名字,这样重定向请求后才能获取并使用这个名字,从而构建正真的响应

解决问题

将数据从存储在用户会话中,在请求之间记住数据

用户会话

是一种私有存储,存在每个连接到服务器的客户端中,是请求上下文中的变量,名为session,向python字典一样操作。
默认情况下session保存在客户端COOKIE中,使用设置的SECRET_KEY进行加密,如果篡改了cooki中的内容,签名就会失效,会话随之失效

# -*- coding:utf-8 -*-
from flask import Flask ,render_template,session,redirect,url_for
from flask.ext.script import Manager
from flask_bootstrap import Bootstrap
from flask.ext.moment import Moment
from flask.ext.wtf import Form
from wtforms import StringField,SubmitField
from wtforms.validators import Requiredapp = Flask(__name__)
app.config['SECRET_KEY']='hard to guess string'
manager = Manager(app)
bootstrap = Bootstrap(app)
moment = Moment(app)
form = Form()class NameForm(Form):name = StringField('What is your name?',validators = [Required()])submit = SubmitField('Submit')#主页
@app.route('/')
def index():name = Noneform = NameForm()if form.validate_on_submit():session['name'] = form.name.datareturn redirect(url_for('index'))return render_template('index.html',form=form,name=session.get('name'))#主页(动态)
@app.route('/user/')
def user(name):return render_template('user.html',name = name )# 404 error
@app.errorhandler(404)
def page_not_found(e):#错误处理程序也会返回响应,包括返回与错误对应的数字状态码return render_template('404.html'),404
#500 error
@app.errorhandler(500)
def internal_server_error(e):return render_template('500.html'),500if __name__ == '__main__':manager.run()

1. name变量

前一个版本,局部变量name用于存储用户在表单中输入的名字,
现在name变量存储在用户会话中,session[‘name’],所以在两次请求之间记住用户输入

2. redirect(url_for(”))

是一个辅助函数,用来生成HTTP重定向响应,
参数:
函数的第一个
重定向的UTL,此处使用url_for(‘inde’)生成url
使用url_for()的原因:
函数使用url映射生成url,保证url和定义的路由兼容,修改路由后依然可以使用

3. url_for()

函数的第一个 参数必须是 端点名,及路由的内部名字
默认情况下端点名是视图函数的名字
使用url_for()的原因:
函数使用url映射生成url,保证url和定义的路由兼容,修改路由后依然可以使用

4. session.get(‘name’)

直接从session会话中读取name参数的值,和普通字典一样,
get()获取字典中键对应的值,对于 不存在的键,get()返回None

源代码


推荐阅读
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Python的参数解析argparse模块的学习
    本文介绍了Python中参数解析的重要模块argparse的学习内容。包括位置参数和可选参数的定义和使用方式,以及add_argument()函数的详细参数关键字解释。同时还介绍了命令行参数的操作和可接受数量的设置,其中包括整数类型的参数。通过学习本文内容,可以更好地理解和使用argparse模块进行参数解析。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
author-avatar
手机用户2502907057
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有