Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.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 Rest框架创建登录API?_Python_Django_Rest_Django Rest Framework - Fatal编程技术网

Python 如何使用Django Rest框架创建登录API?

Python 如何使用Django Rest框架创建登录API?,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,我想使用django rest框架创建一个登录api(或者使用一个已经预绑定的现有api)。然而,我完全不知所措。每当我向django rest框架“login”url发送post请求时,它只会返回可浏览的api模板页面 我的配置 url.py url(r'^api/v1/', include('rest_framework.urls', namespace='rest_framework')) 设置.py REST_FRAMEWORK = { 'DEFAULT_AUTHENTICAT

我想使用django rest框架创建一个登录api(或者使用一个已经预绑定的现有api)。然而,我完全不知所措。每当我向django rest框架“login”url发送post请求时,它只会返回可浏览的api模板页面

我的配置

url.py

url(r'^api/v1/', include('rest_framework.urls', namespace='rest_framework'))
设置.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )
}
我想要什么

请求:

POST /api/v1/login  username='name' pass='pass'
答复:

200 OK "{username: 'name', 'userId': '54321'}" set-cookie: sessionid="blahblah"

从中查看api视图。它是一个用于创建身份验证令牌而不是cookie会话的实现,但您的实现将类似。见和。您可能可以不加更改地使用
serializers.py
,只需调整视图以返回正确的参数,并可能设置会话cookie(无法回忆是否已在身份验证中执行该操作)。

如果您需要类似的操作,我也会这样做,但我使用令牌身份验证

查看他们的令牌页面

这可能不是您想要的,但我是这样做的(因为我将它用作移动客户端的RESTAPI端点)

我可以做我的url
localhost:8000/api/users/-H授权:Token
然后,浏览器可以使用您在提供的rest框架url上创建的常规登录页面

url(r'^api auth/',包括('rest\u framework.url',namespace='rest\u framework')

以及获取用于“无登录”导航的令牌

url(r'^api-token-auth/,'rest\u-framework.authtoken.views.acquire\u-auth\u-token')

然后,如果你打电话,你可以传递授权令牌。当然,这正是我的做法,可能不是最有效的方式,但我的目标是创建一种方式,我可以为用户提供浏览器会话身份验证和通过令牌的移动访问

然后在your views.py中,确保为该视图添加身份验证要求。几乎与会话身份验证部分相同

permission\u classes=(permissions.isadmin,)

但也包括

authentication\u classes=(authentication.TokenAuthentication,)


我希望这有帮助,但如果没有,祝您搜索好运。

当然,令牌是一种很好的身份验证方法,但提问者正在询问会话身份验证

请求:

POST /api/v1/login  username='username' password='password' 
  • csrftoken
    值放在标题中的
    X-csrftoken
  • 即使某人使用
    电子邮件
    作为用户名字段,电子邮件输入也需要
    用户名
    名称参数(例如
    username=)sample@domain.com“
答复:

302 FOUND sessionid="blahblah"
  • 如果未指定
    next
    值,它将自动重定向到
    /accounts/profile/
    ,这可能会产生404错误
添加我们的视图:

from rest_framework_jwt.views import refresh_jwt_token

urlpatterns = [
    ...
    url(r'^rest-auth/', include('rest_auth.urls')),
    url(r'^rest-auth/registration/', include('rest_auth.registration.urls')),
    ...
    url(r'^refresh-token/', refresh_jwt_token),
]

我正计划使用https和基本身份验证来推出api。但是浏览器是否有安全的方式来存储身份验证凭据?我不希望用户在浏览之后再浏览回我的站点时必须不断重新登录。我想取消会话身份验证,因为csrf令牌……它们对我来说太残酷了n一个API。我想拥有我的蛋糕并吃掉它…假设浏览器提供了一个由域绑定的只有所有者域才能访问的持久存储,我想我可以只将会话id存储在持久存储中,而不是存储在cookie中,以防止我基于API的网站中出现CSRF漏洞。你知道怎么做吗?对于未来的读者,我想我做了一个关于这个主题的教程:@mdw7326,“找不到页面”。这是给你的教程。我正在使用django rest framework token auth,我在提供用户名/密码后获得了这个token,但我还想收到用户的id(用户的pk)与令牌一起保存,以便我可以保存在本地存储中,并在移动应用程序中需要时使用该id。在请求令牌时,获取用户主键的正确方法是什么?请使用serializers.py查看上面的注释。您可能可以添加pk返回字段。如果这是您想要的。但是我如何实现case with SessionAuthentication lib?我一直在尝试,但会话没有保存,每当我在登录后输入新的url时,我都会得到AnonymousUser,而不是保存的会话。在这种方法中,从何处获得csrftoken以放入头中?是否有一个单独的端点,在该端点中我们对令牌使用get请求,还是应该向其添加get功能我们的“/api/v1/login”端点?还是我遗漏了什么?谢谢你的回答,这是我能找到的唯一一个真正回答这个问题的端点!