Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django测试客户端在登录后返回匿名用户_Python_Django - Fatal编程技术网

Python Django测试客户端在登录后返回匿名用户

Python Django测试客户端在登录后返回匿名用户,python,django,Python,Django,我使用以下代码在Django中实现了用户登录 在myurl.py中 . . . url(r'^login/', UserLogin.as_view(), name='userlogin'), . . 在我看来.py . . from django.contrib.auth.forms import AuthenticationForm . . . class UserLogin(FormView): form_class = AuthenticationForm

我使用以下代码在Django中实现了用户登录

在myurl.py中

.
.
.
    url(r'^login/', UserLogin.as_view(), name='userlogin'),
.
.
在我看来.py

.
.
from django.contrib.auth.forms import AuthenticationForm    
.
.
.
class UserLogin(FormView):
    form_class = AuthenticationForm
    template_name = "auth/login.html"

    def get_success_url(self):
        return reverse('userhome', kwargs={'pk': self.request.user.id})
.
.
.
我的auth/login.html是

{% block head %}
  <title>Open Radio | Login</title>
{% endblock %}

{% block body %}
  <header>
    <h1>Open Radio</h1>
    <h2>Login Page</h2>
  </header>

  <section>
    {% if form.errors %}
      <p>Your username and password didn't match, please try again.  </p>
    {% endif %}

    <form method="post" action=".">
      {% csrf_token %}
      <p>
        <label for="id_username">Username:</label>
        {{ form.username }}
      </p>
      <p>
        <label for="id_password">Password:</label>
        {{ form.password }}
      </p>
      {% if next %}
        <input type="hidden" name="next" value="{{ next }}" />
      {% endif %}
      <input type="submit" value="login" />
    </form>
  </section>
{% endblock %}
我得到以下失败

self = <stationrunner.tests.TestLoginPage testMethod=test_page_logs_in>

    def test_page_logs_in(self):
        """
        Tests if the login page actually logs a user in
        """
        username = "someusername"
        password = "somepassword"
        user = User(username=username,
                    password=password)
        user.save()
        response = self.client.post(reverse("userlogin"),
                                    {"username":username,
                                     "password":password},
                                    follow=True)
>       assert response.context["user"].is_authenticated()
E       AssertionError: assert <bound method   AnonymousUser.is_authenticated of   <django.contrib.auth.models.AnonymousUser object at 0x7f54b5433a50>>()
E        +  where <bound method AnonymousUser.is_authenticated of  <django.contrib.auth.models.AnonymousUser object at 0x7f54b5433a50>> =   <SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at   0x7f54b5433a50>>.is_authenticated
self=
def测试页面记录(自):
"""
测试登录页面是否确实让用户登录
"""
username=“someusername”
password=“somepassword”
用户=用户(用户名=用户名,
密码=密码)
user.save()
response=self.client.post(反向(“用户登录”),
{“用户名”:用户名,
“password”:password},
follow=True)
>assert response.context[“user”]是否经过身份验证()
E断言错误:断言()
E+其中=。是否已验证

有人能解释一下为什么会发生这种情况吗?

登录不会成功,因为Django希望密码是散列,但您已将其保存为纯文本。改为这样做:

user = User.objects.create_user(username=username, password=password)
编辑

你的问题很简单,你的UserLogin视图,不管名称如何,从来没有真正让用户登录。AuthenticationForm执行其名称所暗示的操作,即进行身份验证,但随后不会对经过身份验证的用户执行任何操作以使其登录


至少,您需要在视图中的某个位置调用
login()
;但是,您似乎没有理由在这里使用自己的自定义视图,而不是内置的
django.contrib.auth.views.login
视图。

非常感谢。这个问题现在解决了,但我现在有一个新问题<代码>E NoReverseMatch:找不到参数为“()”且关键字参数为“{pk':None}”的“userhome”的反向。尝试了1个模式:['(?P\\d+/')]这是什么意思??创建时是否也需要提供pk?那不可能/不应该如此正确!?或者我遗漏了什么?需要更多的上下文:这个错误不是来自您在这里显示的任何代码。您在哪里为“userhome”调用
reverse
(或使用
{%url%}
标记)?作为一个新问题,这可能更好。它就在那里。它来自UserLogin视图的
get\u success\u url()
方法(请参阅my views.py)。问题不在于我何时运行我的项目。如前所述,它工作得很好。我考试的时候到了。i、 e.在我按照您刚才教给我的方式创建对象后,在完成其工作后,UserLogin视图无法转到其成功URL,因为创建的对象似乎没有pk。希望我清楚。
url(r'^(?P\d+/),UserHome.as_view(),name='UserHome'),
这是UserHome的url模式。非常感谢Daniel Roseman。事实上,我首先使用了内置的登录视图本身,但由于我原来的问题(这里问的问题),我继续使用我自己的视图,希望这能帮我解决问题。现在,我重新使用内置的登录视图,并在测试中进行了更正(感谢您在这两种情况下),测试通过:)。再次感谢:)。
user = User.objects.create_user(username=username, password=password)