我试图了解它是如何Flask-Login工作的.
我在他们的文档中看到他们使用预先填充的用户列表.我想玩数据库存储用户列表.
但是,我不明白这个Flask-Login模块中的一些内容.
@login_manager.user_loader
def load_user(userid):
#print 'this is executed',userid
return user(userid, 'asdf')
Run Code Online (Sandbox Code Playgroud)
每次请求都会调用此代码?这用于加载我的用户对象的所有细节?
现在,我有这个代码:
@app.route('/make-login')
def make_login():
username = 'asdf'
password = 'asdf'
user_data = authenticate(username, password)
user_obj = user(user_data[0], user_data[1])
login_user(user_obj)
return render_template('make-login.html')
Run Code Online (Sandbox Code Playgroud)
当我访问/登录时,我想登录.
我的用户类:
class user(object):
def __init__(self, id, username, active=True):
self.username = username
self.id = id
#self.active = active
def is_authenticated(self):
return True
def is_active(self):
return True
def is_anonymous(self):
return False
def get_id(self):
return 5
Run Code Online (Sandbox Code Playgroud)
另外,我为验证/注册写了另外两个函数
def authenticate(username, password):
cursor = db.cursor() …Run Code Online (Sandbox Code Playgroud) 据我了解Flask中的g变量,它应该为我提供一个存储数据的全局位置,例如在登录后保存当前用户.它是否正确?
我希望我的导航在整个站点登录后显示我的用户名.
我的观点包含
from Flask import g #among other things
Run Code Online (Sandbox Code Playgroud)
在登录期间,我分配
user = User.query.filter_by(username = form.username.data).first()
if validate(user):
session['logged_in'] = True
g.user = user
Run Code Online (Sandbox Code Playgroud)
我似乎无法访问g.user.相反,当我的base.html模板具有以下内容时......
<ul class="nav">
{% if session['logged_in'] %}
<li class="inactive">logged in as {{ g.user.username }}</li>
{% endif %}
</ul>
Run Code Online (Sandbox Code Playgroud)
我收到错误:
jinja2.exceptions.UndefinedError
UndefinedError: 'flask.ctx._RequestGlobals object' has no attribute 'user'
Run Code Online (Sandbox Code Playgroud)
登录否则工作正常.我错过了什么?
在Flask-Login文档中,它描述了系统用户如何需要经过身份验证的用户模型来访问使用装饰器语法的方法:
from flask_login import login_required
@app.route("/settings")
@login_required
def settings():
pass
Run Code Online (Sandbox Code Playgroud)
现在这一切都很好,但我希望能够检查用户是否登录了一个方法,如下所示:
@app.route('/main/', methods=['GET', 'POST'])
main_route():
if request.method == 'GET':
if user_is_authenticated(): #Do the authentication here
#load authenticated /main/ html template etc.
pass
else:
#load unauthenticated /main/ html template etc.
pass
...
Run Code Online (Sandbox Code Playgroud)
这样做的原因是因为它将GET和POST请求分解,而不是为经过身份验证的用户和未经身份验证的用户复制路由.
我怎样才能做到这一点?可能吗?
我的flask_login模块有问题.
我已经成功安装了flask_login模块.同样从命令提示符,我可以轻松地运行此脚本,没有错误:
Python 2.7 (r27:82525, Jul 4 2010, 07:43:08) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from flask.ext.login import LoginManager
Run Code Online (Sandbox Code Playgroud)
但是当我运行这个脚本时:
from flask import Flask
from flask.ext.login import LoginManager
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World! Welcome"
if __name__ == "__main__":
app.run()
Run Code Online (Sandbox Code Playgroud)
我收到错误:
ImportError: No module named flask.ext.login
Run Code Online (Sandbox Code Playgroud)
我在做什么错.我对这个烧瓶很新.提前致谢.
我有简单的jinja2模板和注册/登录链接,我应该在用户登录时隐藏它们,我也使用flask_login模块来处理这个问题.
问题是:如何识别用户是否登录jinja2模板?
我正在使用该flask-login库,我无法找到任何关于如何允许用户通过电子邮件重置密码的好教程或文档.我可以看看如何做到这一点的方向/资源?彻底的谷歌搜索没有透露任何有用的东西.
默认情况下,Flask使用volatile会话,这意味着会话cookie设置为在浏览器关闭时过期.为了使用永久会话,这将使用具有已定义的到期日期的cookie,应该设置session.permanent = True,如本问题中所述.,将根据以下内容设置到期日期config['PERMANENT_SESSION_LIFETIME'].
我很惊讶会话生存期在配置文件中定义,但是无法通过配置请求使用永久会话,例如a config['USE_PERMANENT_SESSION'] = True.但就是这样吧.
我的问题是:如果你确实想要永久性会议,那么定义它们的最佳位置是什么?它是否@app.before_request在上述问题中提出的功能中?但是这意味着每次请求都会重新设置它?似乎一旦确定,session.permanent直到会议结束时仍然如此.
永久会话通常在登录后使用,因此请求处理时最好的地方是处理login_user()?那么对所有匿名页面使用易失性会话cookie的最佳策略是什么,并通过session.permanent = True登录切换到永久会话?
人们可能希望根据它是普通的sessioncookie还是remember_mecookie 来设置不同的生命周期.实现这一目标的最佳方法是什么?
我试图在flask-login的视图中使用当前用户.所以我试着g object
我分配flask.ext.login.current_user给g对象
@pot.before_request
def load_users():
g.user = current_user.username
Run Code Online (Sandbox Code Playgroud)
如果用户是正确的,它可以工作.但是当我使用错误的凭据进行注册或登录时,我收到此错误
AttributeError: 'AnonymousUserMixin' object has no attribute 'username'
请问我在哪里错了...
我正在编写一个具有多个用作用户的类的应用程序(例如,学校帐户和员工帐户).我正在尝试使用Flask-Login来实现这一点,但我不太清楚如何制作它,以便当用户登录时我可以让我的应用程序检查用户名是否属于学校帐户或员工帐户,然后适当登录.
我知道如何确定它属于哪种类型的帐户(因为所有用户名必须是唯一的).但在那之后,我不知道如何告诉应用程序我希望它登录该特定用户.
现在,我只有一个通用登录页面.如果我为员工帐户和学校帐户创建单独的登录页面,会更容易吗?我通过Flask-SQLAlchemy使用MySQL数据库.
我正在使用烧瓶进行注册和登录:
from flask.ext.security.views import register, login
class Register(Resource):
def post(self):
return register()
class Login(Resource):
def post(self):
return login()
api.add_resource(Login, '/login')
api.add_resource(Register, '/register')
Run Code Online (Sandbox Code Playgroud)
然后我使用py.test来测试类:
class TestAPI:
def test_survey(self, app):
client = app.test_client()
data = {'email': 'test@test', 'password': 'password'}
rv = client.post('/2014-10-17/register',
data=json.dumps(data))
...
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,错误发生如下:
AssertionError: Popped wrong request context. (<RequestContext 'http://localhost/2014-10-17/register' [POST] of panel.app> instead of <RequestContext 'http://localhost/' [GET] of panel.app>)
Run Code Online (Sandbox Code Playgroud)
你知道为什么吗?在测试登录时,没有这样的错误
flask-login ×10
python ×9
flask ×8
jinja2 ×2
python-2.7 ×2
cookies ×1
mysql ×1
pytest ×1
session ×1