Python Flask登录:应在何处定义用户\加载程序回调?

Python Flask登录:应在何处定义用户\加载程序回调?,python,flask,flask-login,Python,Flask,Flask Login,我不熟悉python编码,但很快就开始尝试使用flask。我的登录扩展有问题 在这里,我做了一个简单的应用程序,这是一个博客。这个博客只供一个人使用 我无法理解为什么models.py中定义的用户_loader decorator不工作。我得到一个异常,应用程序非类型对象不可调用。 我的应用程序结构是这样的 . |-- app | |-- admin | | |-- __init__.py | | |-- static | | |-- templates | |

我不熟悉python编码,但很快就开始尝试使用flask。我的登录扩展有问题 在这里,我做了一个简单的应用程序,这是一个博客。这个博客只供一个人使用

我无法理解为什么models.py中定义的用户_loader decorator不工作。我得到一个异常,应用程序非类型对象不可调用。 我的应用程序结构是这样的

.
|-- app
|   |-- admin
|   |   |-- __init__.py
|   |   |-- static
|   |   |-- templates
|   |   `-- views.py
|   |-- config.py
|   |-- __init__.py
|   |-- main
|   |   |-- __init__.py
|   |   |-- static
|   |   |-- templates
|   |   `-- views.py
|   `-- models.py
`-- launch.py
应用程序init

from flask import Flask
from main import main
from admin import admin
from flask.ext.script import Manager
from .config import config
from flask_debugtoolbar import DebugToolbarExtension
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy import Column
from flask_bootstrap import Bootstrap
from flask.ext.moment import Moment
from flask.ext.login import LoginManager


