登录页面上的 POST 请求后在 Django 中生成的 MultiValueDictKeyError [英] MultiValueDictKeyError generated in Django after POST request on login page

查看:30
本文介绍了登录页面上的 POST 请求后在 Django 中生成的 MultiValueDictKeyError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试构建登录页面.我正在运行 Django 1.6.1.我一直在关注 www.fir3net.com/Django/django.html 上的教程.为方便起见,我会在这里转发很多.

错误信息:

请求方式:GET请求地址:http://127.0.0.1:8000/login/使用中的数据库:SQLite3Django 版本:1.6.1Python 版本:2.7.4已安装的应用程序:('django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','django.contrib.contenttypes','书签')安装的中间件:('django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.auth.middleware.RemoteUserMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware')追溯:get_response 中的文件/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py"114.响应=wrapped_callback(请求,*callback_args,**callback_kwargs)login_user 中的文件/home/tatenda/Documents/Programming/Django/Progs/django_bookmarks/bookmarks/views.py"17. 用户名 = request.POST['用户名']__getitem__ 中的文件/usr/local/lib/python2.7/dist-packages/django/utils/datastructures.py"301. 引发 MultiValueDictKeyError(repr(key))异常类型:MultiValueDictKeyError at/login/异常值:'用户名'"

查看代码(我知道这里调用的几个导入函数对于我的当前问题来说是多余的.大多数情况下,它们是尝试按照之前关于如何执行此操作的教程而产生的多余代码):

from django.http import*从 django.shortcuts 导入 render_to_response,重定向从 django.template 导入 RequestContext从 django.template 导入上下文从 django.template.loader 导入 get_template从 django.http 导入 HttpResponse, Http404从 django.contrib.auth.models 导入用户从 django.contrib.auth 导入验证、登录、注销从 django.views.decorators.csrf 导入 csrf_exempt, csrf_protect从 django.contrib.auth.decorators 导入 login_required定义登录用户(请求):用户名 = 密码 = ''用户名 = request.POST['用户名']密码 = request.POST['密码']用户 = 验证(用户名 = 用户名,密码 = 密码)如果用户不是无:如果 user.is_active:登录(请求,用户)return HttpResponseRedirect('/main_page/')return render_to_response('base.html', context_instance = RequestContext(request))@login_required(login_url = '/login/')定义主页面(请求):template = get_template('main_page.html')变量 = 上下文 ({'head_title':'Django 书签','page_title':'欢迎使用 Django 书签','page_body':'您存储和共享书签的地方!'})输出 = 模板.渲染(变量)返回 HttpResponse(输出)def user_page(请求,用户名):尝试:用户 = User.objects.get(用户名=用户名)除了:raise Http404('未找到请求的用户.')书签 = user.bookmark_set.all()template = get_template('user_page.html')变量 = 上下文({'用户名':用户名,'书签':书签})输出 = 模板.渲染(变量)返回 HttpResponse(输出)@csrf_exempt定义登录页面(请求):用户名 = request.POST['用户名']密码 = request.POST['密码']用户 = 身份验证(用户名 = 用户名,密码 = 密码)如果用户不是无:如果 user.is_active:登录(请求,用户)template = get_template('main_page.html')变量 = 上下文 ({'head_title':'Django 书签','page_title':'欢迎使用 Django 书签','page_body':'您存储和共享书签的地方!'})输出 = 模板.渲染(变量)返回 HttpResponse(输出)别的:raise Http404('账号被禁用,请联系管理员.')别的:raise Http404('无效登录.')

来自 urls.py 文件的信息:

from django.conf.urls 导入模式,包含,url从 django.contrib 导入管理员从 bookmarks.views 导入*admin.autodiscover()urlpatterns = 模式('',(r'^$', main_page),(r'^user/(w+)/$', user_page),url(r'^login/$', login_user),)

用于创建登录页面的基本模板(文件名为 base.html):
注意 - CSS 样式基于引导程序

<头>{% 块头 %}<link rel = "stylesheet" href = "style.css"/><标题>{% block title %}{% endblock %} - 我的网页</title></div>{% 结束块 %}<身体><div id = "content">{% 块内容 %}{% endblock %}</div><div id = "页脚">{% 块页脚 %}&复制;版权所有 2011 <a href="http://domain.invalid/">you</a>{% 结束块 %}

登录页面的 HTML 代码(文件名为 login.html):

{% 扩展 "base.html" %}{% 块主要 %}<div id = "登录"><form class = "form-horizo​​ntal" name = "LoginForm" action = "/login/" method = "post">{% csrf_token %}{% 如果下一个 %}<input type = "hidden" name = "next" value = "{{ next }}"/>{% 万一 %}<div类=控制组"><label class = "control-label" for = "username">Username</label><div 类 = "控件"><input type = "text" id = "username" placeholder = "Username">

<div类=控制组"><label class = "control-label" for = "password">Password</label><div 类 = "控件"><input type = "password" name = "password" id = "password" placeholder = "Password">

