专栏首页python-爬虫form表单提交与ajax消息传递

form表单提交与ajax消息传递

form表单提交与ajax消息传递

1.前后端传输数据编码格式contentType:

       urlencoded
        
          对应的数据格式:name=xxx&password=666
          后端获取数据:request.POST
           ps;django会将urlencoded编码的数据解析自动放到request.POST
    
      formdata
        form表单传输文件的编码格式
        后端获取文件格式数据:request.FILES
        后端获取普通键值对数据:request.POST
    
      application/json
          ajax发送json格式数据
          需要注意的点
            编码与数据格式要一致

2.form表单与ajax异同点:

     (1) form表单不支持异步提交局部刷新
     (2) form表单不支持传输json格式数据
     (3) form表单与ajax默认传输数据的编码格式都是urlencoded

3.ajax传普通数据

<!DOCTYPE html>
<html lang="en">
<head>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
{#<input type="file" name="myfile" id="i1">#}
<button id="d1">提交~</button>
<script>
   $('#d1').click(function () {
                    $.ajax({
                        // 提交的地址
                        url:'/index/',
                        // 提交的方式
                        type:'post',
                        // 提交的数据
                        data:{'name':'sean','password':'123'},
                        // 回调函数
                        success:function (data) {  // data接收的就是异步提交返回的结果
                            alert(data)
                        }
                    })
                })
</script>

4.ajax传文件数据

<script>
        $('#d1').click(function () {
                   var formdata = new FormData();
                   // FormData对象不仅仅可以传文件还可以传普通的键值对
                    formdata.append('name','owen');
                    // 获取input框存放的文件
                    //$('#i1')[0]由Jquery对象变为js对象
                    formdata.append('myfile',$('#i1')[0].files[0]);
                    $.ajax({
                        url:'',
                        type:'post',
                        data:formdata,
                        // ajax发送文件需要修改两个固定的参数
                        processData:false,  // 告诉浏览器不要处理我的数据
                        contentType:false,  // 不要用任何的编码,就用我formdata自带的编码格式,django能够自动识别改formdata对象
                        // 回调函数
                        success:function (data) {
                            alert(data)
                        }
                    })
                })
</script>

5.ajax传json数据:

<script>
            $('#d1').click(function () {
                   $.ajax({
                       url:'',  // url参数可以不写,默认就是当前页面打开的地址
                       type:'post',
                       contentType:'application/json',
                       data:JSON.stringify({'name':'nick','hobby':'study'}),
                       success:function (data) {
                            alert(data)
                       }
                   })
                })
</script>

后台:

import json
from django.http import JsonResponse
def ajax_json(request):
    if request.method == 'POST':
        print(request.body)  # json格式只有通过request.body才能查看
        res = json.loads(request.body.decode('utf-8'))
        hobby = res.get('hobby')

        return HttpResponse('OK')  # 必须返回HttpResponse对象
    return render(request, 'ajax_json.html')

6.form表单

<h1>form_up</h1>
<form action="" method="post" enctype="multipart/form-data">
    <input type="text" name="username">
    <input type="file" name="my_file">
    <input type="submit">
</form>

后台: def index(request): if request.method == 'POST': print(request.POST) # 普通的键值对:<QueryDict: {'name': ['xxx']}> print(request.body) #print(request.FILES) #传文件< MultiValueDict: {'myfile': [ < InMemoryUploadedFile: day17课件.md(application / octet - stream) >]} > return HttpResponse('OK') return render(request, 'index.html')

七Django默认有七个中间件

Django默认有七个中间件,但是django暴露给用户可以自定义中间件并且里面可以写五种方法

中间件可以定义五个方法,分别是:(主要的是process_request和process_response)
有response需要加上return

process_request(self,request)
process_response(self, request, response)
process_view(self, request, view_func, view_args, view_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)


  'mymiddleware.middleware.MyMiddleWare1'

  


 from django.utils.deprecation import MiddlewareMixin



 class MyMiddleWare(MiddlewareMixin):
    def process_request(self,request):
        print('我是第一个自定义的中间件中process_request方法')


    def process_response(self,request,response):
        print('我是第一个自定义的中间件中process_response方法')
        return response

拷贝方法:


        import copy
        params = copy.deepcopy(request.POST)
        params["firstname"] = "zhao"
        print(params)
        request.POST = params
        #可利用深拷贝在POST中手动添加键值对
        #https://www.cnblogs.com/zgf-666/p/9161910.html


中间件代码:
from django.utils.deprecation import MiddlewareMixin
import json


class MyMiddleWare(MiddlewareMixin):
    def process_request(self,request):
        print('我是第一个自定义的中间件中process_request方法')
        import copy
        params = copy.deepcopy(request.POST)
        # params["firstname"] = "zhao"
        # print(params)
        # request.POST = params
        if not request.POST:
            if request.body:
                # < QueryDict: {'username': ['dasdas']} >
                res = json.loads(request.body.decode('utf-8'))
                print(res,type(res))
                for k,v in res.items():
                    params[k] = v
                request.POST = params
                # print(request.POST)


    def process_response(self,request,response):
        print('我是第一个自定义的中间件中process_response方法')
        return response

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python获取代理需要账户和密码代码模板

    小小咸鱼YwY
  • Flask中的request和response

    小小咸鱼YwY
  • Python3安装与使用urllib2包之小坑

    Python3.6.6或者说python3.x找不到urllib2语法问题修改之后,会报一个没有安装urllib2的包的错误。

    小小咸鱼YwY
  • Ajax设置请求和接收响应、自己封装简易jQuery.Ajax、回调函数

    这篇文章是承接前几篇博客的,是前几篇继续学习 包括Ajax学习与理解和简化版自己实现jQuery等 这篇文章只算是我的个人学习笔记,内容没有精心排版,一些错误请...

    代码之风
  • Servlet第四篇【request对象常用方法、应用】

    什么是HttpServletRequest HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所...

    Java3y
  • python 终极篇 --- django

    一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。

    py3study
  • 聊聊claudb的pubsub command

    claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/pubsub/PublishComm...

    codecraft
  • 聊聊claudb的pubsub command

    claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/pubsub/PublishComm...

    codecraft
  • python获取代理需要账户和密码代码模板

    小小咸鱼YwY
  • Spring中获取Request的几种方法及其线程安全性分析

    本文将介绍在Spring MVC开发的Web系统中,获取request对象的几种方法,并讨论其线程安全性。

    Java后端技术

扫码关注云+社区

领取腾讯云代金券