app_myblog=Flask(__name__)
app_myblog.debug=True
app_myblog.config.from_object(config)
app_myblog.register_blueprint(main)
app_myblog.register_blueprint(admin,url_prefix="/admin"
toolbar=DebugToolbarExtension(app_myblog)
manager=Manager(app_myblog)
db=SQLAlchemy(app_myblog)
Bootstrap(app_myblog)
moment=Moment(app_myblog)

login_manager=LoginManager()
login_manager.init_app(app_myblog)
login_manager.session_protection='strong'
login_manager.login_view='admin.login'
from flask import Blueprint

admin=Blueprint('admin',__name__,template_folder='templates',static_folder='static')
from . import views
在app.models中,我定义了不从数据库加载用户的用户类。事实上,它只是从配置中加载用户。在同一个文件中,我还定义了用户\加载程序回调

class User(UserMixin):
    def __init__(self):
        self.id='1'
        self.name=app_myblog.config['USERNAME']
        self.password=app_myblog.config['PASSWORD']

    def get_id(self):
        return unicode(id)

@login_manager.user_loader
def load_user(userid):
    u=User()
    if u.get_id()==userid:
        return u
    else:
        return None
管理。init

from flask import Flask
from main import main
from admin import admin
from flask.ext.script import Manager
from .config import config
from flask_debugtoolbar import DebugToolbarExtension
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy import Column
from flask_bootstrap import Bootstrap
from flask.ext.moment import Moment
from flask.ext.login import LoginManager


app_myblog=Flask(__name__)
app_myblog.debug=True
app_myblog.config.from_object(config)
app_myblog.register_blueprint(main)
app_myblog.register_blueprint(admin,url_prefix="/admin"
toolbar=DebugToolbarExtension(app_myblog)
manager=Manager(app_myblog)
db=SQLAlchemy(app_myblog)
Bootstrap(app_myblog)
moment=Moment(app_myblog)

login_manager=LoginManager()
login_manager.init_app(app_myblog)
login_manager.session_protection='strong'
login_manager.login_view='admin.login'
from flask import Blueprint

admin=Blueprint('admin',__name__,template_folder='templates',static_folder='static')
from . import views
管理视图

from flask import render_template,request,redirect,url_for
from . import admin
from flask.ext.login import login_required,login_user
from flask_wtf.form import Form
from wtforms import StringField,PasswordField,SubmitField
from ..models import User



class LoginForm(Form):
    username=StringField('Username')
    password=PasswordField('Password')
    submit=SubmitField('Login')


@admin.route('/')
@login_required
def index():
    return render_template('admin_home.html')


@admin.route('/login',methods=['GET','POST'])
def login():
    form=LoginForm()
    if form.validate_on_submit():
        login_user(User())
        nextx = request.args.get('next')
        return redirect(nextx or url_for('admin.index'))
    return render_template('admin_login.html',form=form)
每当我运行需要登录的路由时,我都会收到错误消息 TypeError:“非类型”对象不可调用。这是回溯

Traceback (most recent call last):
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/flask_debugtoolbar/__init__.py", line 125, in dispatch_request
    return view_func(**req.view_args)
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/flask_login.py", line 756, in decorated_view
    elif not current_user.is_authenticated():
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/werkzeug/local.py", line 338, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/werkzeug/local.py", line 297, in _get_current_object
    return self.__local()
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/flask_login.py", line 46, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/flask_login.py", line 794, in _get_user
    current_app.login_manager._load_user()
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/flask_login.py", line 363, in _load_user
    return self.reload_user()
  File "/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site-packages/flask_login.py", line 325, in reload_user
    user = self.user_callback(user_id)
TypeError: 'NoneType' object is not callable
回溯(最近一次呼叫最后一次):
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/flask/app.py”,第1836行,在调用中__
返回self.wsgi_应用程序(环境,启动响应)
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/flask/app.py”,第1820行,在wsgi_应用程序中
响应=self.make\u响应(self.handle\u异常(e))
文件“/home/shivam/Workspaces/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/flask/app.py”,第1403行,在句柄中
重放(exc_类型、exc_值、tb)
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/flask/app.py”,第1817行,在wsgi_应用程序中
response=self.full\u dispatch\u request()
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/flask/app.py”,第1477行,完整发送请求
rv=自身处理用户异常(e)
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/flask/app.py”,第1381行,在handle\u user\u exception中
重放(exc_类型、exc_值、tb)
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/flask/app.py”,第1475行,完整发送请求
rv=自我分派请求()
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/flask_debugtoolbar/_init__.py”,第125行,在调度请求中
返回视图函数(**请求视图参数)
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/flask\u login.py”,第756行,在装饰视图中
elif不是当前用户。是否验证了用户身份()
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/werkzeug/local.py”,第338行,在__
返回getattr(self.\u get\u current\u object(),name)
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/werkzeug/local.py”,第297行,位于“获取当前对象”中
返回self.\uuu local()
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/flask_login.py”,第46行,在
当前用户=本地代理(lambda:\u get\u user())
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/flask\u login.py”,第794行,在“get\u user”中
当前应用程序登录管理器。加载用户()
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/flask\u login.py”,第363行,在加载用户中
返回self.reload_user()
文件“/home/shivam/workspace/PythonWorkSpace/MyBlog/venv/lib/python2.7/site packages/flask_login.py”,第325行,在reload_user中
user=self.user\u回调(user\u id)
TypeError:“非类型”对象不可调用
编辑: 我创建了一个最小的代码示例,不同之处在于我删除了
get\u id(self)
函数(+一些不需要的额外库),因为它是您继承的
UserMixin
类的一部分

您确定您的表单正在得到验证吗?你能描述一下你是如何一步一步地测试这个的吗?我的意思是,“转到login.html”->“输入凭证”->,等等


确保是哪个调用导致了崩溃,是登录函数中的
重定向吗?

您应该在实例化登录管理器的相同位置定义方法

阿拉


或者从模块中导入loginmanager实例并在视图中定义。

这并不能解决问题。用户加载程序回调甚至不会执行。登录正常。重定向也正常。但当重定向页面打开时,应用程序就会崩溃。我想它找不到回调函数,我有同样的问题。这两个问题都没有回答,文件也没有说明。