十一 Django-视图

一、概要

视图可以一个python函数,可以叫视图函数,或者简称视图,也可以是是一个类,定义在views.py 文件中。
主要用于接收并处理请求,调用模型层和模板层,响应请求(返回HttpResponse或其子类)每一个用户请求,都对应着一个视图(和url地址),由视图处理请求后,再返回html页面内容给浏览器显示。在http请求中产生两个核心对象,所在位置是,django.http

二、核心对象

  1. http请求:HttpRequest对象
  2. http响应:HttpResponse对象

三、HttpRequest对象

1、说明

当请求一个页面时,Django 创建一个 HttpRequest对象包含原数据的请求。然后 Django 加载适当的视图,通过 HttpRequest作为视图函数的第一个参数。每个视图负责返回一个HttpResponse目标

2、属性

2.1、GET

  1. 说明
    一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象
  2. 举个栗子
    value = request.GET.get('key',default=None)
    

2.2、POST

  1. 说明
    一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
  2. 栗子
    value = request.POST.get('key',default=None)
    

2.3、path

  1. 说明
    请求页面的全路径,不包括域名和参数
  2. 栗子
    /index/
    /shop/list/
    

2.4、method

  1. 说明
    请求中使用的HTTP方法的字符串表示。全大写表示
  2. 示例
    if request.method=='GET':
       #这里是get请求
    elif request.method ='POST':
       #这里是post请求
    

2.5、COOKIES

  1. 说明
    包含所有cookies的标准Python字典对象;keys和values都是字符串。
  2. 示例代码
    查看会话机制专题
    

2.6、session

  1. 说明
    唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。
  2. 栗子
    查看会话机制专题
    

2.7、FILES

  1. 说明
    包含所有上传文件的类字典对象;
    FILES中的每一个Key都是'<input type="file" name="" />'标签中 name属性的值,FILES中的每一个value同时也是一个标准的python字典对象
    注意,FILES 只有在请求的方法为POST 且提交的<form>带有enctype="multipart/form-data" 的情况下才会包含数据。否则,FILES 将为一个空的类似于字典的对象
  2. 栗子
    查看文件上传相关
    

2.8、user

  1. 说明
    一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。
    如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated()
  2. 栗子
    具体查看用户认证
    if request.user.is_authenticated():
     # Do something for logged-in users.
    else:
     # Do something for anonymous users.
    

2.9、encoding

  1. 说明
    一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。
    接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
    如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。

2.10、META

  1. 说明

一个标准的Python字典包含所有可用的HTTP头。可用标题取决于客户端和服务器

  1. 栗子
    • CONTENT_LENGTH
      请求体的长度(一个字符串)。
    • CONTENT_TYPE
      请求体的类型。
    • HTTP_ACCEPT
      为响应–可以接受的内容类型。
    • HTTP_ACCEPT_ENCODING
      接受编码的响应
    • HTTP_ACCEPT_LANGUAGE
      接受语言的反应
    • HTTP_HOST
      客户端发送的HTTP主机头。
    • HTTP_REFERER
      参考页面
    • HTTP_USER_AGENT
      客户端的用户代理字符串。
    • QUERY_STRING
      查询字符串,作为一个单一的(分析的)字符串。
    • REMOTE_ADDR
      客户端的IP地址
    • REMOTE_HOST
      客户端的主机名
    • REMOTE_USER
      用户通过Web服务器的身份验证
    • REQUEST_METHOD
      字符串,如"GET"或"POST"
    • SERVER_NAME
      服务器的主机名
    • SERVER_PORT
      服务器的端口(一个字符串)

3、方法

3.1、get_host()

  1. 说明
    根据从HTTP_X_FORWARDED_HOST(如果打开 USE_X_FORWARDED_HOST,默认为False)和 HTTP_HOST 头部信息返回请求的原始主机。
    注意:当主机位于多个代理后面时,get_host() 方法将会失败。除非使用中间件重写代理的首部。
  2. 栗子
    # 假如要访问的地址是
    http://127.0.0.1:8000/user/login/
    

3.2、get_full_path()

  1. 说明
     返回 path,如果可以将加上查询字符串。
  2. 举个栗子
    # 完整的请求地址 http://127.0.0.1:8000/user/list/?page=1&size=10
    print(request.get_full_path())
    # 输出 /user/list/?page=1&size=10
    

3.3、is_secure()

  1. 说明
    如果请求时是安全的,则返回True;即请求通是过 HTTPS 发起的。

3.4、is_ajax()

  1. 说明
    判断是否是ajax请求

四、HttpResponse对象

1、说明

对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象

2、主要的属性

  • content:表示返回的内容,字符串类型
  • charset:表示response采用的编码字符集,字符串类型
  • status_code:响应的HTTP响应状态码,默认是200
  • content-type:指定输出的MIME类型

3、主要的方法

  • init
    使用页内容实例化HttpResponse对象
  • write(content)
    以文件的方式写
  • flush():
    以文件的方式输出缓存区
  • set_cookie
    设置Cookie,具体的使用看会话章节

