【发布时间】:2018-04-15 17:19:55
【问题描述】:
我想保护我的函数不直接通过浏览器 url 调用。可能通过 CSRF 是可能的。但我做不到。 在前端我使用 ajax 来调用这个函数。因此,调用应该只能通过 ajax 而不是直接来自浏览器 url。
我的javascript代码是
function getData(table,id){
data = []
$.ajax({
type: "POST",
url: "getData",
dataType:'json',
data:{'tableName':table},
success: function(result) {
for(var i=0;i<result.length;i++){
for (var key in result[i]){
val = result[i][key]
if (data.indexOf(val)==-1){
data.push(val)
}
}
}
$( "#"+id ).autocomplete({
source: data
});
}
});
}
所以我在 javascript 中调用这个函数。
在 urls.py 中
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^getData', views.getData, name='getData'),
]
在 Views.py 中
def getData(request):
tableName = request.POST.get('tableName')
tableName = 'colleges'
cursor = connection.cursor()
query = "select * from "+tableName
cursor.execute(query)
columnDesc = cursor.description
result=[dict(zip([col[0] for col in columnDesc], row))
for row in cursor.fetchall()]
return HttpResponse(json.dumps(result), content_type="application/json")
所以,当我通过网络浏览器 url 直接调用时...
http://localhost/shikshapp/getData
我正在从我的观点中得到回应,我能够看到数据..
那么,我怎样才能保护这种调用..当令牌不存在时......但是这个调用应该可以通过 ajax 访问
【问题讨论】:
-
尝试像 stackoverflow.com/questions/5100539/… 一样将 csrf 令牌添加到请求中,然后在视图中验证 csrf 是否匹配,然后处理
'request_csrf_token = request.META.get('HTTP_X_CSRFTOKEN', '')和if request_csrf_token != csrf_token: return self._reject(request, REASON_BAD_TOKEN) -
我收到错误...全局名称 csrf_token 未定义 @Kalariya_M
标签: python ajax django python-2.7 django-csrf