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数据再返回

展示效果:

005ScGy0gy1fsvehfzluug305e03kglr.gif

005ScGy0gy1fsvhmfkmsgg30gj018gm2.gif

005ScGy0gy1fsvjvjsmr2g30ih018t98.gif

简单流程:

  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并不会得到文件,而只是得到文件的名字

005ScGy0gy1fsvlfkldkpj30fr023mxg.jpg

需要给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 %}

展示效果:
005ScGy0gy1fsvxt9fkjhg30ab08hdh1.gif

转载于:https://www.cnblogs.com/ExBurner/p/9256198.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值