title: Flask-Login:Where user_loader callback should be defined?
body: <p>I am new to python coding but straightaway started experimenting with flask. I am having trouble with flask-login extension
  Here I am making a simple application which is a blog. This blog is going to be used by one person only.</p>
  
  <p>I cannot understand why the user_loader decorator not working which is defined in models.py. I get exception the application NoneType object is not callable.
  My app structure is like this </p>
  
  <pre><code>.
  |-- app
  |   |-- admin
  |   |   |-- __init__.py
  |   |   |-- static
  |   |   |-- templates
  |   |   `-- views.py
  |   |-- config.py
  |   |-- __init__.py
  |   |-- main
  |   |   |-- __init__.py
  |   |   |-- static
  |   |   |-- templates
  |   |   `-- views.py
  |   `-- models.py
  `-- launch.py
  </code></pre>
  
  <p>app.<strong>init</strong></p>
  
  <pre><code>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'
  </code></pre>
  
  <p>In app.models I have defined User class which does not load users from database. In fact it simply loads user from configuration. In same file I have also defined user_loader callback</p>
  
  <pre><code>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
  </code></pre>
  
  <p>admin.<strong>init</strong></p>
  
  <pre><code>from flask import Blueprint
  
  admin=Blueprint('admin',__name__,template_folder='templates',static_folder='static')
  from . import views
  </code></pre>
  
  <p>admin.views</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>Whenever i run the routes which have login_required i get the error 
  TypeError: 'NoneType' object is not callable. Here is the traceback.</p>
  
  <pre><code>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 &lt;lambda&gt;
      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
  </code></pre>