@login_required麻烦在烧瓶的应用程序 [英] @login_required trouble in flask app

查看:196
本文介绍了@login_required麻烦在烧瓶的应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创建了一个处理认证的蓝图。这张蓝图使用Flask-Login。还有以下内容,以及更多的代码不显示。



在蓝图中,我有以下内容:

<$从flask.ext.login导入LoginManager
从flask.ext.login导入UserMixin
从flask.ext.login导入current_user $ b $从flask.ext中导入p $ p> .login导入login_required
from flask.ext.login导入login_user $ b $ from flask.ext.login导入logout_user
$ b auth_print = Blueprint('auth_print',__name__)
login_manager = LoginManager()
login_manager.login_view ='/ login'
$ b $ class User(UserMixin):
$ b user_store = {}#存储已经存在的用户登录。

def __init __(self,user_id):
self.user_store [user_id] = self#将用户添加到user_store
self.username = user_id#user_id实际上是用户名
self.id = unicode(user_id)

def sign_out(self):
logout_user()
try:
del self .user_store [self.id]
除了KeyError:
传递

@classmethod
def get(cls,user_id):
返回cls.user_store.get(user_id)

@ login_manager.user_loader
def load_user(user_id):
return User.get(user_id)
$ b $ get get_current_user():
return current_user

@login_required
@ auth_print.route('/')
def user():
return欢迎,并感谢登录。

然后我有一个小应用程序,我想添加身份验证。



小应用程序

 导入the_above_module 
app.register_blueprint(the_above_module.auth_print)#寄存器蓝图

@ the_above_module.login_required
@ app.route('/ profile')
def protected():
name = the_above_module.get_current_user()。username
返回感谢您登录
$ b $ if if __name__ =='__main__':
app.run(host ='0.0.0.0',port = 8000)
$ b

然而,如果我去localhost:8000 / profile,login_required装饰器永远不会被触发。因此,我得到一个错误,因为没有当前的用户。

为什么@login_required工作在蓝图,而不是在应用程序,即使当确保保持相同的名称空格?

解决方案

你必须改变装饰器的顺序。引用 Flask文档


那你现在怎么使用这个装饰器?将它作为最内层的
装饰器应用于视图函数。当应用更多的装饰器时,总是
记住route()装饰器是最外层的:

  @ app.route '/ secret_page')
@login_required
def secret_page():
pass



I have created a blueprint that handles authenticating. This blue print uses Flask-Login. And has the following, as well as more code not shown.

In the blueprint I have the following:

from flask.ext.login import LoginManager
from flask.ext.login import UserMixin
from flask.ext.login import current_user
from flask.ext.login import login_required
from flask.ext.login import login_user
from flask.ext.login import logout_user

auth_print = Blueprint('auth_print', __name__)
login_manager = LoginManager()
login_manager.login_view = '/login'

class User(UserMixin):

  user_store = {}  # Stores the users that are already logged in.

  def __init__(self, user_id):
    self.user_store[user_id] = self  # add the user to the user_store
    self.username = user_id  # the user_id is in fact the username
    self.id = unicode(user_id)

  def sign_out(self):
    logout_user()
    try:
      del self.user_store[self.id]
    except KeyError:
      pass

  @classmethod
  def get(cls, user_id):
    return cls.user_store.get(user_id)

@login_manager.user_loader
def load_user(user_id):
  return User.get(user_id)

def get_current_user():
  return current_user

@login_required
@auth_print.route('/')
def user():
  return "Welcome, and thanks for logging in."

Then I have a small app I would like to add authentication to.

Small App

import the_above_module
app.register_blueprint(the_above_module.auth_print) # register the blueprint

@the_above_module.login_required
@app.route('/profile')
def protected():
    name = the_above_module.get_current_user().username
    return "Thank you for logging in."

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

Now I know the blueprint's @login_required is working because if I open the browser and go to localhost:8000/ I have to sign in.

However if I go to localhost:8000/profile the login_required decorator never gets triggered. I thus get an error because there is no current user.

Why would @login_required work in the blueprint and not in the app, even when im sure to maintain the same name spaces?

解决方案

You have to change the order of the decorators. Quoting the Flask documentation:

So how would you use that decorator now? Apply it as innermost decorator to a view function. When applying further decorators, always remember that the route() decorator is the outermost:

@app.route('/secret_page') 
@login_required 
def secret_page():
    pass

这篇关于@login_required麻烦在烧瓶的应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