flask中的状态保持

状态保持机制详解
本文深入解析了状态保持机制,探讨了HTTP无状态协议下如何通过Cookie和Session在客户端和服务端存储用户状态信息,包括登录状态、浏览记录等,以实现个性化体验和数据持久化。

什么是状态保持

定义记录用户访问状态一种机制。例如:用户是否登陆过,用户的搜索记录

  • 因为 http 是一种无状态协议,浏览器请求服务器是无状态的。
  • 无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
  • 无状态原因:浏览器与服务器是使用socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket连接,而且服务器也会在处理页面完毕之后销毁页面对象。 有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
  • 实现状态保持主要有两种方式: 在客户端存储信息使用Cookie 在服务器端存储信息使用Session
Cookie:指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密)。
  • 复数形式Cookies。
  • Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。
  • Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该 Cookie给服务器(前提是浏览器设置为启用cookie)。
  • Cookie的key/value可以由服务器端自己定义。
应用:
  • 最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookie的功用。
  • 网站的广告推送,经常遇到访问某个网站时,会弹出小窗口,展示我们曾经在购物网站上看过的商品信息。
  • 购物车,用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookie,以便在最后付款时提取信息。
提示:
  • Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用
  • Cookie基于域名安全,不同域名的Cookie是不能互相访问的
    • 如访问itcast.cn时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到itcast.cn写的Cookie信息
    • 浏览器的同源策略
  • 当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息

代码实现

	from flask import Flask, make_response, request
	
	app = Flask(__name__)
	
	@app.route("/")
	def index():
	    isHelp = request.cookies.get('isHelp')
	    if isHelp:
	        return 'index page is show'
	    
	    # 自定义响应对象
	    response = make_response('Help page is show')
	    # 设置cookie及cookie过期时间3600s
	    response.set_cookie('isHelp', 'python', max_age=3600)
	
	    return response
	
	if __name__ == '__main__':
	    app.run(debug=True)
session:对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
免密码登陆
	from flask import Flask, request, session, redirect, url_for
	
	app = Flask(__name__)
	# 设置秘钥,随机字符串
	app.secret_key = 'bMNznSI1Kt/c6+05oIfk/+p81SbOJ2EAGILo/VJbySwmawOeD0HQ2dmyRs0xRQ=='
	
	
	@app.route("/")
	def index():
	    # 获取session中的用户信息,如果没有就是None
	    username = session.get('username')
	    print(username)
	
	    if username:
	        return '欢迎回来%s' % username
	
	    return redirect(url_for('login'))
	
	
	@app.route('/login', methods=['GET', 'POST'])
	def login():
	    # 如果是GET请求方式
	    if request.method == 'GET':
	        with open('login.html') as f:
	            content = f.read()
	            return content
	    # 获取数据
	    username = request.form.get('username')
	    password = request.form.get('password')
	    print(type(password))
	    # 如果是post请求方式
	    # 判断账号密码是否正确
	    if username == 'zs' and password == '123':
	        # 储存账号密码,记录用户的登陆状态
	        session['username'] = username
	        session['password'] = password
	
	        # 跳转到首页
	        return redirect(url_for('index'))
	
	    else:
	        return '登陆失败'
	
	
	if __name__ == '__main__':
	    app.run(debug=True)
<think>嗯,用户想了解如何在Flash ActionScript中实现按钮保持按下状态的方法。首先,我需要回忆一下Flash中的按钮结构和ActionScript的基本用法。 Flash的按钮元件通常有四个关键帧:弹起、指针经过、按下和点击。默认情况下,按钮在按下后会弹起,所以要保持按下状态,可能需要修改按钮的时间轴或者通过脚本来控制。 首先,用户可能需要的是按钮被点击后保持按下状态,直到再次点击或其他操作。这可以通过改变按钮的帧或者使用变量来跟踪状态。比如,在按下时跳转到“按下”帧并停留在那里,直到有事件触发状态改变。 然后,考虑到ActionScript 2.0和3.0的差异。AS3更现代,但有些旧项目可能还在用AS2。需要分别给出两种版本的实现方法。比如,在AS3中,可以使用addEventListener来监听鼠标事件,并在事件处理函数中改变按钮的状态。 另外,保持状态可能需要一个布尔变量来记录按钮是否被按下。当点击时,变量切换,并根据变量的值改变按钮的外观。例如,按下时显示按下状态的帧,释放时根据变量决定是否保持。 还可能涉及时间轴控制,比如使用gotoAndStop跳转到特定帧。或者通过动态修改按钮的子对象,比如隐藏或显示不同的图形元素。 用户提供的引用中提到了Flash按钮的源文件包含动作脚本和层,时间轴关键帧。这可能提示需要使用时间轴控制或帧标签来实现状态保持。例如,在按下时让时间轴停在按下帧,直到再次交互。 另外,引用[2]中的动画效果虽然是用CSS实现的,但可以类比到Flash中的过渡效果,比如使用Tween类来制作动画,但用户的问题更关注状态保持而非动画。 需要确保代码示例正确,比如在AS3中使用事件监听,正确引用按钮实例名称,避免常见的错误,比如忘记注册事件或错误使用帧标签。 可能还需要考虑按钮的不同部分,比如是否需要多个图层或影片剪辑来实现复杂的状态变化。例如,按钮内部包含一个指示状态的影片剪辑,通过脚本来控制其显示。 最后,检查是否有遗漏的细节,比如按钮实例名称的设置,确保用户能够正确复制代码并测试效果。同时,提供相关问题,帮助用户深入理解,比如状态切换的其他方法或不同版本AS的区别。</think>### ActionScript中按钮保持按下状态的实现方法 在Flash ActionScript中实现按钮保持按下状态的核心原理是通过事件监听控制时间轴播放头位置或修改显示对象属性。以下是具体实现步骤: #### 方法一:时间轴控制法(AS3) 1. 创建按钮元件 - 在时间轴创建4个关键帧:弹起(UP)、经过(OVER)、按下(DOWN)、保持(HOLD) - 为"保持"帧添加帧标签:`hold_state` ```actionscript // 按钮实例命名为myBtn myBtn.addEventListener(MouseEvent.CLICK, toggleState); function toggleState(e:MouseEvent):void { if(myBtn.currentLabel != "hold_state") { myBtn.gotoAndStop("hold_state"); } else { myBtn.gotoAndStop("up"); } } ``` #### 方法二:状态变量控制法(AS2) ```actionscript // 按钮实例命名为myBtn var isPressed:Boolean = false; myBtn.onPress = function() { isPressed = !isPressed; if(isPressed) { this.gotoAndStop("down"); } else { this.gotoAndStop("up"); } }; ``` #### 方法三:影片剪辑替代法 1. 将按钮转换为影片剪辑 2. 添加状态控制代码: ```actionscript // 影片剪辑实例命名为mcBtn mcBtn.buttonMode = true; mcBtn.addEventListener(MouseEvent.CLICK, function(){ mcBtn.gotoAndStop(mcBtn.currentFrame == 1 ? 2 : 1); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值