Tastypie登录返回HttpResonse 500

时间:2016-11-16 04:32:04

标签: python django tastypie

我正在尝试使用Tastypie登录系统,但是当我发送带有用户数据的json请求时,服务器会响应Http 500.我查看了所有代码并试图调试问题但是我尝试的都没有工作。

我环顾四周,找不到任何可以帮助我的事。

有没有人知道如何解决这个问题,或者我应该做些什么我不是。

感谢。

api.py

class UserResource(ModelResource):
    raw_password = fields.CharField(attribute=None, readonly=True, null=True, blank=True)

    class Meta:
        queryset = User.objects.all()
        fields = ['first_name', 'last_name', 'email']
        allowed_methods = ['get', 'post' ]
        resource_name = 'user'

    def prepend_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',
                }, HttpUnauthorized)
        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.authenticated():
            logout(request)
            return self.request.create_response(request, {'success': True})
        else:
            return self.request.create_response(request, {'success': False}, HttpUnauthorized)

request.py

import json
import requests

data = {"username" : "test", "password" : "password"}
headers = {"content-type": "application/json"}
url = "http://localhost:8000/api/v1/user/login/"

response = requests.post(url, data=json.dumps(data), headers=headers)

print response

2 个答案:

答案 0 :(得分:1)

试试这个,它对我有用!

<强> api.py

class UserResource(ModelResource):
    raw_password = fields.CharField(attribute=None, readonly=True, null=True, blank=True)

    class Meta:
        queryset = User.objects.all()
        allowed_methods = ['get', 'post' ]
        resource_name = 'user'
        authentication = Authentication()
        authorization = Authorization()
        serializer = Serializer(formats=['json'])


    def prepend_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.body, format=request.META.get('CONTENT_TYPE', 'application/json'))
        username = data.get('username', '')
        password = data.get('password', '')


        user = authenticate(username=username, password=password)
        print user
        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',
                }, HttpUnauthorized)
        else:
            return self.create_response(request, {
                'success': False,
                'reason': 'incorrect',
            }, HttpUnauthorized)


    def logout(self, request, **kwargs):
        """
        Attempt to log a user out, and return success status.
        """
        self.method_check(request, allowed=['get'])

        # Run tastypie's BasicAuthentication
        self.is_authenticated(request)

        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, 'error_message': 'You are not authenticated, %s' % request.user.is_authenticated() })

<强> request.py

import json
import requests

data = {"username" : "test", "password" : "password"}
headers = {"content-type": "application/json"}
url = "http://localhost:8000/api/v1/user/login/"

response = requests.post(url, data=json.dumps(data), headers=headers)
print response

在终端

In [2]: import requests

In [3]: import json

In [4]: data = {"username" : "test", "password" : "password"}

In [5]: headers = {"content-type": "application/json"}

In [6]: url= "http://localhost:8000/api/v1/user/login/"

In [7]: response = requests.post(url, data=json.dumps(data), headers=headers)

In [8]: response
Out[8]: <Response [200]>

答案 1 :(得分:0)

问题是request.raw_post_data已被弃用,应更改为request.body希望这有助于其他任何人遇到问题。