zoukankan      html  css  js  c++  java
  • Python学习之路—2018/7/2

    Python学习之路—2018/7/2

    1.Ajax

    Ajax简介

    向浏览器发送请求的途径有:

    • 浏览器地址栏,默认为get请求
    • a标签,默认为get请求
    • form表单:get请求和post请求
    • Ajax:get请求和post请求(特点:异步交互,局部刷新)

    Ajax(Asynchronous JavaScript and XML )是异步的JavaScript与XML技术,使用Javascript语言与服务器进行异步交互

    基于JQuery简单Ajax实现

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>Hello World</h1>
        <button class="ajax">Ajax</button>
        <p class="content"></p>
        <input type="text" id="num1">+<input type="text" id="num2">=<input type="text" id="result"><button class="cal">提交</button>
        </br>
        </br>
        <form>
            用户名<input type="text" id="user">
            密码<input type="password" id="pwd">
            <button class="sub" type="button">提交</button>
            <span class="error"></span>
        </form>
    </body>
    <script src="/static/jquery-3.3.1.min.js"></script>
    <script type="text/javascript">
        $(".ajax").click(function () {
            $.ajax(
                {
                    url:"/handle_ajax/",  // 请求url
                    type:"get",  // 请求方式
                    success:function (data) {  // 回调函数
                        console.log("hello");
                        $(".content").html(data)
                    }
                }
            )
        });
        // 计算
        $(".cal").click(function () {
            $.ajax({
                url:"/cal",
                type:"get",
                data:{
                    "num1":$("#num1").val(),
                    "num2":$("#num2").val()
                },
                success:function (data) {
                    $("#result").val(data)
                }
            })
        });
        // 登录验证
        $(".sub").click(function () {
            $.ajax({
                url:"/login/",
                type:"post",
                data:{
                    "user":$("#user").val(),
                    "pwd":$("#pwd").val()
                },
                success:function (data) {
                    var status = JSON.parse(data);  // 反序列化
                    console.log(status);
                    if (status["user"]){
                        location.href = "http://www.baidu.com"
                    }
                    else {
                        $(".error").html(status["msg"]).css({"color": "red", "margin-left": "20px"})
                    }
                }
            })
        })
    </script>
    </html>
    

    views.py

    def index(request):
        return render(request, "index.html")
    def handle_ajax(request):
        return HttpResponse("hello")  # 对应回调函数的data
    def cal(request):  # 计算
        num1 = int(request.GET.get("num1"))
        num2 = int(request.GET.get("num2"))
        result = num1 + num2
        return HttpResponse(result)
    def login(request):  # 登录验证
        import json
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        status = {"user": None, "msg": None}
        
        if user == "gyq" and pwd == "123":
            status = {"user": user, "msg": "登陆成功"}
        else:
            status["msg"] = "用户名或者密码错误!"
        return HttpResponse(json.dumps(status))  # 将字典序列化成json数据再返回
    

    展示效果:

    简单流程:

    1. 将ajax请求发送给路径handle_ajax
    2. handle_ajax视图函数结果响应给data
    3. 执行回调函数

    文件上传

    基于form表单的文件上传

    file_upload.html

    <form action="" method="post">
        用户名<input type="text" name="username">
        头像<input type="file" name="avatar">
        <input type="submit">
    </form>
    

    此时头像并没有上传成功,在视图层中调用request.POST并不会得到文件,而只是得到文件的名字

    需要给form表单设置enctype属性(默认为application/x-www-form-urlencoded)为multipart/form-data

    <form action="" method="post" enctype="multipart/form-data">
        ...
    </form>
    

    在视图层中通过调用request.FILES得到文件,并通过文件操作将文件保存到本地。

    当内容类型为urlencoded时,适合用request.POST取得数据,当内容类型为form-data(可以获得上传的文件)时,适合用request.FILES取得数据

    views.py

    def file(request):
        if request.method == "GET":
            return render(request, "file_upload.html")
        else:
            avatar = request.FILES.get("avatar")
            with open(avatar.name, "wb") as f:
                for l in avatar:
                    f.write(l)
    
            return HttpResponse("OK")
    

    基于Ajax的文件上传

    file_upload.html

    <form>
        用户名<input type="text" id="username">
        头像<input type="file" id="avatar">
        <input type="button" class="sub" value="提交">
    </form>
    <script type="text/javascript">
        $(".sub").click(function () {
            var formdata = new FormData();  // 实例化formdata
            formdata.append("user", $("#username").val());
            formdata.append("avatar", $("#avatar")[0].files[0]);  // 获取上传的文件
    
            $.ajax({
                url:"/file/",
                type:"post",
                data:formdata,
                contentType:false,  // 不设置内容类型
                processData:false,  // 不做预处理
                success:function (data) {
                    console.log(data)
                }
            })
        })
    </script>
    

    2.Django的分页器

    通过输入地址栏参数

    view.py

    from django.shortcuts import render
    from .models import Book
    from django.core.paginator import Paginator, EmptyPage
    def index(request):
    	# 批量插入数据
           book_list = []
        for i in range(0, 100):
            book = Book(title="book_%s" % str(i), price=i*i)
            book_list.append(book)
        Book.objects.bulk_create(book_list)
        
        # 分页器
        book_list = Book.objects.all()
        paginator = Paginator(book_list, 10)
        print("数据总数:", paginator.count)  # 数据总数: 100
        print("页码总数:", paginator.num_pages)  # 页码总数: 10
        print("页码范围:", paginator.page_range)  # 页码范围: range(1, 11)
        
        try:
            current_page = int(request.GET.get("page", 1))
            page = paginator.page(current_page)
        except EmptyPage as e:  # 当出现EmptyPage时,让当前页为第一页
            page = paginator.page(1)
        
        return render(request, "index.html", locals())
    

    index.html

    {% for book in page %}
    	<li>{{ book.title }}:{{ book.price }}</li>
    {% endfor %}
    

    展示效果:

  • 相关阅读:
    安卓第一夜 第一个应用
    为什么要学习Linux
    Android的历史与花边
    来玩Play框架07 静态文件
    来玩Play框架06 用户验证
    来玩Play框架05 数据库
    来玩Play框架04 表单
    来玩Play框架03 模板
    来玩Play框架02 响应
    来玩Play框架01 简介
  • 原文地址:https://www.cnblogs.com/ExBurner/p/9256198.html
Copyright © 2011-2022 走看看