Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python @在flask应用程序中登录时遇到问题_Python_Flask_Flask Login_Login Required - Fatal编程技术网

Python @在flask应用程序中登录时遇到问题

Python @在flask应用程序中登录时遇到问题,python,flask,flask-login,login-required,Python,Flask,Flask Login,Login Required,我已经创建了一个处理身份验证的蓝图。这个蓝图使用Flask登录。并具有以下内容,以及更多未显示的代码 在蓝图中,我有以下内容: 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 im

我已经创建了一个处理身份验证的蓝图。这个蓝图使用Flask登录。并具有以下内容,以及更多未显示的代码

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

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."
然后我有一个小应用程序,我想添加身份验证

小型应用程序

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)
现在我知道blueprint的@login_required正在工作,因为如果我打开浏览器并转到localhost:8000/我必须登录

但是,如果我转到localhost:8000/profile,则不会触发登录所需的装饰程序。因此,我得到一个错误,因为没有当前用户


为什么@login\u required会在蓝图中工作,而不是在应用程序中工作,即使我确定要保留相同的名称空间?

您必须更改装饰程序的顺序。引述:

那你现在怎么用那个装饰器呢?将其作为最内层应用 视图函数的装饰器。当应用进一步的装饰时,始终 请记住,route()装饰器是最外层的:

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

当我们希望用户不要访问私有页面或需要登录的页面时,flask提供了decorators

@app.route(“/welcome”)
@需要登录#如果用户未登录,则会重定向到未经授权的#处理程序
def welcome_page():
返回“欢迎用户”
@login_manager.unauthorized_handler#在unauthorized_handler中,我们有一个回调URL
def unauthorized_callback():#在回拨url中,我们可以指定要回拨的位置
return redirect(url_代表('login'))#在我的例子中,它是登录页面!

我希望你的问题得到解决

请解释你的答案为什么/如何解决这个问题。
@login_manager.unauthorized_handler
def unauthorized_callback():
    return redirect(url_for('website.index'))