Python之路【第三十一篇】:django ajax

 Ajax

文件夹为Ajaxdemo

向服务器发送请求的途径:

1.浏览器地址栏,默认get请求;

2.form表单:

    get请求

    post请求

3.a标签,超链接(get请求)

4.Ajax请求

  特点:1异步请求;2局部刷新

    get

    post

AJAXAsynchronous Javascript And XML)翻译成中文就是异步JavascriptXML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。

  • 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
  • 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新;(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

场景:

 Python之路【第三十一篇】:django ajax_第1张图片

优点:

  • AJAX使用Javascript技术向服务器发送异步请求
  • AJAX无须刷新整个页面

 

jquery cdn百度   src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js">    (把服务器上的jquery引入进来)

1.基于jquery的Ajax实现

index.html




    
    Title
    


    

this is Index!

 Ajax---服务器 Ajax流程图

Python之路【第三十一篇】:django ajax_第2张图片

 执行过程:

  一点击Ajax按钮,触发click这个函数,然后发就要发生ajax,给test_ajax发Ajax路径请求,当url匹配成功后,它把这次请求的结果交给了data,(在test_ajax里返回了一个hello kris的字符串)刚刚那个hello kris这个字符串就交给了data(data拿到结果);然后再执行那个回调函数能够打印,用js处理data. (在页面中加上节点)

 

 

2.Ajax数据传递

urls

from django.contrib import admin
from django.urls import path

from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index),
    path('test_ajax/', views.test_ajax),
    path('cal/', views.cal),
]

views.py

from django.shortcuts import render, HttpResponse

# Create your views here.
def index(request):

    return render(request, "index.html")
def test_ajax(request):        #这次请求在处理ajax请求,
    print(request.GET)        #拿到数据,去处理
    return HttpResponse("Hello kris") #根据数据给回调函数返回个什么参数

def cal(request):
    print(request.POST)
    n1=int(request.POST.get("n1")) #取出这两个值
    n2=int(request.POST.get("n2"))
    ret = n1+n2                   #计算下
    return HttpResponse(ret)

index.html

 1 
 2 
 3 
 4     
 5     Title
 6     
 7 
 8 
 9     

this is Index!

10 11

12 13
14 += 15 46 47 48 49 50

Python之路【第三十一篇】:django ajax_第3张图片 Python之路【第三十一篇】:django ajax_第4张图片

 3.基于Ajax的登录验证

  用户在表单输入用户名与密码,通过Ajax提交给服务器,服务器验证后返回响应信息,客户端通过响应信息确定是否登录成功,成功,则跳转到首页,否则,在页面上显示相应的错误信息。

models

from django.db import models

# Create your models here.
class User(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)

views

from app01.models import User
def login(request):
    print(request.POST) #
    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    user = User.objects.filter(name=user, pwd=pwd).first()
    res = {"user":None, "msg":None} #如果登录成功了默认是None,有值肯定是登录成功了; "msg"是避免出现错误信息,错误信息是什么
    if user:
        res["user"] = user.name 
    else:
        res["msg"] = "username or password wrong!"  #失败了给msg赋个值
    import json   #想把res这个字典交给data,HttpResponse里边必须放字符串,
    return HttpResponse(json.dumps(res)) #序列化下,json字符串 。

index




    
    Title
    


    
用户名 密码 //下面是button只是一个按钮;改成submit就会组成键值对发过去,就是form表单请求了。

 

 4.上传文件

4.1基于form表单上传文件

views

def file_put(request):
    if request.method == "POST":
        print(request.POST)  #用户上传的数据  post 
        print(request.FILES)  #拿到这个文件   ]}>
        file_obj = request.FILES.get("avatar")  #把文件下载来
        with open(file_obj.name, "wb")as f:  #上传的文件名file_obj.name 会把这个文件存到跟目录下
            for line in file_obj:
                f.write(line)

        return HttpResponse("ok")
    return render(request, "file_put.html")

file_put.html




    
    Title


基于form表单的文件上传

//上传文件一定要加上这个 用户名 头像

 

4.2 请求头ContentType:urlencoed

都在这个字符串报文里边(请求首行、请求头、请求体):

请求首行

请求头(决定数据以什么格式进行编码)

....

ContentType:urlencoed(告诉服务器,这次发过来的请求体的数据是按照urlencoed这种格式进行编码的(a=1&b=2..))

请求体(a=1&b=2&c=3)

服务器那边拿到这个wsgiref先检查ContentType,如果是urlencoed它就知道你是怎么编码的了,它就按照这种方式解码,拿到相应的键以及对应的值。

enctype="multipart/form-data"是另外一种编码格式,文件可以用这种方式;而普通的键值只适用这种 enctype="application/x-www-form-urlencoded" 编码格式

 



enctype="multipart/form-data" #上传文件一定要加上这个
enctype="application/x-www-form-urlencoded" #普通的键值对的上传加这个

 

file_put.html




    
    Title
    


简单的form

{#普通的键值只能用这种#} 用户名 密码

基于form表单的文件上传

用户名 头像

基于Ajax文件上传

用户名

4.3 Ajax传递json数据

file_put

基于Ajax文件上传

用户名
请求首行

请求头(决定数据以什么格式进行编码)

....

ContentType:json               #urlencoed(告诉服务器,这次发过来的请求体的数据是按照urlencoed这种格式进行编码的(a=1&b=2..))

请求体{"a":"1", "b":"2"}   #到时候反序列化就可以了     #(a=1&b=2&c=3)

 

views

def file_put(request):
    if request.method == "POST":
        print("body",request.body)  #请求报文中的请求体   body b'{"a":1,"b":2}' 取的时候进行解码,反序列化就可以了;a=1&b=2在请求体里边,所以能打印出
        print("post",request.POST)                     #用户上传的数据;post  只有在ContentType:urlencoed时,request.POST才有数据,数据存到body里边了 

        return HttpResponse("ok")
    return render(request, "file_put.html")
'''
请求首行
请求体
'''
'''
ContentType:urlencoed   请求头 这样的编码格式 ;multipart/form-data文件上传只能用这种
请求体(a=1&b=2&c=3)
'''

你可能感兴趣的:(Python之路【第三十一篇】:django ajax)