美文网首页
11-视图-HttpResponse对象

11-视图-HttpResponse对象

作者: B头 | 来源:发表于2018-04-28 18:05 被阅读61次
    1. HttpReqeust对象
      1. 介绍

        1. 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,这个对象不需要我们创建,直接使用服务器构造好的对象使用就可以
        2. 视图的第一个参数必须是HttpRequest对象
        3. 在django.http模块中定义了HttpRequest对象的API
      2. 属性

        1. 下面除非特别说明,属性都是只读的
        2. path:一个字符串,表示请求的页面的完整路径,不包含域名
        3. method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'
        4. 在浏览器中给出地址发出请求采用get方式,如超链接
        5. 在浏览器中点击表单的提交按钮发起请求,如果表单的method设置为post则为post请求
        6. encoding:一个字符串,表示提交的数据的编码方式
        7. 如果为None则表示使用浏览器的默认设置,一般为utf-8
        8. 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值
        9. GET:一个类似于字典的对象,包含get请求方式的所有参数
        10. POST:一个类似于字典的对象,包含post请求方式的所有参数
        11. FILES:一个类似于字典的对象,包含所有的上传文件
        12. COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串
        13. session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见“状态保持”
    2. 以下全部都是示例
    
        接下来演示属性path、method、encoding
        对于GET、POST、FILES、COOKIES、session后面会有详细讲解
        1. path、encoding
            打开booktest/views.py文件,代码如下
            ```python
            def index(request):
                str='%s<br>%s'%(request.path,request.encoding)
                return HttpResponse(str)
            ```
            打开浏览器请求,运行效果如下图
            请求属性
    
            以chrome浏览器为例,设置编码如下图,默认为utf-8编码
            编码设置
    
        2. method
            1. 打开booktest/views.py文件,编写视图method1、method2、method3,代码如下
            ```python
            def method1(request):
                return render(request,'booktest/method1.html')
            def method2(request):
                return HttpResponse(request.method)
            def method3(request):
                return HttpResponse(request.method)
    
            ```
    
    
        3. 打开booktest/urls.py文件,新增配置如下
            ```python
                url(r'^method1/$', views.method1),
                url(r'^method2/$', views.method2),
                url(r'^method3/$', views.method3),
            ```
            在templates/booktest/下创建method1.html文件,代码如下
            ```python
            <html>
            <head>
                <title>方法练习</title>
            </head>
            <body>
            <a href="/method2/">方式一:get</a>
            <br>
            <br>
            <br>
            <form method="post" action="/method3/">
                <input type="submit" value="方式二:post">
            </form>
            </body>
            </html>
            ```
            打开浏览器,输入如下网址
            http://127.0.0.1:8000/method1/
            浏览效果如下图
            请求方式
    
            点击链接,转到method2,浏览效果如下图
            请求方式
    
            回到method1页面,点击按钮,转到method3,浏览效果如下图,报错了
            请求方式
    
            **打开test3/settings.py文件,将MIDDLEWARE_CLASSES项的csrf注释**
            请求方式
    
            回到浏览器中刷新,浏览效果如下图,点击“继续”按钮
            请求方式
    
            最终浏览效果如下图
            请求方式
    
    1. QueryDict对象

      1. 定义在django.http.QueryDict
      2. HttpRequest对象的属性GET、POST都是QueryDict类型的对象
      3. 与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
      4. 方法get():根据键获取值
      5. 如果一个键同时拥有多个值将获取最后一个值
      6. 如果键不存在则返回None值,可以设置默认值进行后续处理
        1.  dict.get('键',默认值)
           可简写为
           dict['键']
          
      7. 方法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值
        如果键不存在则返回空列表[],可以设置默认值进行后续处理
        dict.getlist('键',默认值)
        
    2. GET属性

      1. 请求格式:在请求地址结尾使用?,之后以“键=值”的格式拼接,多个键值对之间以&连接

        1. 例:网址如下
          http://www.itcast.cn/?a=10&b=20&c=python
          其中的请求参数为
          a=10&b=20&c=python
      2. 分析请求参数,键为'a'、'b'、'c',值为'10'、'20'、'python'

      3. 在Django中可以使用HttpRequest对象的GET属性获得get方式请求的参数

      4. GET属性返回QueryDict类型的对象,键和值都是字符串类型

      5. 键是开发人员在编写代码时确定下来的

      6. 值是根据数据生成的

      7. 示例

        1. 打开booktest/views.py文件,创建视图get1、get2、get3

          # 创建链接
          def get1(request):
              return render(request,'booktest/get1.html')
          # 接收一键一值
          def get2(request):
              return render(request,'booktest/get2.html')
          # 接收一键多值
          def get3(request):
              return render(request,'booktest/get3.html')
          
        2. 打开booktest/urls.py文件,配置url

          url(r'^get1/$',views.get1),
          url(r'^get2/$',views.get2),
          url(r'^get3/$',views.get3),
          
        3. 在templates/booktest目录下创建get1.html,代码如下

          <html>
          <head>
              <title>GET属性</title>
          </head>
          <body>
          链接1:一个键传递一个值<br>
          <a href="/get2/?a=1&b=2">get2</a>
          <hr>
          链接2:一个键传递多个值<br>
          <a href="/get3/?a=1&a=2&b=3">get3</a>
          </body>
          </html>
          
        4. 运行服务器,请求get1
          http://127.0.0.1:8000/get1/
          浏览效果如下图
          get1

        5. 完善视图get2的代码如下

        接收一键一值

         ```python
         def get2(request):
             dict=request.GET
             a=dict.get('a')
             b=dict.get('b')
             c=dict.get('c','1')
             context={'a':a,'b':b,'c':c}
             return render(request,'booktest/get2.html',context)
         ```
        
        1. 在templates/booktest目录下创建get2.html,代码如下

          <html>
          <head>
              <title>GET属性一键一值</title>
          </head>
          <body>
          a:{{a}}
          <hr>
          b:{{b}}
          <hr>
          c:{{c}}
          </body>
          </html>
          

          点击链接get2,浏览效果如下图
          get2

        2. 完善视图get3的代码如下

          # 接收一键多值
          def get3(request):
              dict=request.GET
              a=dict.getlist('a')
              b=dict.get('b')
              context={'a':a,'b':b}
              return render(request,'booktest/get3.html',context)
          
        3. 在templates/booktest目录下创建get3.html,代码如下

          <html>
          <head>
              <title>GET属性一键多值</title>
          </head>
          <body>
          a:
          <ul>
              {%for i in a%}
              <li>{{i}}</li>
              {%endfor%}
          </ul>
          <hr>
          b:{{b}}
          </body>
          </html>
          

          后退到get1页面,点击链接get3,浏览效果如下图

    3. POST属性

      1. 使用form表单请求时,method方式为post则会发起post方式的请求,需要使用HttpRequest对象的POST属性接收参数,POST属性返回QueryDict类型的对象

      2. 问:表单form如何提交参数呢?

      3. 答:控件name属性的值作为键,value属性的值为值,构成键值对提交

        1. 如果控件没有name属性则不提交
        2. 对于checkbox控件,name属性的值相同为一组,被选中的项会被提交,出现一键多值的情况
      4. 键是控件name属性的值,是由开发人员编写的

      5. 值是用户填写或选择的

      6. 示例
        打开booktest/views.py文件,创建视图post1、post2

        创建表单

        def post1(request):
            return render(request,'booktest/post1.html')
        

        接收表单请求的数据

        def post2(request):
            return HttpResponse('hello post2')
        

        打开booktest/urls.py文件,配置url

            url(r'^post1/$',views.post1),
            url(r'^post2/$',views.post2),
        

        在templates/booktest目录下创建post1.html,代码如下

        <html>
        <head>
            <title>POST属性</title>
        </head>
        <body>
        <form method="post" action="/post2/">
            姓名:<input type="text" name="uname"/><br>
            密码:<input type="password" name="upwd"/><br>
            性别:<input type="radio" name="ugender" value="1"/>男
            <input type="radio" name="ugender" value="0"/>女<br>
            爱好:<input type="checkbox" name="uhobby" value="胸口碎大石"/>胸口碎大石
            <input type="checkbox" name="uhobby" value="脚踩电灯炮"/>脚踩电灯炮
            <input type="checkbox" name="uhobby" value="口吐火"/>口吐火<br>
            <input type="submit" value="提交"/>
        </form>
        </body>
        </html>
        

        在浏览器中请求地址如下
        http://127.0.0.1:8000/post1/
        填写、选择后,浏览效果如下图
        psot1

        打开浏览器“开发者工具”,选择“Network”标签,点击“提交”按钮,在“开发者工具”中点击“post2”,找到提交数据如下图
        psot2

        完善视图post2的代码如下

        接收表单请求的数据

        def post2(request):
            dict=request.POST
            uname=dict.get('uname')
            upwd=dict.get('upwd')
            ugender=dict.get('ugender')
            uhobby=dict.getlist('uhobby')
            context={'uname':uname,'upwd':upwd,'ugender':ugender,'uhobby':uhobby}
            return render(request,'booktest/post2.html',context)
        

        在templates/booktest目录下创建post2.html,代码如下

        <html>
        <head>
            <title>POST属性</title>
        </head>
        <body>
        用户名:{{uname}}<br>
        密码:{{upwd}}<br>
        性别:{{ugender}}<br>
        爱好:{{uhobby}}<br>
        <ul>
            {%for i in uhobby%}
            <li>{{i}}</li>
            {%endfor%}
        </ul>
        </body>
        </html>
        

        刷新后浏览效果如下图

    相关文章

      网友评论

          本文标题:11-视图-HttpResponse对象

          本文链接:https://www.haomeiwen.com/subject/sxqnlftx.html