zoukankan      html  css  js  c++  java
  • views.py文件详解

    一、http请求中产生的两个核心对象

    http请求:HttpRequest
    http响应: HttpResponse

    所在位置: django.http

    1、HttpRequest:
    HttpRequest对象属性

    1.1 path
    请求页面的全路径,不包括域名,例如,"/music/bands/the_beatles/""

    1.2 method
    请求中使用的HTTP方法的字符串表示,全大写表示。例如:
    if request.method == 'GET':
           do_something()
    elif request.method =='POST':
          do_something_else()

    1.3 GET
    包含所有的HTTP GET参数的类字典。参见QueryDict文档

    1.4 POST
    包含所有的HTTP GET参数的类字典。参见QueryDict文档
    服务器收到空的POST请求的情况也是有可能发生的。也就是说,表单form通过HTTP POST方法提交请求,但是表单中可以没有数据。因此
    不能使用语句if request.POST来判断是否有使用HTTP POST方法;应该使用if request.method == "POST"(参见本表method属性)

    注意:POST不包括file-upload信息,参见FILES属性

    POST提交和GET提交最大区别:
    POST提交内容不会显示在浏览器上,即不以URL形式显示在浏览器的地址栏上,GET提交则会完整的显示在浏览器的地址栏上

    1.5 REQUEST
    为了方便,该属性市POST和GET属性的集合,但是有特殊性,先查找POST属性,然后再查找GET属性。借鉴PHP's $_REQUEST.
    例如,如果GET = {"name":"john"}和POST = {"age":'60'},则REQUEST["name"]的值是"john",REQUEST["age"]的值是"34"
    强烈建议使用GET和POST,因为这两个属性更加显示化,写出代码更容易了解。截止到django1.8,REQUEST方法已经废弃了,Django1.9中已经不彻底抛弃了该方法

    1.6 COOKIES
    包含所有cookies的标准Python字典对象,Keys和values都是字符串,参见第12章,有关cookies更详细的讲解

    1.7 FILES
    包含所有上传文件的类字典对象,FILES中的每个Key都是<input type="file" name="" />标签中的name属性。
    FILES中的每个value同时也是一个标准Python字典对象,包含下面三个Keys:
    filename:上传文件名,用Python字符串表示
    content-type:上传文件的Content type
    content:上传文件的原始内容

    注意:只有在请求方法是POST,并且请求页面中<form>有enctype="multipart/form-data" 属性时FILES才拥有数据。否则,FILES时一个空字典


    1.8 META
    包含所有可用的HTTP头部信息的字典。例如:
    CONTENT_LENGTH
    CONTENT_TYPE
    QUERY_STRING: 未解析的原始查询字符串
    REMOTE_ADDR:客户端IP地址
    REMOTE_HOST:客户端主机名
    SERVER_NAME:服务器主机名
    SERVER_PORT:服务器端口

    META中这些头加上前缀HTTP_最未Key,例如:
    HTTP_ACCEPT_ENCODING
    HTTP_ACCEPT_LANGUAGE
    HTTP_HOST:客户端发送的HTTP主机头信息
    HTTP_REFERER: referring页
    HTTP_USER_AGENT:客户端的user-agent字符串
    HTTP_X_BENDER:X-Bender头信息

    1.9 User
    是一个django.contrib.auth.models.User对象,代表当前登录的用户。如果访问用户当前没有登录,user被初始化未
    django.contrib.auth.models.AnonymousUser的实例。你可以通过user的is_authenticated()方法拉力辨别用户是否登录:
    if request.user.is_authenticated():
            # Do something for logged-in users
    else:
           # Do something for anonymous users.

    注意:只有激活Django中年的AuthenticationMiddleware时,该属性才可用


    1.10 session
    唯一可读写的属性,代表当前会话的字典对象。只有激活Django中的session支持时该属性才可用,
    参见官方文档第12章

    1.11 raw_post_data
    原始的HTTP POST数据,未解析过,高级处理时会有用过

    Httprequest对象的方法(部分)

    1.12 get_full_path()

    返回包含查询字符串的请求路径。例如:
    "/music/bands/the_beatles/?pring=true"
    这里要跟get_path方法区分开来,这里路径包含参数,get_path方法返回来不包含参数仅仅是省略域名的url路径

    QueryDict对象(部分)

    1.13 get()

    如果key对应多个value,get()返回最后一个value
    在HttpRequest对象中,GET和POST属性时django.http.QueryDict类的实例

    2、HttpRespouse:
    对于HttpRequest对象来说,是由Django自动创建,但是HttpRresponse对象就必须我们自己创建
    每个View方法必须返回一个HttpRespouse对象

    HttpResponse类在django.http.HttpResponse中


    构造HttpRespouse:
    >>> response = HttpResponse("Here's the text of the Web page.")
    >>> response = HttpResponse("Text only,please.",{"mimetype":"text/plain"})

    更详细的有关request和response对象的介绍
    https://docs.djangoproject.com/en/1.9/ref/request-response/

    二、在HttpRespouse对象上扩展的常用方法 render、render_to_response、redirect

    response方法:
    from django.template import loader
    from django.http import HttpRequest,HttpResponse

    def hello(request,a):
          print(request.get_full_path())
          user_list = User.objects.all()
          t = loader.get_template('table.html')
          c={'user_list':user_list}
          return HttpResponse(t.render(c,request),content_type="text/html") #返回一个response对象,里面又通过模板对象中的render方法来实现渲染

    render方法
    就是将上述response中的t、c等定义代码简化为一句代码:

    def hello(request,a):
           print(request.get_full_path())
           user_list = User.objects.all()
           return render(request,'table.html',{'user_list':user_list})

    render_to_response方法:相对于render方法少传递一个request对象

    from django.shortcuts import render,render_to_response

    def hello(request,a):
          print(request.get_full_path())
          user_list = User.objects.all()
          return render_to_response('table.html',{'user_list':user_list})

    redirect方法
    该方法是作为跳转使用,比如上述代码后面跳转到百度:
    from django.shortcuts import redirect

    def hello(request,a):
          print(request.get_full_path())
          user_list = User.objects.all()
          return redirect("http://www.baidu.com")

    更多详见:
    https://docs.djangoproject.com/en/1.9/topics/http/shortcuts/


    三、其他常用方法
    locals():可以直接将函数中所有的变量全部传递给模板,不管是我们自己定义的还是系统定义的变量都会一起传递过去,不用我们自己再去拼接字典,从而达到一个简化的目的

    实例代码:

    def hello(request,a):
          print(request.get_full_path())
          user_list = User.objects.all()
          print(locals())
          return render_to_response('table.html',locals())

    输出结果变量:
    /hello/
    {'a': '123', 'user_list': [<User: admin>, <User: test>], 'request': <WSGIRequest: GET '/hello/'>}

  • 相关阅读:
    stl 之 next_permutation 求出一个排序的下一个排列的函数 转载
    算法学习一~分治法~二分查找,快速的找~
    Cocos2d开发系列(九)
    每个好架构师都是一位出色的程序员
    本地通知和推送通知编程指南(2)
    【Cocos2d游戏开发之十二】浅析使用C++/C/OC进行iOS游戏混编出现“failed with exit”问题与小结;
    【Cocos2d游戏开发之十三】CCSprite利用Bezier(贝塞尔)做抛物线动作并让CCSprite同时播放两个Action动作!
    【Cocos2d游戏开发之八】开启高清(960*640)模式问题与解答、图片适配以及设置iphone横竖屏
    使用SQL 2008进行INSERT操作
    【Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
  • 原文地址:https://www.cnblogs.com/kindnull/p/8379766.html
Copyright © 2011-2022 走看看