2011-02-03 77 views
0

我写的,需要一个URL像一个小方法:限制访问我的Jsonifier的最简单方法是什么?

/ajax/places/city?name__icontains=ranch 

然后查询该有自己的名字“牧场”城市city模型,并返回结果为JSON:

[ 
    { 
     "pk":24944, 
     "model":"places.city", 
     "fields":{ 
     "province":1, 
     "data_source":2, 
     "elevation":null, 
     "name":"108 Mile Ranch", 
     "feature_class":null, 
     "time_zone":null, 
     "longitude":null, 
     "feature_code":null, 
     "mod_date":"2011-02-02 01:33:17", 
     "latitude":null, 
     "is_verified":true, 
     "population":null 
     } 
    }, ... 

这对于我的各种自动完成小部件会很方便。

方法是这样的:

def lookup(request, app_label, model_name): 
    model = get_model(app_label, model_name) 
    kwargs = dict((k,v) for k,v in request.GET.iteritems()) 
    objects = model.objects.filter(**kwargs)[:25] 
    json = serializers.serialize('json', objects) 
    return HttpResponse(json, mimetype='application/json') 

唯一的问题是,它为用户提供了我的数据库不受限制的访问(他们可以键入/ajax/auth/user)。

我试图找出限制它的最简单的方法。我可以将它限制为某些初学者的模型,但对于像地址这样的东西,我需要在某些自动完成中使用这些模型,但只有拥有该地址的用户才能看到它。

当通过ajax调用方法时,我认为request对象无法正确传递(通过身份验证的用户),是吗?

这是否意味着我必须传递某种身份验证密钥或会话ID以及每个请求?即使我确实获得了登录用户,我也不想将太多的权限处理纳入该方法,我不认为它属于那里。不知道如何解决这个问题。

回答

1

如果您不希望它公开,则必须使用某些类型的身份验证。我的API页面在开始时具有类似的内容,以确保用户已登录并且有效。

<?php 
    require ('common.php'); //Validates users and populates the $me array using SESSION, and datastore 

    if (!$me['validLogin']) { 
     die(json_encode(array(
      "status" => "ERR", 
      "message" => "Invalid Access" 
     ))); 

    } 
    //Do the rest of your API Magic here 

?> 

令牌可能适用,但您需要注意,此令牌不能从JavaScript获取,由知道在哪里找到它的人。这就是为什么依靠你的登录架构是一个很好的解决方案。

3

这看起来很像你试图允许来自客户端的任意查询。

不要。如果您正在编写所有查询,请将其写在服务器端,并为其中的每一个创建一个单独的方法。如果用户需要能够编写动态查询,请提出自己的(严格限制的)方法,而不是直接将事情传递给模型。

顺便说一下,“Ajax”请求应该与普通的页面加载没有区别。如果您使用cookies进行身份验证,它们应该会传递得很好。

+0

这就是我通常这样做的方式。我具有特定的控制器操作,允许用户访问预定义的安全查询。哪些操作需要验证也通过控制器指定。然后,路由引擎解析请求,如果请求以`.json`结尾,则查询结果将呈现在JSON视图中。或者,如果它是`.rss`,结果将呈现在RSS视图中。否则,它将呈现在默认的HTML视图中。某些操作需要参数(如搜索词,排序键,排序顺序等),但不能使用任意查询。 – 2011-02-03 01:51:05

相关问题