经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
django中的ajax组件教程详解
来源:jb51  时间:2018/10/19 8:55:31  对本文有异议

Ajax(Asynchronous Javascript And XML)翻译成英文就是“异步Javascript和XML”。即用Javascript语言与服务器进行异步交互,传输的数据为XML,(现在使用更多的是json数据)。

向服务器发送请求的途径

1.浏览器地址栏 http://www.baidu.com 默认是get请求
2.form表单发送请求:
GET请求
POST请求
3.a标签 href属性 默认是get请求
4.ajax()

Ajax的特点

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

局部刷新:浏览器页面局部刷新

局部刷新的意思就是当咱们在博客园注册一个新的博客的时候,当咱们输入用户名后鼠标移开的时候,就发送了一个请求,去验证这个用户是否存在,如果存在,则通知用户该用户名已经被注册了。


基于jquery实现的ajax请求

让我们使用pycharm重新创建一个项目,项目名为Ajax_demo,应用名为app01。

  1. # url控制器
  2. from django.contrib import admin
  3. from django.urls import path
  4. from app01 import views
  5. urlpatterns = [
  6. path('admin/', admin.site.urls),
  7. path('index/', views.index),
  8. path('test_ajax/', views.test_ajax),
  9. ]

那么当我们需要有对应的视图函数 index和test_ajax:

  1. # app01-->views.py
  2. from django.shortcuts import render,HttpResponse
  3. # Create your views here.
  4. def index(request):
  5. return render(request, 'index.html')
  6. def test_ajax(request):
  7. return HttpResponse('hello!world!')

在这里匹配了相应的视图然后返回了一个html页面:

  1. # index.html
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
  8. </head>
  9. <body>
  10. <h3>功能1:发送ajax请求</h3>
  11. <p class="content"></p> //这里的内容是空的
  12. <button class="btn">ajax</button>
  13. <script>
  14. $('.btn').click(function(){
  15. $.ajax({
  16. url:'/test_ajax/',
  17. type:'get',
  18. success:function(data){
  19. $('.content').html(data)
  20. }
  21. })
  22. })
  23. </script>
  24. </body>
  25. </html>

这句话的意思是,当咱们点击button按钮的时候,触发了点击动作,然后发送了一个ajax请求,让我们先看看此时是什么样子的:

当我们点击了按钮的时候,就发送了一个ajax请求:

此时一个简单的ajax请求就发送完成了。

利用ajax实现计算器

首先咱们的index.html中进行布局:

  1. # index.html
  2. <h3>功能2:利用ajax实现的计算器</h3>
  3. <input type="text" class="num1">+<input type="text" class="num2">=<input type="text" id="sum"><button class="cal">计算</button>
  4. $('.cal').click(function(){
  5. $.ajax({
  6. url:'/cal/',
  7. type:'post',
  8. data:{
  9. 'n1':$('.num1').val(),
  10. 'n2':$('.num2').val(),
  11. },
  12. success:function(data){
  13. console.log(data);
  14. $('#sum').val(data);
  15. }
  16. })
  17. })

然后咱们拿到了n1和n2的值,通过请求url发送给相应的视图然后进行数据处理,最后拿到结果再返回给这个ajax。

  1. # views.py
  2.  
  3. def cal(request):
  4. print(request.POST)
  5. n1 = int(request.POST.get('n1'))
  6. n2 = int(request.POST.get('n2'))
  7. sum = n1+n2
  8. return HttpResponse(sum)

此时的url控制器需要新添加一条:

    path('cal/', views.cal),

其次是配置文件settings中的这一行需要注释掉:

  1. # 'django.middleware.csrf.CsrfViewMiddleware',

此时再查看结果:

利用ajax实现登陆认证

首先咱们要开一个路由,当用户在浏览器输入http://127.0.0.1/login_btn/的时候,就匹配导对应的视图,所以:

  1. # url控制器
  2. from django.contrib import admin
  3. from django.urls import path
  4. from app01 import views
  5. urlpatterns = [
  6. path('admin/', admin.site.urls),
  7. path('index/', views.index),
  8. path('test_ajax/', views.test_ajax),
  9. path('cal/', views.cal),
  10. path('login/', views.login),
  11. path('login_btn/', views.login_btn),
  12. ]
  13. # login_btn函数
  14. def login_btn(request):
  15. return render(request, 'login_btn.html')

