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'));
            }
        }
    });
    方式四

     

  • 相关阅读:
    python 执行sql得到字典格式数据
    python爬虫 url链接编码成gbk2312格式
    windows环境下elasticsearch安装教程(单节点)
    python SQLServer 存储图片
    爬虫的本质是和分布式爬虫的关系
    requests form data 请求 爬虫
    mysql 删除 binlog 日志文件
    查看mysql数据表的大小
    xshell 连接报错 Disconnected from remote host
    centos 7.3 安装 mysqldb 报错 EnvironmentError: mysql_config not found ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
  • 原文地址:https://www.cnblogs.com/bai-max/p/9355372.html
Copyright © 2011-2022 走看看