Django 運行報異常:AttributeError: 'str' object has no attribute 'get'


Technorati Tags: Python, Django, Web
在使用 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的運行原理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM