根據幾個other SO answers,我使用中間件在我的項目的每個頁面上顯示登錄表單,以便用戶可以在原地登錄。我知道有些人對此感到不滿,但它的確提供了更好的用戶體驗。理想情況下它會是異步的,但我還沒有到達那裏。Django LoginForm中間件基於類視圖
反正middleware.py:
from MyProj.forms import MyProjTopLoginForm
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
#Notes: https://stackoverflow.com/questions/2734055/putting-a-django-login-form-on-every-page
class LoginFormMiddleware(object):
def process_request(self, request):
# if the top login form has been posted
if request.method == 'POST' and 'top_login_form-username' in request.POST:
# validate the form
form = MyProjTopLoginForm(prefix="top_login_form", data=request.POST)
if form.is_valid():
# log the user in
from django.contrib.auth import login
login(request, form.get_user())
# if this is the logout page, then redirect to/
# so we don't get logged out just after logging in
if reverse('logout') in request.get_full_path():
return HttpResponseRedirect('/')
#return HttpResponseRedirect('/')
else:
form = MyProjTopLoginForm(request, prefix="top_login_form")
# attach the form to the request so it can be accessed within the templates
request.top_login_form = form
class LogoutFormMiddleware(object):
def process_request(self, request):
if request.method == 'POST' and request.POST.has_key('logout-button') and request.POST['logout-button'] == 'logout':
from django.contrib.auth import logout
logout(request)
request.method = 'GET'
和views.py:
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.db.models import Count
from django.core.urlresolvers import reverse
from django.views.generic import TemplateView
class Index(TemplateView):
template_name = 'KReport2/index.djhtml'
'''
def index(request):
return render(request, 'KReport2/index.djhtml')
'''
def logoutpage(request):
from django.contrib.auth import logout
logout(request)
return redirect(index)
你會注意到,我的評論舊索引視圖功能,並以團體取代了它基於視圖。通常我不會繼承子類,而是在urls.py中傳遞template_name,但這裏除了這一點之外。我的問題似乎是中間件斷了。在索引頁填寫UN/Pass,然後提交,中間件捕獲表單並將我登錄,但是然後django繼續返回一個空白的http響應。沒有錯誤,但也沒有渲染索引頁面。我只是不知道休息是在哪裏發生的。
巨大!很好的回答,謝謝。雖然我發現LogoutFormMiddleware已經解決了這個問題,只需在註銷之後通過設置request.method ='GET'來完成,這樣視圖就可以通過GET方法結束處理,從而解決問題。在我看來,最好是發佈重定向到相同的URL,雖然我不確定優點會是什麼(可能是一點速度) – 2013-04-23 22:45:16
不重定向理論上更快,但我不知道如果用戶會注意到實踐中的任何差異。改變中間件中的'request.method'對我來說似乎很難受。就個人而言,我會避免這樣做。在成功發佈帖子後重新定向是一個很好的習慣。在這種情況下,這不是必需的,因爲沒有風險例如兩次處理付款。如果用戶在登錄後立即刷新頁面,重定向將阻止用戶獲得「是否要重新提交請求」確認消息。我認爲這是一個可用性改進。 – Alasdair 2013-04-24 00:13:20
是的,我完全同意,很好的捕捉。重定向它。 – 2013-04-25 00:18:40