1

我正在尝试将一些登录数据传递给 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,因为我在模板中指定了 POST 和 B.为什么没有 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

4 回答 4

5

您正在被重定向。

您的表单操作(即目的地)只是login. 但是 Django 的默认配置是用最后一个斜杠结束所有 URL,如果 URL 没有这样做,则重定向:所以浏览器被重定向/login/login/. 重定向始终是 GET,因此 POST 数据会丢失。

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

于 2013-06-13T19:59:01.463 回答
2

It seems that You have GET request instead of POST or after or before

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

I think You should have check for request method

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

There is possibility that POST request is unexpected and is done by some kind of redirect (for example absence of trailing slash can cause redirect) You shoud care about this case.

于 2013-06-13T19:50:42.030 回答
1

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

于 2013-06-13T20:40:58.780 回答
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)
于 2013-06-14T10:43:47.127 回答