私は次のようにURLを取る少し方法を書いた:自分の名前で「牧場」を持っている都市のcity
モデルを照会し、JSONとして結果を返します。そして、jsonifierへのアクセスを制限する最も簡単な方法は?
/ajax/places/city?name__icontains=ranch
:
[
{
"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
を入力することができます)ユーザーが自分のデータベースへの無制限のアクセスを与えることです。
私はそれを少し制限する最も簡単な方法を見つけようとしています。特定のモデルに限定することができますが、Addressesのようなものについては、いくつかのオートコンプリートでそれらを使用する必要がありますが、そのAddressを所有するユーザーだけがそれを見ることができます。
メソッドがajax経由で呼び出されたときに、request
オブジェクトが(認証されたユーザーと共に)正しく渡されるとは思いませんか?
これは、リクエストごとにいくつかの種類の認証キーまたはセッションIDを渡す必要があることを意味しますか?そして、たとえ私がログインしているユーザーを取得しても、私はあまりにも多くのアクセス権をその方法に焼きたいとは思いません。私はそこに所属しているとは思いません。この問題にどのようにアプローチするかは不明です。
これは私が通常やる方法です。私は、ユーザーがアクセスできるように事前定義された安全なクエリを備えた特定のコントローラアクションを持っています。どのアクションが認証を必要とするかは、コントローラーによっても指定されます。ルーティングエンジンはリクエストを解析し、リクエストが '.json'で終了すると、クエリ結果はJSONビューで表示されます。また、 '.rss'の場合、結果はRSSビューで表示されます。それ以外の場合は、デフォルトのHTMLビューでレンダリングされます。アクションによっては、パラメータ(検索キーワード、ソートキー、ソート順など)を取りますが、任意のクエリは使用しないアクションもあります。 –
このコードのJavascript部分を書いてみると時間を節約しようとしています...すべてをサーバーサイドのコードに焼き付けて各モデルの重複をすべて取るのが好きではありませんが、多くの選択肢があります。私は一種のホワイトリストを作るつもりだと思う。 – mpen