【发布时间】:2013-07-11 21:56:59
【问题描述】:
我正在按照How can I login to django using tastypie 此处的说明创建一个可用于登录我的 django 用户的 UserResource。
但是,我在运行代码时遇到了 HTTP 500 错误。我试图自己调试它,但无法弄清楚。我不确定如何解决 500 错误。感谢您提出任何想法。
谢谢!!
我的代码如下:
#####api.py
from registration.views import register
from tastypie.resources import ModelResource
from tastypie.constants import ALL
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.defaults 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 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'])
print "reached login auth"
data = self.deserialize(request, request.raw_post_data, format=request.META.get('CONTENT_TYPE', 'application/json'))
username = data.get('username', '')
password = data.get('password', '')
print "reached login auth"
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)
########test_login.py
import requests
import json
from urllib2 import urlopen
import datetime
import simplejson
url = 'http://127.0.0.1:8000/api/user/login'
data = {'username' :'sv3@gmail.com', 'password' : 'pass'}
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
print json.dumps(data)
r = requests.post(url, data=json.dumps(data), headers=headers)
print r
#####urls.py
from userdetails.api import UserResource
user_resource = UserResource()
urlpatterns = patterns('',
......
(r'^api/', include(user_resource.urls)),
)
【问题讨论】:
-
主机上的日志中没有任何内容?
-
嗯,-1。首先重新格式化您的代码示例 - 在 Python 中缩进 do 很重要。
-
@Tadeck 我在这里手动格式化代码,因为每次剪切粘贴都会弄乱它。现在应该没问题了
-
@KevinDTimm 我的 Apache 日志文件夹 /private/var/log/apache2/ 为空。我对此很陌生,如果我看错了地方,请道歉
-
@vikingosegundo 谢谢,这有助于修复它。我只是打印响应对象,而不是您通过 POST 调用此 URL 的内容,但 URL 没有以斜杠结尾,并且您设置了 APPEND_SLASH。 Django 在维护 POST 数据时无法重定向到斜杠 URL。将表单更改为指向 127.0.0.1:8000/api/user/login/(注意尾部斜杠),或在 Django 设置中设置 APPEND_SLASH=False