<div类=控制组"><div 类 = "控件"><按钮类型=提交"类=btn">登录</button>

</表单>

{% 结束块 %}

解决方案

我遇到了同样的错误,我这样做了,并且奏效了.更改:

username = request.POST['username']密码 = request.POST['密码']

到:

username = request.POST.get('username')密码 = request.POST.get('密码')

以上处理可能产生的 POST 和 GET 方法.我希望这会有所帮助.

I'm trying to build a login page. I'm running Django 1.6.1. I've largely been following the tutorial at www.fir3net.com/Django/django.html. For convenience I will repost a lot of it here.

Error Message:

Request Method: GET
Request URL: http://127.0.0.1:8000/login/

Database In Use: SQLite3 

Django Version: 1.6.1
Python Version: 2.7.4
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.contenttypes',
 'bookmarks')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.RemoteUserMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/tatenda/Documents/Programming/Django/Progs/django_bookmarks/bookmarks/views.py" in login_user
  17.   username = request.POST['username']
File "/usr/local/lib/python2.7/dist-packages/django/utils/datastructures.py" in __getitem__
  301.             raise MultiValueDictKeyError(repr(key))

Exception Type: MultiValueDictKeyError at /login/
Exception Value: "'username'"

View Code (I understand that several of the import functions called here are superfluous to my immediate problem. Mostly they are redundant code from trying to follow previous tutorials on how to do this):

from django.http import*
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
from django.template import Context
from django.template.loader import get_template
from django.http import HttpResponse, Http404
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.contrib.auth.decorators import login_required

def login_user(request):

    username = password = ''
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password = password)
    if user is not None:
        if user.is_active:
            login(request, user)
            return HttpResponseRedirect('/main_page/')
    return render_to_response('base.html', context_instance = RequestContext(request))

@login_required(login_url = '/login/')
def main_page(request):
    template = get_template('main_page.html')
    variables = Context ({
        'head_title':'Django Bookmarks',
        'page_title':'Welcome to Django Bookmarks',
        'page_body':'Where you store and share bookmarks!'
    })
    output = template.render(variables)
    return HttpResponse(output)

def user_page(request, username):
    try:
        user = User.objects.get(username=username)
    except:
        raise Http404('Requested user not found.')

    bookmarks = user.bookmark_set.all()
    template = get_template('user_page.html')
    variables = Context({
        'username':username,
        'bookmarks': bookmarks
    })
    output = template.render(variables)
    return HttpResponse(output)

@csrf_exempt
def login_page(request):

    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request,user)
            template = get_template('main_page.html')
            variables = Context ({
                'head_title':'Django Bookmarks',
                'page_title':'Welcome to Django Bookmarks',
                'page_body':'Where you store and share bookmarks!'
            })
            output = template.render(variables)
            return HttpResponse(output)
        else:
            raise Http404('Disabled account, please contact administrator.')
    else:
        raise Http404('Invalid login.')

Info from urls.py file:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from bookmarks.views import*

admin.autodiscover()

urlpatterns = patterns('',
    (r'^$', main_page),
    (r'^user/(w+)/$', user_page),
    url(r'^login/$', login_user),
)

Base Template Used to Create Login Page (the file is named base.html):
Note - the CSS styling is bootstrap based

<!DOCTYPE html>
<html>
    <head>
        {% block head %}
            <link rel = "stylesheet" href = "style.css" />
            <title> {% block title %}{% endblock %} - My Webpage</title></div>
        {% endblock %}
    </head>
    <body>
        <div id = "content">{% block content %}{% endblock %}</div>
        <div id = "footer">
            {% block footer %}
                &copy; Copyright 2011 by <a href="http://domain.invalid/">you</a>
            {% endblock %}
        </div>
    </body>
</html>

HTML Code for the Login Page (the file is named login.html):

{% extends "base.html" %}
{% block main %}
    <div id = "login">
        <form class = "form-horizontal" name = "LoginForm" action = "/login/" method = "post">
        {% csrf_token %}
        {% if next %}
            <input type = "hidden" name = "next" value = "{{ next }}" />
        {% endif %}
        <div class = "control-group">
            <label class = "control-label" for = "username">Username</label>
            <div class = "controls">
                <input type = "text" id = "username" placeholder = "Username">
            </div>
        </div>
        <div class = "control-group">
            <label class = "control-label" for = "password">Password</label>
            <div class = "controls">
                <input type = "password" name = "password" id = "password" placeholder = "Password">
            </div>
        </div>
        <div class = "control-group">
            <div class = "controls">
                <button type = "submit" class = "btn">Login</button>
            </div>
        </div>
        </form>
    </div>
{% endblock %}

解决方案

I had the same error, and i did this and it worked. Change:

username = request.POST['username']
password = request.POST['password'] 

to:

username = request.POST.get('username')
password = request.POST.get('password')

The above handles both the POST and GET methods that may result. I hope this helped.

这篇关于登录页面上的 POST 请求后在 Django 中生成的 MultiValueDictKeyError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
Python最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