2011-02-03 75 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

相關問題