django.contrib.auth用戶機制進行用戶的驗證、登錄、注銷操作時,遇到這個異常。
首先是寫了一個登錄的視圖,要求如果用戶登錄成功,則頁面跳轉到用戶主頁(home):
from django.shortcuts import redirect from django.template.loader import get_template from django.http import HttpResponse from django.contrib.auth import authenticate, login, logout from django.contrib import messages def user_login(request): if request.method == 'POST': loginForm = login_form.LoginForm(request.POST) if loginForm.is_valid(): login_name = request.POST['username'].strip() login_password = request.POST['password'] user = authenticate(request, username=login_name, password=login_password) if user is not None: if user.is_active: login(request, user=user) return '/home/' else: messages.error(request, '用戶已被禁用。請聯系網站管理員') else: messages.error(request, '用戶不存在。') else: messages.error(request, '請檢查輸入的用戶名和密碼') else: loginForm = login_form.LoginForm() template = get_template('login.html') html = template.render(locals(), request) return HttpResponse(html)
運行后,當輸入用戶名和密碼后,點擊“登錄”時,報如下錯誤:
Internal Server Error: / Traceback (most recent call last): File "d:\ProgramData\Anaconda3\lib\site-packages\django\core\handlers\exception.py", line 47, in inner response = get_response(request) File "d:\ProgramData\Anaconda3\lib\site-packages\django\utils\deprecation.py", line 116, in __call__ response = self.process_response(request, response) File "d:\ProgramData\Anaconda3\lib\site-packages\django\middleware\clickjacking.py", line 26, in process_response if response.get('X-Frame-Options') is not None: AttributeError: 'str' object has no attribute 'get' [15/Nov/2020 23:07:06] "POST / HTTP/1.1" 500 69094
之前沒有使用Django的認證機制,程序運行正常,怎么使用了反倒報錯了呢。網上找了很久,也沒有對應的異常和解決方案。
終於,不經意間,發現了一行代碼,第19行:return '/home/',本意是跳轉到用戶的主頁,但這個寫法是錯誤的,應該是:
return redirect('/home'/)
修改之后,正常運行沒有報異常,頁面也可以跳轉到預期的用戶主頁。
另外,推薦一篇文章:django從請求到響應的過程,文章很詳細地講解了Django的運行原理。
