2013-05-18 11 views
5

私は自分のためにスーパーシンプルなWebアプリケーションを構築しようとしています。私は唯一のユーザーになるので、ユーザー管理のためにデータベースを組み込む必要はないと思う。フラスコログインを使用しようとしていますが、login_userへの私の呼び出しが成功したにもかかわらず、@login_requiredのページへのリダイレクト後も401-Unauthorizedページが表示されます。静的なユーザーとのFlask-loginはいつも寄与する401-無許可

from flask import Flask, render_template, request, flash, redirect, url_for 
from flask.ext.login import LoginManager, login_user, logout_user, current_user, login_required, UserMixin 

app = Flask(__name__, static_url_path="") 
app.secret_key = "[redacted]" 

login_manager = LoginManager() 
login_manager.init_app(app) 
#login_manager.login_view = "login" 

class User(UserMixin): 
    def __init__(self, id): 
     self.id = id 

nathan = User('nathan') 

@login_manager.user_loader 
def load_user(userid): 
    if userid == 'nathan': 
     return nathan 
    else: 
     return None 

@app.route("/logout") 
@login_required 
def logout(): 
    logout_user() 
    return redirect(url_for('login')) 

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

@app.route("/login", methods=["GET", "POST"]) 
def login(): 
    if request.method == 'POST': 
     if request.form['username'] == 'nathan'\ 
       and request.form['password'] == '[redacted]': 
      login_user(nathan, remember=True) 
      flash('logged in...', 'success') 
      return redirect(request.args.get("next") or url_for("index")) 
     else: 
      flash('Incorrect username or password. Try again.', 'error') 

    return render_template("login.html"); 

if __name__ == "__main__": 
    app.run(host="0.0.0.0", debug=True) 

私は(login_user戻り真)ログインが実際に成功したことを確認したとそのload_usernathanオブジェクトを返している:ここでは私のアプリの全体です。

[編集]また、私は現在、Flask開発サーバーを使用しています(該当する場合)。

どこが間違っているのかわかりません。前もって感謝します!

+0

データベースなしでフラスコログインを使用できるかわかりません。セッションを保存するには何らかの方法が必要です。 – computmaxer

+0

セッション情報はすべてデータベースではなくクッキーに保存されていると思っていました。 – gnathan

+0

私はもう少しクッキーを読むことをお勧めします。要するに、クッキーとは、ブラウザがドメインごとに格納するもので、そのドメインへのすべての要求とと​​もに送信されます。セッションクッキーは単にセッションIDで構成され、セッションIDはアプリケーションが要求を受信したときに参照する役割を担います。アプリケーションは、セッションIDに対応するセッションに関するいくつかの情報(期限切れ時間など)をまだ保存する必要があります。 Flask-loginはこれをすべて処理しますが、それらのセッションを保存するには何らかの方法が必要です。 – computmaxer

答えて

4

更新:

フラスコ-ログインの新しいバージョン(0.2.2)ので、これはこれ以上の問題です。 thisコミットの変更を確認してください。

古いバージョンを使用している場合は、をお読みください。


ここでの問題はstatic_url_path=""です。 Flask-Loginが機能するには、空文字列static_url_pathを使用できません。フラスコ・ログイン・ソース(古いバージョン)でfollowing lines

これを明らかにする:

if (current_app.static_url_path is not None and 
    request.path.startswith(current_app.static_url_path) 
): 
    # load up an anonymous user for static pages 
    _request_ctx_stack.top.user = self.anonymous_user() 
    return 

をごstatic_url_pathのでこと""あるすべてのページの静的なページのような行為を訪問するための条件は、Trueと評価された場合したがってFlask-Loginは、実際のユーザを読み込むのを続ける代わりに、匿名ユーザを常にロードします(load_userコールバックを使用)。


はまた、あなたがまだ静的なフォルダとしてアプリ自体のルートフォルダを使用したい場合は、SharedDataMiddleWareを使用して、thisソリューションを見てみましょう#login_manager.login_view = "login"


のコメントを解除することを忘れないでください:

app.debug = True 
if app.config['DEBUG']: 
    from werkzeug import SharedDataMiddleware 
    import os 
    app.wsgi_app = SharedDataMiddleware(app.wsgi_app, { 
     '/': os.path.dirname(__file__) 
    }) 

if __name__ == "__main__": 
    app.run(host="0.0.0.0") 
+1

うわー、素晴らしい答え。本当にありがとう! SharedDataMiddleWareソリューションは私にとってもうってつけの機能です。 – gnathan

+0

あなたを歓迎して、喜んで助けてください! –

+1

Flask-Loginの最新バージョン(0.2.7)で修正される可能性があります。私はそのバージョンの静的なファイルパスへの参照が表示されません。 – craigb

関連する問題