4、HttpResponse的常见的子类

4.1、JsonResponse

  1. 说明
    这个类是HttpRespon的子类,返回json类型的数据,它的默认Content-Type 被设置为: application/json
  2. 构造方法
    JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)
    
  3. 参数说明
    • data
      一个字典类型的数据
    • encoder
      json生成器
    • safe
      默认的safe 参数是 True. 如果你传入的data数据类型不是字典类型,那么它就会抛出 TypeError的异常,如果设置为False ,那data可以填入任何能被转换为JSON格式的对象,比如list, tuple, set。
    • json_dumps_params
      一个字典,它将调用json.dumps()方法并将字典中的参数传入给该方法
  4. 示例代码
    # 使用HttpResponse
    def index(request):
        data={
            'name':'hello',
            'age':18,
        }
        return HttpResponse(json.dumps(data),content_type="application/json")
    # 使用JsonResponse 直接将字典传递过去
    def index(request):
        data={
            'name':'hello',
            'age':18,
        }
        return JsonResponse(data)
    
    # 如果返回的是 list类型
    def index(request):
        data=[1,2,3,4,5]
        return JsonResponse(data,safe=False)
    '''
    注意: 如果不设置safe=False 将会抛出
    TypeError错误
    '''
    

4.2、TemplateResponse

  1. 说明
    SimpleTemplateResponse的子类,而SimpleTemplateResponse又继承自HttpResponse
    主要的作用是将模板渲染成HTML字符串返回给客服端,具体看快捷方法中的render函数

4.3、HttpResponseRedirect

  1. 说明
    重定向,服务器端跳转
    具体看细节看重定向章节

五、快捷方法

1、说明

  • 页面渲染:render(推荐),render_to_response,
  • 页面跳转:redirect
  • locals: 可以直接将对应视图函数中所有的变量传给模板

2、render

  1. 方法
    render(request, template_name, context=None, content_type=None, status=None,using=None)
    
  2. 参数说明
    • request
      请求
    • template_name(必选)
      一个模板的使用或模板序列名称全称。如果序列是给定的,存在于第一个模板将被使用
    • context(可选)
      一组字典的值添加到模板中。默认情况下,这是一个空的字典。
    • content_type(可选)
      MIME类型用于生成文档。
    • status (可选)
      为响应状态代码。默认值为200
    • using
      用于加载模板使用的模板引擎的NAME。
  3. 示例代码
    # 纯静态界面渲染
    def index(request):
        return render(request,'index.html')   #向用户显示一个html页面
    
    # 配合传递数据配合模板语法使用
    def index(request):
     data={'user':{'name':'小明',age:18}}
        return render(request,'index.html',context=data)   #向用户显示一个html页面
    
    # 也可以使用简写方式 locals()函数,他会将视图函数中的所有局部变量封装到字典中
    # 主要在开发中尽量不要使用,尤其数据比较复杂的时候,因为有可能有的数据不一定会使用
    # 所以当你确定你的视图函数中的定义的所有变量都要传递给视图的时候,你可以使用这个函数
    def index(request):
     user = {'name':'小明',age:18}
        # 生成的数据context = {'user': user}
        return render(request,'index.html',locals())   #向用户显示一个html页面
    

3、redirect 函数

  1. 说明
    具体查看重定向章节

六、FBV与CBV

  1. 说明
    FBV、CBV是Django视图路由处理模型,当用户请求送达路由系统URL后,由其转发给视图view来分析并处理
    CBV全称是class base views,中文名字类通用视图
    FBV全称是function base views,中文名字视图函数
  2. FBV实例
    #urls.py
    from django.conf.urls import url, include
    urlpatterns = [
        url(r‘^index/‘, views.index),
    ]
    
    #views.py
    from django.shortcuts import render
    def index(request):
        if request.method == ‘POST‘:
            print(‘method is :‘ + request.method)
        elif request.method == ‘GET‘:
            print(‘method is :‘ + request.method)
        return render(req, ‘index.html‘)
    
    #index.html
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
        <form action="" method="post">
            <input type="text" name="A" />
            <input type="submit" name="b" value="提交" />
        </form>
    </body>
    </html>
    
  3. CBV实例
    from mytest import views
    urlpatterns = [
        # url(r‘^index/‘, views.index),
        url(r‘^index/‘, views.Index.as_view()),
        #注:url(r‘^index/‘, views.Index.as_view()),  是固定用法
    ]
    
    #views
    from django.views import View
    class Index(View):
        def get(self, request):
            print(‘method is :‘ + request.method)
            return render(request, ‘index.html‘)
        def post(self, request):
            print(‘method is :‘ + request.method)
            return render(request, ‘index.html‘)
    
    <!--index.html -->
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
        <form action="" method="post">
            <input type="text" name="A" />
            <input type="submit" name="b" value="提交" />
        </form>
    </body>
    </html>
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容