2012-03-05 9 views
0

私はこのように私自身のミドルウェアを書くことにしたいくつかのSOの答え、次の後に、私のウェブサイト上のどこにでもログインフォームを入れたい:私のsettings.pyでジャンゴ - ミドルウェア問題

class LoginFormMiddleware(object): 
''' 
Put a login form in everypage of the website 
''' 
def process_request(self, request): 
    # if the top login form has been posted 
    if request.method == 'POST': 
     if 'logout_submit' in request.POST: 
      # log the user out 
      from django.contrib.auth import logout 
      logout(request) 
      form = LoginForm() 
     elif 'login_submit' in request.POST: 
      # validate the form 
      form = LoginForm(data=request.POST) 
      if form.is_valid(): 
       # log the user in 
       from django.contrib.auth import login 
       login(request, form.get_user()) 
     else: 
      form = LoginForm(request) 
    else: 
     form = LoginForm(request) 
    # attach the form to the request so it can be accessed 
    # within the templates 
    request.login_form = form 

を、私は持っています:

import django.conf.global_settings as DEFAULT_SETTINGS 
... 
MIDDLEWARE_CLASSES = DEFAULT_SETTINGS.MIDDLEWARE_CLASSES + (
    'base.mymiddleware.LoginFormMiddleware', 
) 
TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_SETTINGS.TEMPLATE_CONTEXT_PROCESSORS + (
    'django.core.context_processors.request', 
) 

フォームは、どこからでもaccesedするbase.htmlで、次のようになります。

{% if user.is_authenticated %} 
      <div class="login_box"> 
       <form action="/myapp/logout/" method="post">{% csrf_token %} 
        <div class="col2"><a>{{ user.username }}</a></div> 
        <div class="col3"><input type="submit" value="Logout" name="logout_submit"/></div> 
       </form> 
      </div> 
     {% else %} 
       <form action="." method="post"> 
        {% csrf_token %} 
        <div class="login_box"> 
         <div class="error_box"> 
          {% if request.login_form.errors %} 
           Incorrect User/Password 
          {% endif %} 
         </div> 
         <div class="col00"> <h4>{{ request.login_form.username.label_tag }}</h3></div> 
         <div class="col11">{{ request.login_form.username }}</div> 
         <div class="col22"><h4>{{ request.login_form.password.label_tag }}</h3></div> 
         <div class="col33">{{ request.login_form.password }}</div> 
         <div class="col44"><input type="submit" value="Login" name="login_submit"/></div> 
         <input type="hidden" name="next" value="{{ request.get_full_path }}" /> 
        </div> 
       </form> 
     {% endif %} 

ログインnormall作品私はGETリクエストを行うたびに、user.is_authenticatedがfalseを返すようですが、私が見るものはログアウトフォームの代わりに空のLoginFormです。

私のミドルウェアに問題があるかどうかはわかりません(request.method!= 'POST'はフォーム= LoginForm(request)を返します)、これは私の設定やミドルウェアを使っていますいい考えではありませんでした...

+0

関連するビューも追加してください。私は個人的にこのような状況でミドルウェアを使用する目的を理解していませんでしたが、Djangoはログインやログアウトのための適切なモジュールを提供しています。 –

+0

私の意見はミドルウェアにあるすべての仕事を引き起こす原因ではありません。実際には、その中にdjangoログインを使用しています。ログインビューとログアウトビューには次の行があります。return HttpResponseRedirect(request.META.get( 'HTTP_REFERER'))。ミドルウェアを使用しているのは、私のサイトのどこにでも、HTMLの中ではなく私のサイトでこのフォームを使用したいからです。 – juankysmith

+0

Djangoの認証ミドルウェアは、テンプレート継承を使用している場合、 'dict'に' (あなたがすべきです)_、あなたはbase.htmlにフォームを置くことができます。これはすべてのページにロードされます。 –

答えて

1

私はこのようなロジックをミドルウェアに置くことを主張するSOの答えを見たことがないと思います。 (あなたが持っているなら、私はそれらをdownvoteできるようにリンクを投稿してください)

これは本当に、本当に本当にこの種のことをする場所ではありません。特定のビューを作成し、ログインフォームのアクションパラメータをそのビューに設定します。

しかし、あなたの根底にある問題は、ユーザーオブジェクトがテンプレートに渡されないように、他のビューをレンダリングするためにRequestContextを使用していないということです。

+0

http://stackoverflow.com/questions/2734055/putting-a-django-login-form-on-every-page – juankysmith

+0

@juankysmithだから私たちは '@ login_required'デコレータを持っています –

+0

私の無知私はデコレータとすべてのビューの後にフォームを表示するという事実の関係を見ることはできません – juankysmith

0

あなたの実装はあまり意味がありません。アクション属性を持つログインフォームは「。」です。間違っており、紛争につながる。

ログインビュー、ログインミドルウェアではありません。ログインフォームのアクション属性は、ログインビューの逆のURLにする必要があります。あなたのログインフォームで

、あなたは、例えば次の非表示の入力を指定する必要があります。

<input name="next" type="hidden" value="{{ request.POST.next|default:request.path }}" /> 

それに続いて、それはあなたのベーステンプレートであるか、どこかのウェブサイトですることができます。

これはログアウトにも有効です。

+0

...すべてのビューの戻り値にフォームを渡す必要がありますか? – juankysmith

+0

なぜあなたはそれをしたいですか?フォームのHTMLを貼り付けるだけです。これは、betspire.com上で我々が持っているものです。シンプルでシンプルです。 – jpic

+0

はい、私がしたいことは、ベットピアーのようなログインです。ログイン用のビューを使用していますか? – juankysmith