然后返回了这个html页面:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
  7. </head>
  8. <body>
  9. <h3>利用ajax实现登陆认证</h3>
  10. <form action="">
  11. 用户名 <input type="text" class="user">
  12. 密码 <input type="password" class="pwd">
  13. <input type="button" value="submit" class="login_btn">
  14. <span class="error"></span>
  15. </form>
  16. <script>
  17. $('.login_btn').click(function(){
  18. $.ajax({
  19. url:'/login/',
  20. type:'post',
  21. data:{
  22. 'user':$('.user').val(),
  23. 'pwd':$('.pwd').val(),
  24. },
  25. success:function(data){
  26. //此时需要进行转换
  27. console.log(typeof(data));
  28. var data = JSON.parse(data)
  29. console.log(typeof(data));
  30. if (data.user){
  31. location.href = 'http://www.baidu.com'
  32. }else{
  33. $('.error').html(data.msg).css({'color':'red'})
  34. }
  35. }
  36. })
  37. })
  38. </script>
  39. </body>
  40. </html>

最后ajax将请求提交到了/login/中,然后进行匹配视图,然后就开始执行对应代码:

  1. def login(request):
  2. # print(request.POST)
  3. user = request.POST.get('user')
  4. pwd = request.POST.get('pwd')
  5. from .models import User
  6. user = User.objects.filter(user=user, pwd=pwd).first()
  7. ret = {
  8. 'user': None,
  9. 'msg': None
  10. }
  11. if user:
  12. ret['user'] = user.user
  13. else:
  14. ret['msg'] = 'username or password is wrong!'
  15. import json
  16. return HttpResponse(json.dumps(ret))

首先打开浏览器,输入错误的用户名和密码:

然后开始输入正确的用户名和密码,就会直接跳转到百度的首页了。

利用form表单进行文件上传

  1. # urls.py
  2. path('file_put/', views.file_put),
  3. # views.py
  4. # 文件的上传
  5. def file_put(request):
  6. if request.method == 'POST':
  7. print(request.POST)
  8. return render(request, 'file_put.html')
  9. # file_put.html
  10. <!DOCTYPE html>
  11. <html lang="en">
  12. <head>
  13. <meta charset="UTF-8">
  14. <title>文件上传</title>
  15. </head>
  16. <body>
  17. <h3>基于form表单实现的文件上传</h3>
  18. <form action="" method="post" enctype="multipart/form-data">
  19. 用户名 <input type="text" name="user">
  20. 头像 <input type="file" name="avatar">
  21. <input type="submit">
  22. </form>
  23. </body>
  24. </html>

此时咱们输入完用户名和选中完图片后,点击提交咱们查看下打印的信息。

那么是我们的图片没有上传过来吗?当然不是的,是因为上传的图片就不在这里面。让我们在views.py中执行这个代码:

print(request.FILES)

看到的是这个样子:

那么此时我们就可以确定,这个文件是上传过来了,存放在request.FILES中,那么咱们使用request.FILES.get就可以把这个图片对象拿到了。

  1. # views.py
  2. def file_put(request):
  3. if request.method == 'POST':
  4. print(request.POST) #
  5. # print(request.body)
  6. print(request.FILES) # 图片信息
  7. # 将文件给取出来
  8. img_obj = request.FILES.get('avatar')
  9. with open(img_obj.name, 'wb') as f:
  10. for line in img_obj:
  11. f.write(line)
  12. return HttpResponse('ok!')
  13. return render(request, 'file_put.html')

那么此时直接上传的话,那么就会在当前项目下展示这张照片。

利用ajax实现文件上传

首先我们需要新开一个url或者将之前的注释掉:

  1. # urls.py
  2. path('file_put/', views.file_put),

