zoukankan      html  css  js  c++  java
  • 17-ajax向后端提交POST请求

    ajax登录示例

    urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from 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'),
    ]
    View Code

    views.py

    from django.shortcuts import render, HttpResponse, redirect
    import 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")
    views.py

    login_ajax.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>登录</title>
        <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
        <link rel="stylesheet" href="/static/css/signin.css">
    </head>
    <body>
     
    <div class="container">
     
        <form class="form-signin" action="{% url 'login' %}" method="post">
            {% csrf_token %}
            <h2 class="form-signin-heading">请登录</h2>
            <label for="inputUser" class="sr-only">用户名</label>
            <input type="text" id="inputUser" class="form-control" placeholder="用户名" required="" autofocus="" name="user">
            <label for="inputPassword" class="sr-only">密码</label>
            <input type="password" id="inputPassword" class="form-control" placeholder="密码" required="" name="pwd">
            <div class="checkbox">
                <label>
                    <input type="checkbox" value="remember-me"> 记住我
                </label>
            </div>
            <input class="btn btn-lg btn-primary btn-block" id="login" value="登陆">
        </form>
     
    </div> <!-- /container -->
     
     
    <script src="/static/jquery-3.3.1.min.js"></script>
    <script>
     
        $('#login').click(function () {
            $.ajax({
                url: '/login_ajax/',
                type: 'post',
                data: {
                    csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
                    user: $('[name="user"]').val(),
                    pwd: $('[name="pwd"]').val()
                },
                success: function (data) {
                    data = JSON.parse(data);
                    if (data.status) {
                        window.location = data.url
                    }
                    else {
                        alert('登陆失败')
                    }
                }
            })
        })
    </script>
     
    </body>
    </html>
    login_ajax.html

    静态文件需要配置,使用了jQuery和Bootstrap。

    CSRF跨站请求伪造

    方式一

    将 csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val() 放在POST的请求体中。

    示例中就是使用的这种方式。

     

    方式二

    给ajax的请增加X-CSRFToken的请求头,对应的值只能是cookie中的csrftoken的值。

    所以我们要从cookie中提取csrftoken的值,jQuery不能去cookie,我们使用jquery.cookie的插件。点击下载jquer.cookie插件

    HTML中导入jquery.cookie.js。 

    <script src="/static/jquery-3.3.1.min.js"></script>
    <script src="/static/jquery.cookie.js"></script>
    <script>
     
        $('#login').click(function () {
            $.ajax({
                url: '/login_ajax/',
                type: 'post',
                headers:{ "X-CSRFToken":$.cookie('csrftoken') },
                data: {
                    user: $('[name="user"]').val(),
                    pwd: $('[name="pwd"]').val()
                },
                success: function (data) {
                    data = JSON.parse(data);
                    if (data.status) {
                        window.location = data.url
                    }
                    else {
                        alert('登陆失败')
                    }
                }
            })
        })
    </script>
    方式二

    方式三

    使用$.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'));
            }
        }
    });
    方式四

     

  • 相关阅读:
    html 上传图片前预览
    php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
    php 计算 pdf文件页数
    php 获取半年内每个月的订单数量, 总价, 月份
    php 获取两个数组之间不同的值
    小程序支付功能
    关于nginx的Job for nginx.service failed because the control process exited with error code.错误
    linux 安装 Apollo
    MongoDB待续。。。
    ABP vNext...待续
  • 原文地址:https://www.cnblogs.com/bai-max/p/9355372.html
Copyright © 2011-2022 走看看