我正在尝试在烧瓶中设置session['username']属性。我用的是蓝图。我的目录结构如下(截断了一些不相关的子目录):
├───app
│ ├───forum
│ │ ├───static
│ │ └───templates
│ ├───googleutils
│ ├───home
│ ├───login
│ ├───profile
│ ├───register
│ ├───static
│ └───templates
└───env我在虚拟环境中工作。
在app目录中,我有一个__init__.py,它包含以下内容:
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
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'。
这是堆栈跟踪:
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“属性:
# 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绝对不是空的。
谢谢。
发布于 2021-03-23 05:41:34
烧瓶的globals.py应该是这样的:
session = LocalProxy(partial(_lookup_req_object, "session"))根据烧瓶源代码。这一行从来没有使用字符串“登录”,在烧瓶的历史。我不知道为什么您的系统会这样,但是将其更改为"session“应该可以解决您的问题。
https://stackoverflow.com/questions/66749114
复制相似问题