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

Python Flask:跟踪用户会话?如何获取会话Cookie ID?,python,session,flask,flask-login,Python,Session,Flask,Flask Login,我想构建一个简单的webapp作为我学习活动的一部分。Webapp应该要求用户在遇到第一次访问者时输入他们的电子邮件id,否则它会通过cookie记住用户并自动登录以执行功能 这是我第一次创建基于用户的web应用程序。我脑子里有一个蓝图,但我不知道如何实施它。首先,我对收集用户cookie的方式感到困惑。我研究了各种教程和flask_登录,但我认为我想要实现的要比flask_登录实现的简单得多 我也尝试过使用flask.session,但有点难以理解,最终实现有缺陷 以下是我到目前为止所拥有的(

我想构建一个简单的webapp作为我学习活动的一部分。Webapp应该要求用户在遇到第一次访问者时输入他们的电子邮件id,否则它会通过cookie记住用户并自动登录以执行功能

这是我第一次创建基于用户的web应用程序。我脑子里有一个蓝图,但我不知道如何实施它。首先,我对收集用户cookie的方式感到困惑。我研究了各种教程和flask_登录,但我认为我想要实现的要比flask_登录实现的简单得多

我也尝试过使用flask.session,但有点难以理解,最终实现有缺陷

以下是我到目前为止所拥有的(它是基本的,旨在传达我的用例):


您可以通过访问请求Cookie,并通过使用
make\u response
或仅将调用
render\u模板的结果存储在变量中,然后调用:

使代码干涸 现在,您会注意到在
主页
do\u中有很多与登录相关的
方法样板。您可以通过编写自己的decorator来避免这种情况(看看您是否想了解更多关于它们的信息):

然后你的
home
方法会变得更短:

使用所提供的 如果您不需要cookie具有特定的名称,我建议您使用cookie,因为它已经内置了很多细节(它经过签名,因此不能被篡改,可以设置为仅HTTP,等等)。这会使我们的
登录\u所需的
装饰程序更加干燥:

# 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'])

嘿,肖恩,谢谢你的帮助。这是我能得到的最好的答案。它为我澄清了很多概念。只是一个问题:所需的登录是在app.route之后还是之前?它应该总是在app.route之前-请参阅最后一段代码中的注释(如果您想了解更多有关decorators的一般信息)。数据库对象从何而来?
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
# 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)
# 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'])