python获取sessionid_Python Flask:跟踪用户会话?如何获取会话Cookie ID?

您可以通过^{} dictionary访问请求cookie,并通过使用make_response或将调用render_template的结果存储在变量中,然后调用^{} on the response object来设置cookie:@app.route("/")

def home():

user_id = request.cookies.get('YourSessionCookie')

if user_id:

user = database.get(user_id)

if user:

# Success!

return render_template('welcome.html', user=user)

else:

return redirect(url_for('login'))

else:

return redirect(url_for('login'))

@app.route("/login", methods=["GET", "POST"])

def login():

if request.method == "POST":

# You should really validate that these fields

# are provided, rather than displaying an ugly

# error message, but for the sake of a simple

# example we'll just assume they are provided

user_name = request.form["name"]

password = request.form["password"]

user = db.find_by_name_and_password(user_name, password)

if not user:

# Again, throwing an error is not a user-friendly

# way of handling this, but this is just an example

raise ValueError("Invalid username or password supplied")

# Note we don't *return* the response immediately

response = redirect(url_for("do_that"))

response.set_cookie('YourSessionCookie', user.id)

return response

@app.route("/do-that")

def do_that():

user_id = request.cookies.get('YourSessionCookie')

if user_id:

user = database.get(user_id)

if user:

# Success!

return render_template('do_that.html', user=user)

else:

return redirect(url_for('login'))

else:

return redirect(url_for('login'))

干掉代码

现在,您将注意到在home和do_that方法中有一个lot的样板文件,它们都与登录相关。您可以通过编写自己的decorator来避免这种情况(如果您想进一步了解它们,请参见What is a decorator):from functools import wraps

from flask import flash

def login_required(function_to_protect):

@wraps(function_to_protect)

def wrapper(*args, **kwargs):

user_id = request.cookies.get('YourSessionCookie')

if user_id:

user = database.get(user_id)

if user:

# Success!

return function_to_protect(*args, **kwargs)

else:

flash("Session exists, but user does not exist (anymore)")

return redirect(url_for('login'))

else:

flash("Please log in")

return redirect(url_for('login'))

return wrapper

然后,您的home和do_that方法得到的要短得多:# Note that login_required needs to come before app.route

# Because decorators are applied from closest to furthest

# and we don't want to route and then check login status

@app.route("/")

@login_required

def home():

# For bonus points we *could* store the user

# in a thread-local so we don't have to hit

# the database again (and we get rid of *this* boilerplate too).

user = database.get(request.cookies['YourSessionCookie'])

return render_template('welcome.html', user=user)

@app.route("/do-that")

@login_required

def do_that():

user = database.get(request.cookies['YourSessionCookie'])

return render_template('welcome.html', user=user)

使用提供的

如果您不需要cookie有一个特定的名称,我建议您使用^{},因为它已经内置了很多细节(它是签名的,所以不能被篡改,可以设置为仅限HTTP等)。这会让我们的装修师更加干瘪:# You have to set the secret key for sessions to work

# Make sure you keep this secret

app.secret_key = 'something simple for now'

from flask import flash, session

def login_required(function_to_protect):

@wraps(function_to_protect)

def wrapper(*args, **kwargs):

user_id = session.get('user_id')

if user_id:

user = database.get(user_id)

if user:

# Success!

return function_to_protect(*args, **kwargs)

else:

flash("Session exists, but user does not exist (anymore)")

return redirect(url_for('login'))

else:

flash("Please log in")

return redirect(url_for('login'))

然后,您的个别方法可以通过以下方式获得用户:user = database.get(session['user_id'])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值