ajax提交文件的方式同样使用form表单,但是不需要给input设置name属性,只需要设置class或者id就可以了:

  1. # file_put.html
  2. <form action="" method="post">
  3. 用户名 <input type="text" id="user">
  4. 头像 <input type="file" id="avatar" >
  5. <input type="button" class="btn" value="ajax">
  6. </form>

那么咱们需要给btn设置点击click动作:

  1. $('.btn').click(function(){
  2. //涉及到文件上传 需要创建formdata对象
  3. var formdata = new FormData();
  4. formdata.append('user',$('#user').val());
  5. formdata.append('avatar',$('#avatar')[0].files[0]);
  6.  
  7. $.ajax({
  8. url:'',
  9. type:'post',
  10. contentType:false, // 交给FormData处理编码
  11. processData:false, //对数据是否进行预处理 如果不做预处理的话 就不做任何编码了
  12. data:formdata,
  13. success:function(data){
  14. console.log(data)
  15. }
  16. })
  17. })

最后在试图函数中进行文件保存操作:

  1. def file_put(request):
  2. if request.method == "POST":
  3. print("body", request.body) # 请求报文中的请求体 json
  4. print("POST", request.POST) # if contentType==urlencoded ,request.POST才有数据
  5. print('FILES', request.FILES)
  6. file_obj=request.FILES.get("avatar")
  7. with open(file_obj.name,"wb") as f:
  8. for line in file_obj:
  9. f.write(line)
  10. return HttpResponse("OK")
  11. return render(request, "file_put.html")
  12. Content-Type

在咱们刚刚的form表单的文件上传和ajax文件上传的时候,都涉及到一个请求头的东西,这个东西是什么呢?这个东西决定着服务器会按照哪种编码格式给你解码,当你默认不写的时候,此时的请求头是:application/x-www-form-urlencoded,当你想发送文件类的东西,此时的请求头应该是:form-data......

当服务器收到客户端发送过来的请求时,首先就会去查看请求头,判断你的请求头是什么,然后进行解码。

让我们分别看下这几个请求头:

x-www-form-urlencoded

application/x-www-form-urlencoded:表单数据编码为键值对,&分隔,可以当成咱们的GET请求中?后面的数据,让我们发送一个庶几乎看看:

  1. <form action="" method="post"> 用户名 <input type="text" name="user"> 密码 <input type="password" name="pwd"> <input type="submit" value="submit"> </form>

那么我们需要一个视图函数还进行处理:

  1. def file_put(request):
  2. if request.method == "POST":
  3. print("body", request.body) # 请求报文中的请求体 json
  4. print("POST", request.POST) # if contentType==urlencoded ,request.POST才有数据
  5. return HttpResponse("OK")
  6. return render(request, "file_put.html")

当我们在浏览器输入admin和123的时候,让我们来看下打印的结果是什么:


我们刚刚说过,当我们请求头什么都不写的话,那么就是默认的x-www-form-urlencoded,当请求头是这种的话,此时我们打印request.POST是有值的,也就这一种请求方式request.POST才有值。


让我们现在发送一个json的数据

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
  7. </head>
  8. <body>
  9. <form action="" method="post">
  10. 用户名 <input type="text" class="user">
  11. 密码 <input type="password" class="pwd">
  12. <input type="button" value="submit" class="btn">
  13. </form>
  14. <script>
  15. $('.btn').click(function(){
  16. $.ajax({
  17. url:'',
  18. type:'post',
  19. data:JSON.stringify({
  20. a:1,
  21. b:2
  22. }),
  23. success:function(data){
  24. console.log(data)
  25. }
  26. })
  27. })
  28. </script>
  29. </body>
  30. </html>

视图函数中是这样的:

  1. def send_json(request):
  2. if request.method == 'POST':
  3. print('body', request.body)
  4. print('post', request.POST)
  5. print('files', request.FILES)
  6. return HttpResponse('ok!')
  7. return render(request, 'send_json.html')

当我们发送数据的时候,通过解码收到的就是这样的数据:

就和我们刚刚说的一样,当请求头是x-www-form-urlencoded的时候,request.POST才会有数据,其他的就没有。

总结

以上所述是小编给大家介绍的django中的ajax组件教程详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对w3xue网站的支持!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号