当尝试使用 tastypie 登录 django 时,可能会遇到“error_message”: “column username is not unique”错误。这是因为 tastypie 将尝试使用要验证的用户名创建一个新用户,但这会引发数据库错误,因为用户名已经存在。
解决方案
有两种方法可以解决这个问题:
- 创建一个 userresource,并添加一个方法,允许用户登录并传递用户名和密码。这种方法更加安全,因为它不会创建新用户。
- 将 authentication 类更改为
authorization()
。这将允许用户登录,而不会创建新用户。
代码示例
方法 1:
from django.contrib.auth.models import user from django.contrib.auth import authenticate, login, logout from tastypie.http import httpunauthorized, httpforbidden from django.conf.urls import url from tastypie.utils import trailing_slash class userresource(modelresource): class meta: queryset = user.objects.all() fields = ['first_name', 'last_name', 'email'] allowed_methods = ['get', 'post'] resource_name = 'user' def override_urls(self): return [ url(r"^(?p<resource_name>%s)/login%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('login'), name="api_login"), url(r'^(?p<resource_name>%s)/logout%s$' % (self._meta.resource_name, trailing_slash()), self.wrap_view('logout'), name='api_logout'), ] def login(self, request, **kwargs): self.method_check(request, allowed=['post']) data = self.deserialize(request, request.raw_post_data, format=request.meta.get('content_type', 'application/json')) username = data.get('username', '') password = data.get('password', '') user = authenticate(username=username, password=password) if user: if user.is_active: login(request, user) return self.create_response(request, { 'success': true }) else: return self.create_response(request, { 'success': false, 'reason': 'disabled', }, httpforbidden ) else: return self.create_response(request, { 'success': false, 'reason': 'incorrect', }, httpunauthorized ) def logout(self, request, **kwargs): self.method_check(request, allowed=['get']) if request.user and request.user.is_authenticated(): logout(request) return self.create_response(request, { 'success': true }) else: return self.create_response(request, { 'success': false }, httpunauthorized)
方法 2:
from django.contrib.auth.models import user from django.contrib.auth import authenticate, login, logout from tastypie.http import httpunauthorized, httpforbidden from django.conf.urls import url from tastypie.utils import trailing_slash class userresource(modelresource): class meta: queryset = user.objects.all() resource_name = 'user' allowed_methods = ['post'] def prepend_urls(self): return [ url(r"^user/login/$", self.wrap_view('login'), name="api_login"), url(r"^user/logout/$", self.wrap_view('logout'), name='api_logout'), ] def login(self, request, **kwargs): self.method_check(request, allowed=['post']) data = self.deserialize(request, request.raw_post_data, format=request.meta.get('content_type', 'application/json')) username = data.get('username', '') password = data.get('password', '') user = authenticate(username=username, password=password) if user: if user.is_active: login(request, user) return self.create_response(request, { 'success': true }) else: return self.create_response(request, { 'success': false, 'reason': 'disabled', }, httpforbidden ) else: return self.create_response(request, { 'success': false, 'reason': 'incorrect', }, httpunauthorized ) def logout(self, request, **kwargs): self.method_check(request, allowed=['post']) if request.user and request.user.is_authenticated(): logout(request) return self.create_response(request, { 'success': true }) else: return self.create_response(request, { 'success': false }, httpunauthorized)
在任一种方法中,您都可以通过向端点 http://hostname/api/user/login 发送 post 请求来登录。请求数据应具有以下格式:
{ "username": "username", "password": "password" }
如果登录成功,您将收到以下响应:
{ "success": true }
如果登录失败,您将收到以下响应:
{ "success": false, "reason": "incorrect" }
到此这篇关于使用tastypie登录django的问题解决的文章就介绍到这了,更多相关tastypie登录django内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论