Django,TastyPie,身份验证和自定义中间件头痛

时间:2014-08-29 17:12:29

标签: django tastypie django-authentication

我有一个Django Web应用程序,需要在整个站点进行身份验证。我已经完成了自定义中间件,它基本上测试了request.user.is_anonymous,如果是,则将它们重定向到登录页面。它看起来像这样:

from django.contrib.auth.views import login
from django.contrib.auth import authenticate
from django.http import HttpResponseRedirect, HttpResponse
from django.utils import simplejson
from django.core import serializers

class SiteLogin:
    "This middleware requires a login for every view"
    def process_request(self, request):
        if request.path != '/accounts/login/' and request.user.is_anonymous():
            if request.POST:
                return login(request)
            else:
                return HttpResponseRedirect('/accounts/login/?next=%s' % request.path)

现在我正在创建一个iOS应用程序,目前,它只会从Django服务器上执行GET请求。我正在尝试使用TastyPie执行此操作,但我无法使身份验证正常工作。我正在使用ApiKeyAuthentication,我相信,已经正确设置了它。但是,它只是将我重定向到登录页面。我想知道是否需要编辑这个中间件来处理TastyPie请求,但我认为TastyPie可以为我授权......

我觉得我的情况与this question非常相似,但我想知道我的自定义中间件是否会妨碍我。

这是我的api.py

from django.contrib.auth.models import User
from django.db import models
from tastypie.resources import ModelResource
from cpm.systems.models import System
from cpm.products.models import Product
from tastypie.models import create_api_key
from tastypie.authentication import ApiKeyAuthentication
from tastypie.authorization import DjangoAuthorization, Authorization

models.signals.post_save.connect(create_api_key, sender=User)



class SystemResource(ModelResource):
  class Meta:   
    queryset = System.objects.all()
    resource_name = 'system'
    authentication = ApiKeyAuthentication()
    authorization = DjangoAuthorization()


class ProductResource(ModelResource):
  class Meta:       
    queryset = Product.objects.all()
    resource_name = 'product'
    authentication = ApiKeyAuthentication()
    authorization = DjangoAuthorization()

urls.py的一部分:

from cpm.ios.api import SystemResource, ProductResource
from tastypie.api import Api

v1_api = Api(api_name='v1')
v1_api.register(SystemResource())
v1_api.register(ProductResource())

admin.autodiscover()

urlpatterns = patterns('',

    # iOS TastyPie related:
    (r'^ios/', include(v1_api.urls)),
    # .... more urls....

我尝试导航到的网址是:

http://192.168.1.130:8080/ios/v1/system/C0156/?username=garfonzo&api_key=12345?format=json

但我刚刚重定向到我的登录页面。我已经在教程中使用了tee,在我的Admin面板上创建了一个api密钥,并将WSGIPassAuthorization On添加到了我的apache配置中。

有什么想法吗?

编辑我刚刚完全删除了中间件,现在我收到的只是401 AUTHENTICATION错误......

编辑2 我应该指出,如果我删除了?format=json,那么我得到的回复为:Sorry, not implemented yet. Please append "?format=json" to your URL.。所以它就像 进行身份验证一样,但后来失败了,因为我没有指定格式。

所以我的网址如下所示:http://192.168.1.130:8080/ios/v1/system/C0156/?username=garfonzo&api_key=12345但是只要我添加?format=JSON,就会出现401错误。

1 个答案:

答案 0 :(得分:2)

TastyPie请求通过与任何典型django请求相同的中间件堆栈。所以,它绝对是你的中间件。你必须重新考虑它,或者只是简单地使用@login_required。

禁用中间件后,api密钥不起作用,因为您的网址格式不正确。你不能用?在使用它之后在一个查询字符串中。试试这个网址:

http://192.168.1.130:8080/ios/v1/system/C0156/?username=garfonzo&api_key=12345&format=JSON