ajax登录示例
urls.py
from django.conf.urls import urlfrom django.contrib import adminfrom app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login_ajax/$', views.login_ajax, name='login_ajax'), url(r'^index/$', views.index, name='index'),]
views.py
from django.shortcuts import render, HttpResponse, redirectimport json def index(request): return HttpResponse('this is index') def login_ajax(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") ret = { "status": 0, 'url': ''} if user == "alex" and pwd == "123": ret['status'] = 1 ret['url'] = '/index/' return HttpResponse(json.dumps(ret)) return render(request, "login_ajax.html")
login_ajax.html
登录
静态文件需要配置,使用了jQuery和Bootstrap。
CSRF跨站请求伪造
方式一
将 csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val() 放在POST的请求体中。
示例中就是使用的这种方式。
方式二
给ajax的请增加X-CSRFToken的请求头,对应的值只能是cookie中的csrftoken的值。
所以我们要从cookie中提取csrftoken的值,jQuery不能去cookie,我们使用jquery.cookie的插件。。
HTML中导入jquery.cookie.js。
方式三
使用$.ajaxSetup()给全局的ajax添加默认参数。
可以按照方式一设置data,也可以按照方式二设置请求头。
$.ajaxSetup({ data: { csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(), }});$.ajaxSetup({ headers: { "X-CSRFToken": $.cookie('csrftoken')},});
方式四
官方推荐方法(用到jquery.cookie插件):
function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));} $.ajaxSetup({ beforeSend: function (xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken')); } }});