【问题标题】:django pytest case fails while postman does notdjango pytest 案例失败,而邮递员没有
【发布时间】:2021-11-20 20:07:27
【问题描述】:

我正在使用 Django rest 框架为 API 编写测试。

用户必须注册然后登录才能访问我的端点。

如果我向邮递员注册(发布),然后登录(发布)并获得 access_token,然后将其传递给发布请求,我会得到 200。

也使用curl

curl --location --request GET 'localhost:8000/api/v1/signals/' \
--header 'Authorization: token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjo1LCJleHAiOjE2MzI4NTc2MzIsImlhdCI6MTYzMjg1NzMzMn0.WCjjg3jSZ4TO_Q51hGwZmj04iFeV9ffRnp9GaFch_IM' \
--header 'Cookie: csrftoken=HrgKpprN95ExIPmm6Y2Qqc3WvDrfqQRgqUY9v4bTN9gT7nETEuBjhtY6IS7Sv9Ky; sessionid=ml04spqh6gmjuicp8vnda1t0lqopnuvx' \
--data-raw ''

但是如果我写一个测试,它会失败

def test_get_signal(client):
    form_data = {
        "username": "testuser",
        "password": "mytestpassword",
    }
    CustomUser.objects.create_user(**form_data)
    response = client.post("/accounts/login/", form_data, follow=True)
    assert response.status_code == 200
    response_content = json.loads(response.content)
    token = response_content["access_token"]
    headers = {
        "Authorization": "Token " + token,
        "Content-Type": "application/json",
    }
    response = client.get(
        path="/api/v1/signals/",
        headers=headers,
    )

    assert response.status_code == 200

我收到 403。我做错了什么?

【问题讨论】:

  • 403 是典型的无效 CSRF 令牌或未提供令牌。你如何定义客户?这个问题可能更有帮助:stackoverflow.com/questions/29749046/…
  • 我怀疑该请求未使用您提供的标头。你是在课堂上写这个函数吗?此外,没有令牌的 POSTMAN 请求将作为状态码返回什么? 403?

标签: django api access-token


【解决方案1】:

解决方案是我没有发送正确的请求。

找到答案here

我将测试改写为:

def test_get_signal():

    form_data = {
        "username": "testuser",
        "password": "mytestpassword",
    }
    CustomUser.objects.create_user(**form_data)
    response = APIclient.post("/accounts/login/", form_data, follow=True)


    assert response.status_code == 200

    response_content = json.loads(response.content)
    token = response_content["access_token"]
    APIclient.credentials(HTTP_AUTHORIZATION="Bearer " + token)

    response = APIclient.get(
        path="/api/v1/signals/",
    )

    assert response.status_code == 200

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多