flask状态保持

状态保持

  • http 是一种无状态协议,浏览器请求服务器是无状态的。

    • 无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
    • 无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。
    • 问题:有时需要保持下来用户浏览的状态。
  • 实现状态保持主要有两种方式:

    • 在客户端存储信息使用Cookie
    • 在服务器端存储信息使用Session

无状态协议:

  1. 协议对于事务处理没有记忆能力
  2. 对同一个 url 请求没有上下文关系
  3. 每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况
  4. 服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器
  5. 人生若只如初见

Cookie

  • Cookie:指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密)。

    • 复数形式Cookies。
    • Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。
    • Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。

设置cookie

  • Cookie的key/value可以由服务器端自己定义。

  • 应用:判定注册用户是否已经登录网站、广告推送、购物车

  • 注意:

    • Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用

    • Cookie基于域名安全,不同域名的Cookie是不能互相访问的
      <浏览器同源策略>

    • 如访问itcast.cn时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到itcast.cn写的Cookie信息

    • 当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息

from flask imoprt Flask,make_response
@app.route('/cookie')
def set_cookie():
    resp = make_response('this is to set cookie')
    resp.set_cookie('username', 'itcast')
    return resp
  • 设置过期时间
@app.route('/cookie')
def set_cookie():
    response = make_response('hello world')
    response.set_cookie('username', 'itheima', max_age=3600)
    return response

获取cookie

from flask import Flask,request
#获取cookie
@app.route('/request')
def resp_cookie():
    resp = request.cookies.get('username')
    return resp

Session

  • 对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
  • 在服务器端进行状态保持的方案就是Session
  • Session依赖于Cookie

session数据的获取

session:请求上下文对象,用于处理http请求中的一些数据内容

@app.route('/index1')
def index1():
    session['username'] = 'itcast'
    return redirect(url_for('index'))
@app.route('/')
def index():
    return session.get('username')

必须设置secret_key: app.secret_key = ‘ipython’ secret_key的作用:https://segmentfault.com/q/1010000007295395

要实现 Flask 中带有状态保持的登录和注册功能,可以结合使用会话(session)和数据库来实现。 首先,您需要设置一个密钥(secret key)来加密会话数据,可以在 Flask 应用中进行如下设置: ```python from flask import Flask app = Flask(__name__) app.secret_key = 'your_secret_key_here' ``` 接下来,您需要创建一个用户数据库,并在注册和登录功能中进行相关操作。这里以使用 SQLite 数据库为例: ```python import sqlite3 from flask import Flask, request, session, redirect, url_for, render_template app = Flask(__name__) app.secret_key = 'your_secret_key_here' # 连接到数据库 conn = sqlite3.connect('users.db') c = conn.cursor() # 创建用户表 c.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, password TEXT NOT NULL)''') conn.commit() @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': # 获取注册表单数据 username = request.form['username'] password = request.form['password'] # 检查用户名是否已存在 c.execute('SELECT * FROM users WHERE username=?', (username,)) existing_user = c.fetchone() if existing_user: return 'Username already exists!' # 插入新用户到数据库 c.execute('INSERT INTO users (username, password) VALUES (?, ?)', (username, password)) conn.commit() return redirect(url_for('login')) return render_template('register.html') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': # 获取登录表单数据 username = request.form['username'] password = request.form['password'] # 检查用户名和密码是否匹配 c.execute('SELECT * FROM users WHERE username=? AND password=?', (username, password)) user = c.fetchone() if user: # 将用户信息存储到会话中 session['username'] = username return redirect(url_for('profile')) else: return 'Invalid username or password!' return render_template('login.html') @app.route('/profile') def profile(): # 检查用户是否已登录 if 'username' in session: return f"Welcome, {session['username']}!" else: return redirect(url_for('login')) @app.route('/logout') def logout(): # 清除会话数据 session.clear() return redirect(url_for('login')) if __name__ == '__main__': app.run() ``` 上述代码中,`register` 路由处理函数用于处理用户注册,`login` 路由处理函数用于处理用户登录,`profile` 路由处理函数用于显示用户个人资料。在登录成功后,会将用户名存储到会话中,以便在其他页面中进行状态保持。`logout` 路由处理函数用于注销用户并清除会话数据。 通过以上实现,您可以在 Flask 应用中实现带有状态保持的登录和注册功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值