我正在使用Python Social Auth将Facebook令牌发送到我的服务器进行身份验证。
在发送POST以获取身份验证时,这是我得到的错误:
Traceback: File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/Library/Python/2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
57. return view_func(*args, **kwargs) File "/Library/Python/2.7/site-packages/django/views/generic/base.py" in view
69. return self.dispatch(request, *args, **kwargs) File "/Library/Python/2.7/site-packages/rest_framework/views.py" in dispatch
407. response = self.handle_exception(exc) File "/Library/Python/2.7/site-packages/rest_framework/views.py" in dispatch
404. response = handler(request, *args, **kwargs) File "/Users/vedantdasswain/GitRepositories/MovieMiner/Django/MovieMiner/mine/views.py" in post
45. token, created = Token.objects.get_or_create(user=user) File "/Library/Python/2.7/site-packages/django/db/models/manager.py" in manager_method
92. return getattr(self.get_queryset(), name)(*args, **kwargs) File "/Library/Python/2.7/site-packages/django/db/models/query.py" in get_or_create
424. return self._create_object_from_params(lookup, params) File "/Library/Python/2.7/site-packages/django/db/models/query.py" in _create_object_from_params
454. obj = self.model(**params) File "/Library/Python/2.7/site-packages/django/db/models/base.py" in __init__
440. setattr(self, field.name, rel_obj) File "/Library/Python/2.7/site-packages/django/db/models/fields/related.py" in __set__
597. self.field.rel.to._meta.object_name,
Exception Type: ValueError at /api-auth/facebook/ Exception Value: Cannot assign "<UserProfile: VedantDasSwain>": "Token.user" must be a "User" instance.
我使用的自定义用户模型如下:
class UserProfileManager(BaseUserManager):
def create_user(self, email, username):
user = self.model(email=email,
username=username)
return user
def create_superuser(self, email, username):
user = self.create_user(email, username)
user.save()
return user
# Create your models here.
class UserProfile(AbstractBaseUser):
username = models.CharField(max_length=200)
email = models.EmailField(max_length=200)
location = models.CharField(max_length=200)
birthday = models.DateField(blank=False)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email','username']
objects = UserProfileManager()
class Meta:
db_table = u'user_profile'
这是处理请求的视图:
class ObtainAuthToken(APIView):
throttle_classes = ()
permission_classes = ()
authentication_classes = ()
parser_classes = (FormParser, MultiPartParser, JSONParser,)
renderer_classes = (JSONRenderer,)
serializer_class = AuthTokenSerializer
model = Token
# Accept backend as a parameter and 'auth' for a login / pass
def post(self, request, backend):
if backend == 'auth':
serializer = self.serializer_class(data=request.DATA)
if serializer.is_valid():
token, created = Token.objects.get_or_create(user=serializer.object['user'])
return Response({'token': token.key})
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
else:
# Here we call PSA to authenticate like we would if we used PSA on server side.
print 'calling PSA'
user = register_by_access_token(request, backend)
# If user is active we get or create the REST token and send it back with user data
if user and user.is_active:
token, created = Token.objects.get_or_create(user=user)
return Response({'id': user.id, 'name': user.username, 'userRole': 'user', 'token': token.key})
@psa(redirect_uri=None)
def register_by_access_token(request, backend):
# Split by spaces and get the array
auth = get_authorization_header(request).split()
print auth
if not auth or auth[0].lower() != b'token':
msg = 'No token header provided.'
return msg
if len(auth) == 1:
msg = 'Invalid token header. No credentials provided.'
return msg
access_token = auth[1]
print access_token
# Real authentication takes place here
user = request.backend.do_auth(access_token)
print user
return user
def get_authorization_header(request):
print 'getting header'
return request.META['HTTP_AUTHORIZATION']
我甚至在settings.py中添加了以下几行:
AUTH_PROFILE_MODULE = 'mine.UserProfile'
SOCIAL_AUTH_USER_MODEL = 'mine.UserProfile'
有人可以帮助我吗?我无法理解为什么我会收到此错误。感谢。
答案 0 :(得分:0)
UserProfileManager类中的create_user func不保存用户。尝试添加user.save()