Python 访问flask_wtf中的会话

Python 访问flask_wtf中的会话,python,session,flask,Python,Session,Flask,在forms.py中,我想访问会话。 这是forms.py代码: from flask_wtf import Form from wtforms import SelectField,FileField,TextAreaField,TextField,validators . . . class Send(Form): group = SelectField('Group',[validators.Required('you must select a group')],coerce=i

在forms.py中,我想访问会话。 这是forms.py代码:

from flask_wtf import Form
from wtforms import SelectField,FileField,TextAreaField,TextField,validators
.
.
.
class Send(Form):
    group = SelectField('Group',[validators.Required('you must select a group')],coerce=int,choices=c)
    title = TextField('Title',[validators.Required('you must enter a title')])
    content = TextAreaField('Content',[validators.Required('you must enter a content')])
    attachment = FileField('Attachment')
但当我添加此代码时:

from flask import session
uid = session.get('user_id')
它向我显示了以下错误:

raise RuntimeError('working outside of request context')
RuntimeError: working outside of request context

那么我如何解决它呢?

您应该仅在请求时使用
uid=session.get('user\u id')
,例如:

app = Flask(__name__)

@app.route('/')
def home():
    '''dispatcher functions works with request context'''
    uid = session.get('user_id')
    return str(uid)
如果此代码不是从请求调用的(另一个进程、另一个线程、芹菜、单元测试等),则应手动创建请求上下文或避免使用上下文堆栈变量:

with app.test_request_context():
    uid = session.get('user_id')

您应该仅在请求时使用
uid=session.get('user\u id')
,例如:

app = Flask(__name__)

@app.route('/')
def home():
    '''dispatcher functions works with request context'''
    uid = session.get('user_id')
    return str(uid)
如果此代码不是从请求调用的(另一个进程、另一个线程、芹菜、单元测试等),则应手动创建请求上下文或避免使用上下文堆栈变量:

with app.test_request_context():
    uid = session.get('user_id')

您应该仅在请求时使用
uid=session.get('user\u id')
,例如:

app = Flask(__name__)

@app.route('/')
def home():
    '''dispatcher functions works with request context'''
    uid = session.get('user_id')
    return str(uid)
如果此代码不是从请求调用的(另一个进程、另一个线程、芹菜、单元测试等),则应手动创建请求上下文或避免使用上下文堆栈变量:

with app.test_request_context():
    uid = session.get('user_id')

您应该仅在请求时使用
uid=session.get('user\u id')
,例如:

app = Flask(__name__)

@app.route('/')
def home():
    '''dispatcher functions works with request context'''
    uid = session.get('user_id')
    return str(uid)
如果此代码不是从请求调用的(另一个进程、另一个线程、芹菜、单元测试等),则应手动创建请求上下文或避免使用上下文堆栈变量:

with app.test_request_context():
    uid = session.get('user_id')

好的,我找到了解决这个问题的方法

我认为最好的方法之一是在路由文件中使用session

这是我的表格代码:

from flask_wtf import Form
from wtforms import SelectField

class Test(Form):
    name = SelectField('Name')
因此,我有一个名为“我们”的应用程序,我可以访问此应用程序中的会话:

from flask import Blueprint,session,render_template
from form import Test
our = Blueprint('our',__name__)
@our.route('/')
def index():
    form = Test()
    #session['name'] = 'hedi'
    if session.get('name').lower() == "morteza":
        form.name.choices = ((1,'mori'),(2,'hedi'))
    else:
        form.name.choices = ((1,'you'))
    return render_template('index.html',form=form)
    #return str(session.get('name'))

现在我通过应用程序更改了表单字段数据form.name.choices=..

好的,我找到了解决这个问题的方法

我认为最好的方法之一是在路由文件中使用session

这是我的表格代码:

from flask_wtf import Form
from wtforms import SelectField

class Test(Form):
    name = SelectField('Name')
因此,我有一个名为“我们”的应用程序,我可以访问此应用程序中的会话:

from flask import Blueprint,session,render_template
from form import Test
our = Blueprint('our',__name__)
@our.route('/')
def index():
    form = Test()
    #session['name'] = 'hedi'
    if session.get('name').lower() == "morteza":
        form.name.choices = ((1,'mori'),(2,'hedi'))
    else:
        form.name.choices = ((1,'you'))
    return render_template('index.html',form=form)
    #return str(session.get('name'))

现在我通过应用程序更改了表单字段数据form.name.choices=..

好的,我找到了解决这个问题的方法

我认为最好的方法之一是在路由文件中使用session

这是我的表格代码:

from flask_wtf import Form
from wtforms import SelectField

class Test(Form):
    name = SelectField('Name')
因此,我有一个名为“我们”的应用程序,我可以访问此应用程序中的会话:

from flask import Blueprint,session,render_template
from form import Test
our = Blueprint('our',__name__)
@our.route('/')
def index():
    form = Test()
    #session['name'] = 'hedi'
    if session.get('name').lower() == "morteza":
        form.name.choices = ((1,'mori'),(2,'hedi'))
    else:
        form.name.choices = ((1,'you'))
    return render_template('index.html',form=form)
    #return str(session.get('name'))

现在我通过应用程序更改了表单字段数据form.name.choices=..

好的,我找到了解决这个问题的方法

我认为最好的方法之一是在路由文件中使用session

这是我的表格代码:

from flask_wtf import Form
from wtforms import SelectField

class Test(Form):
    name = SelectField('Name')
因此,我有一个名为“我们”的应用程序,我可以访问此应用程序中的会话:

from flask import Blueprint,session,render_template
from form import Test
our = Blueprint('our',__name__)
@our.route('/')
def index():
    form = Test()
    #session['name'] = 'hedi'
    if session.get('name').lower() == "morteza":
        form.name.choices = ((1,'mori'),(2,'hedi'))
    else:
        form.name.choices = ((1,'you'))
    return render_template('index.html',form=form)
    #return str(session.get('name'))


现在我通过应用程序更改了表单字段数据form.name.choices=..

您希望如何处理用户id?记住,用户id会随着请求的不同而变化,因此在表单中声明一次没有任何意义。@MarkHildreth我需要用户id从数据库中获取用户记录并在表单中显示它们(selectField)。所以我在会话中保存了userid,我需要在表单中使用它。那么,你有什么办法让它变得更好吗?你希望用用户id做什么?记住,用户id会随着请求的不同而变化,因此在表单中声明一次没有任何意义。@MarkHildreth我需要用户id从数据库中获取用户记录并在表单中显示它们(selectField)。所以我在会话中保存了userid,我需要在表单中使用它。那么,你有什么办法让它变得更好吗?你希望用用户id做什么?记住,用户id会随着请求的不同而变化,因此在表单中声明一次没有任何意义。@MarkHildreth我需要用户id从数据库中获取用户记录并在表单中显示它们(selectField)。所以我在会话中保存了userid,我需要在表单中使用它。那么,你有什么办法让它变得更好吗?你希望用用户id做什么?记住,用户id会随着请求的不同而变化,因此在表单中声明一次没有任何意义。@MarkHildreth我需要用户id从数据库中获取用户记录并在表单中显示它们(selectField)。所以我在会话中保存了userid,我需要在表单中使用它。那么你有什么想法可以让它变得更好吗?谢谢你的重播,关于app.test\u request\u context()我有问题,有时我用Blueprint来代替,我会出错,因为Blueprint没有test\u request\u context(),所以我怎么解决它呢?感谢您必须获取应用程序并调用
test\u request\u context()
,当前的
应用程序可能不适用于您的情况。但看起来你想为这种情况构建一个糟糕的解决方案。更好地描述你想要做什么?好的,我有3个应用程序有不同的工作,所以在所有的应用程序中,我想检查身份验证并通过会话获取用户ID,以提供一些功能。那么,最好的解决方案是什么,或者您的想法是什么?最好的解决方案是使用
Flask登录
,因为它在
会话
中存储用户ID,并在
会话
中按用户ID检查身份验证。但是,您应该仅在请求分派器(查看/路由功能)中使用
会话
(或
当前用户
,用于
Flask登录
),因为它只有在用户发出请求时才有意义。但是,我目前不明白您是如何得到
运行时错误:在请求上下文之外工作的
例外,如果您的代码在没有
会话的情况下工作
。感谢您的重播,关于app.test\u request\u context()我有问题,有时我使用Blueprint,因为Blueprint没有test\u request\u context(),所以我得到了一个错误,所以我如何解决它呢?感谢您必须获取应用程序并调用
test\u request\u context()
,当前的
应用程序可能不适用于您的情况。但看起来你想为这种情况构建一个糟糕的解决方案。更好地描述你想要做什么?好的,我有3个应用程序有不同的工作,所以在所有的应用程序中,我想检查身份验证并通过会话获取用户ID,以提供一些功能。那么,最好的解决方案是什么,或者您的想法是什么?最好的解决方案是使用
Flask登录