首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: AttributeError:'RequestContext‘对象没有’RequestContext‘属性(当分配给session[’username‘]时)

Python: AttributeError:'RequestContext‘对象没有’RequestContext‘属性(当分配给session[’username‘]时)
EN

Stack Overflow用户
提问于 2021-03-22 15:29:13
回答 1查看 289关注 0票数 0

我正在尝试在烧瓶中设置session['username']属性。我用的是蓝图。我的目录结构如下(截断了一些不相关的子目录):

代码语言:javascript
复制
├───app
│   ├───forum
│   │   ├───static
│   │   └───templates
│   ├───googleutils
│   ├───home
│   ├───login
│   ├───profile
│   ├───register
│   ├───static
│   └───templates
└───env

我在虚拟环境中工作。

在app目录中,我有一个__init__.py,它包含以下内容:

代码语言:javascript
复制
from flask import Flask

def create_app():
    app = Flask(__name__, instance_relative_config=False)
    app.secret_key = 'who_cares_about_security' # ignore bad secret, placeholder

    with app.app_context():
        # Register blueprints here, truncated for clarity

        from .login import login
        app.register_blueprint(login.login_bp)

        return app

在登录目录中,我有一个login.py

代码语言:javascript
复制
from flask import Blueprint, render_template, request, session, redirect, url_for
import app.googleutils.utils as googleutil

login_bp = Blueprint(
    'login_bp', __name__,
    template_folder='templates',
    static_folder='static'
)


@login_bp.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == "POST":
        # process login request
        username = request.form["username"]
        password = request.form["password"]
        user = googleutil.find_user(username, password)

        if user:
            session["username"] = username
            return redirect(url_for('home_bp.home'))

        return render_template('login.html') #placeholder
    else:
        return render_template('login.html')

当用户访问/login时,他们填写用户名/密码表,我通过POST获取该表单。这将根据存储在上的实体列表进行检查。如果找到用户名/密码匹配,则尝试将session['username']属性分配给用户名。但是,这给了我一个错误:AttributeError: 'RequestContext' object has no attribute 'login'

这是堆栈跟踪:

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:\Users\NAME\Desktop\PROJECT\env\Lib\site-packages\flask\app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\NAME\Desktop\PROJECT\env\Lib\site-packages\flask\app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\NAME\Desktop\PROJECT\env\Lib\site-packages\flask\app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\NAME\Desktop\PROJECT\env\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\NAME\Desktop\PROJECT\env\Lib\site-packages\flask\app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\NAME\Desktop\PROJECT\env\Lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\NAME\Desktop\PROJECT\env\Lib\site-packages\flask\app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\NAME\Desktop\PROJECT\env\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\NAME\Desktop\PROJECT\env\Lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\NAME\Desktop\PROJECT\env\Lib\site-packages\flask\app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\NAME\Desktop\PROJECT\env\login\login.py", line 20, in login
    session["username"] = username
  File "C:\Users\NAME\Desktop\PROJECT\env\Lib\site-packages\werkzeug\local.py", line 350, in __setitem__
    self._get_current_object()[key] = value
  File "C:\Users\NAME\Desktop\PROJECT\env\Lib\site-packages\werkzeug\local.py", line 306, in _get_current_object
    return self.__local()
  File "C:\Users\NAME\Desktop\PROJECT\env\Lib\site-packages\flask\globals.py", line 39, in _lookup_req_object
    return getattr(top, name)
AttributeError: 'RequestContext' object has no attribute 'login'

我不知道我做错了什么。在烧瓶的globals.py中,我发现这些行提到了"login“属性:

代码语言:javascript
复制
# context locals
_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()
current_app = LocalProxy(_find_app)
request = LocalProxy(partial(_lookup_req_object, "request"))
session = LocalProxy(partial(_lookup_req_object, "login"))
g = LocalProxy(partial(_lookup_app_object, "g"))

但我不知道从这里该怎么办。

取消注释行session["username"] = username修复了错误,并且RHS变量username绝对不是空的。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-23 05:41:34

烧瓶的globals.py应该是这样的:

代码语言:javascript
复制
session = LocalProxy(partial(_lookup_req_object, "session"))

根据烧瓶源代码。这一行从来没有使用字符串“登录”,在烧瓶的历史。我不知道为什么您的系统会这样,但是将其更改为"session“应该可以解决您的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66749114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档