私はこのように私自身のミドルウェアを書くことにしたいくつかの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)を返します)、これは私の設定やミドルウェアを使っていますいい考えではありませんでした...
関連するビューも追加してください。私は個人的にこのような状況でミドルウェアを使用する目的を理解していませんでしたが、Djangoはログインやログアウトのための適切なモジュールを提供しています。 –
私の意見はミドルウェアにあるすべての仕事を引き起こす原因ではありません。実際には、その中にdjangoログインを使用しています。ログインビューとログアウトビューには次の行があります。return HttpResponseRedirect(request.META.get( 'HTTP_REFERER'))。ミドルウェアを使用しているのは、私のサイトのどこにでも、HTMLの中ではなく私のサイトでこのフォームを使用したいからです。 – juankysmith
Djangoの認証ミドルウェアは、テンプレート継承を使用している場合、 'dict'に' (あなたがすべきです)_、あなたはbase.htmlにフォームを置くことができます。これはすべてのページにロードされます。 –