在Django视图中缺少POST数据

时间:2013-06-13 19:37:44

标签: python django post

我正在尝试将一些登录数据传递到Django应用程序中的视图,但我没有获得视图的POST数据。首先是带登录界面的模板。

<form method="post" action="login">
{% csrf_token %}
    Username<input type="text" name="username"><br />
    Password<input type="password" name="password"><br />
    <input type="submit" value="Login" />
</form>

接下来,我将此传递给我的登录视图,该视图在我的views.py中定义如下,这是问题发生的地方。

from django.contrib.auth import authenticate, login
def login(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    #logic with directing user to the login page again or to the access they need

在我尝试分配给用户名变量的行上,我收到错误:

MultiValueDictKeyError at /minion/login
"Key 'username' not found in <Querydict: {}>"
Request Method: GET
Request URL: http://127.0.0.1:8000/minion/login
Django Version: 1.5.1

奇怪的是,在页面的“请求信息”部分中,它表示没有POST信息或GET信息。我不确定A.为什么它说请求方法是GET,因为我在模板和B中指定了POST。为什么没有POST或GET数据。如果有人知道我在Django / Python中使用POST数据可能会缺少的东西,或者需要另一条信息,那就太棒了。提前感谢您的帮助。

编辑:一些进展。 我通过放入完整路径设法让页面通过第一个建议的反向错误加载。此时我的问题的关键在于弄清楚如何使表单数据作为POST而不是GET进入视图函数。

编辑:这是我在应用程序目录中的urls.py文件

from django.conf.urls import patterns, include, url

urlpatterns = patterns('Minion.views',
    url(r'^$', 'home'),
    url(r'^login/$', 'login'),
    #some other unrelated pages are here, I haven't done anything with them yet though
)

4 个答案:

答案 0 :(得分:5)

您正在被重定向。

您的表单操作(即目标)仅为login。但Django的默认配置是使用最终斜杠结束所有URL,如果URL不这样做则重定向:因此浏览器将从/login重定向到/login/。重定向始终是GET,因此POST数据会丢失。

使用action="/login/",一切都会好的。

答案 1 :(得分:2)

似乎您有GET请求而不是POST或

之前或之后
Request Method: GET
Request URL: http://127.0.0.1:8000/minion/login

我认为您应该检查请求方法

from django.contrib.auth import authenticate, login
def login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
    # otherwise create page with form or redirect

有可能POST请求是意外的并且是通过某种重定向完成的(例如没有尾随斜杠会导致重定向)你应该关心这种情况。

答案 2 :(得分:1)

将操作更改为“{%'Minion.views.authUser'%}并将视图功能更改为authUser,因为它与auth模块中导入的登录功能冲突,一切正常。

答案 3 :(得分:0)

试试这个,它会在你的views.py

中有效
from django.contrib.auth import authenticate, login
def login(request):
    if request.method == 'POST':
       data = request.POST
       username = data['username']
       password = data['password']
       user = authenticate(username=username, password=password)