使用Tastypie登錄Django的問(wèn)題解決
當(dāng)嘗試使用 Tastypie 登錄 Django 時(shí),可能會(huì)遇到“error_message”: “column username is not unique”錯(cuò)誤。這是因?yàn)?Tastypie 將嘗試使用要驗(yàn)證的用戶名創(chuàng)建一個(gè)新用戶,但這會(huì)引發(fā)數(shù)據(jù)庫(kù)錯(cuò)誤,因?yàn)橛脩裘呀?jīng)存在。
解決方案
有兩種方法可以解決這個(gè)問(wèn)題:
- 創(chuàng)建一個(gè) UserResource,并添加一個(gè)方法,允許用戶登錄并傳遞用戶名和密碼。這種方法更加安全,因?yàn)樗粫?huì)創(chuàng)建新用戶。
- 將 authentication 類更改為
Authorization()
。這將允許用戶登錄,而不會(huì)創(chuàng)建新用戶。
代碼示例
方法 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)
在任一種方法中,您都可以通過(guò)向端點(diǎn) http://hostname/api/user/login 發(fā)送 POST 請(qǐng)求來(lái)登錄。請(qǐng)求數(shù)據(jù)應(yīng)具有以下格式:
{ "username": "username", "password": "password" }
如果登錄成功,您將收到以下響應(yīng):
{ "success": True }
如果登錄失敗,您將收到以下響應(yīng):
{ "success": False, "reason": "incorrect" }
到此這篇關(guān)于使用Tastypie登錄Django的問(wèn)題解決的文章就介紹到這了,更多相關(guān)Tastypie登錄Django內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- django如何實(shí)現(xiàn)用戶的注冊(cè)、登錄、注銷功能
- django authentication 登錄注冊(cè)的實(shí)現(xiàn)示例
- Django 登錄注冊(cè)的實(shí)現(xiàn)示例
- Python基于Django實(shí)現(xiàn)驗(yàn)證碼登錄功能
- 利用django和mysql實(shí)現(xiàn)一個(gè)簡(jiǎn)單的web登錄頁(yè)面
- Django通過(guò)自定義認(rèn)證后端實(shí)現(xiàn)多種登錄方式驗(yàn)證
- Django實(shí)現(xiàn)簡(jiǎn)單登錄的示例代碼
- Django實(shí)現(xiàn)前后端登錄
- Django中使用pillow實(shí)現(xiàn)登錄驗(yàn)證碼功能(帶刷新驗(yàn)證碼功能)
- 給Django Admin添加驗(yàn)證碼和多次登錄嘗試限制的實(shí)現(xiàn)
相關(guān)文章
anaconda升級(jí)sklearn版本的實(shí)現(xiàn)方法
這篇文章主要介紹了anaconda升級(jí)sklearn版本的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Python實(shí)現(xiàn)手機(jī)號(hào)自動(dòng)判斷男女性別(實(shí)例解析)
這篇文章主要介紹了Python實(shí)現(xiàn)手機(jī)號(hào)自動(dòng)判斷男女性別,本文性別判斷主要依靠airtest中的自動(dòng)化測(cè)試實(shí)現(xiàn),通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Python+streamlit實(shí)現(xiàn)輕松創(chuàng)建人事系統(tǒng)
streamlit 是 基于 Python 的一個(gè)非常強(qiáng)大的 web 構(gòu)建系統(tǒng),通過(guò)該類庫(kù),我們可以實(shí)現(xiàn)不需要編寫(xiě)一行前端代碼而構(gòu)建一個(gè)完整的 Web 應(yīng)用。下面我們就來(lái)編寫(xiě)一個(gè)簡(jiǎn)單的人事系統(tǒng)吧2023-02-02python使用os.listdir和os.walk獲得文件的路徑的方法
本篇文章主要介紹了python使用os.listdir和os.walk獲得文件的路徑的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12Python參數(shù)解析模塊sys、getopt、argparse使用與對(duì)比分析
今天小編就為大家分享一篇關(guān)于Python參數(shù)解析模塊sys、getopt、argparse使用與對(duì)比分析,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04