美文网首页《Django By Example》
【Django】视图篇:视图系统、装饰器、Requset对象 V

【Django】视图篇:视图系统、装饰器、Requset对象 V

作者: Alcazar | 来源:发表于2019-08-08 08:37 被阅读11次
    关于Django的视图系统

    【定义】:一个视图函数(或类),简称为视图,是一个简单的python函数或类,它接受web请求并且返回web响应。

    响应:可以是一张网页的html内容,一个重定向,一个404错误,一个hxml 文档,或一张图片。

    无论视图本身包含什么逻辑,都要返回响应,代码写在那里都无所谓,只要它在你当前项目目录下面。为了将代码放在某处,大家预定成俗将视图放在项目project或应用程序app目录中的名为views.py的文件中。

    • (1)、每个视图函数,都使用HttpRequest对象作为第一个参数,并且通常称之为request。

    • (2)、每个视图函数,都会返回一个HttpResponse对象,其中包含生成的响应。

    Django使用请求和响应对象来通过系统传递状态。

    当浏览器向服务端请求一个页面是,Django创建一个HttpRequest对象,该对象包含关于请求的元数据,然后,Django加载相应的视图,将这个HttpRequest对象作为第一个参数传递给视图函数,每个视图函数负责返回一个HttpResponse对象。

    常见的render,redirect,HttpResponse对象返回的都是一个HttpResponse对象。


    视图编码分类
    • FBV(function based view):就是将业务逻辑写在一个函数中
    • CBV(class based view): 就是以类的方式写;

    给视图加装饰器

    (1)FBV加装饰器
    常用的一种方式:在函数上方加装饰器 @wrapper_name;

    (2)CBV加装饰器

    【必须导入】:

    from django.utils.decorators import method_decorator
    

    【方式】:
     2.1、直接在方法上加:

    @method_decorator(wapper_name)
    def  get(self,request):pass
    

    2.2、给自定义的dispatch方法加:

    @method_decorator(wrapper_name) 
    def  dispatch(self,request,*args,**kwargs)</pre>
    

    2.3、类上加装饰器

    @method_decorator(wapper_name, name='post')    #给方法post加装饰器
    @method_decorator(wapper_name, name='get')
    class AddClass(View)
    
    #【注】:其实也可以直接给View中的dispatch方法加装饰器,这样同样可以实现给自己类下的所有方法加装饰器(自己未定义dispatch方法时)
    @method_decorator(wapper_name, name='dispatch')
    class AddClass(View)
    

    【提升】:
    为视图加装饰器或者保护csrf_token

    rom django.views.decorators.csrf import csrf_exempt,csrf_protect
    

    Requset对象 VS Respondse对象
    request对象

    当一个页面被请求时,Django会形成一个包含被请求信息的对象;
    Django会将这个对象自动传递给响应的视图函数,一般视图函数预定俗称的使用request参数承接这个对象。

    请求相关的常用值

    请求常用值 作用
    path_info 返回用户访问的url,不包含域名,仅path不带参数
    get_full_path() 返回完整路径,不含域名
    method 请求中使用的HTTP方法的字符串表示,全大写表示
    GET 包含所有HTTP GET参数的类字典对象
    POST 包含所有HTTP POST参数的类字典对象
    body 请求体,byte类型的request.POST的数据就是从body里面提取到的
    FILES 上传文件,{} 注意form标签加enctype="multipart/form-data"属性
    HTTP_REFERER 跳转到上次访问的页面,用户在未登录前要访问的页面,登录后跳转到该页面, redirect(request.Meta.get('HTTP_REFERER','')

    属性

    django将请求报文中的请求行、头部信息、内容主体封装成 HttpRequest 类中的属性。

    请求(属性) 作用
    HttpRequest.scheme 表示请求方案的字符串
    HttpRequest.body 一个字符串,代表请求报文的主体
    HttpRequest.POST 要处理表单数据的时候(推荐使用),一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
    HttpRequest.GET 一个类似于字典的对象,包含 HTTP GET 的所有参数。
    HttpRequest.path 一个字符串,表示请求的路径组件(不含域名)。
    HttpRequest.method 一个字符串,表示请求使用的HTTP 方法。
    HttpRequest.encoding 一个字符串,表示提交的数据的编码方式(默认为 utf-8
    HttpRequest.COOKIES 一个标准的Python 字典,包含所有的cookie。键和值都为字符串。
    HttpRequest.FILES 一个类似于字典的对象,包含所有的上传文件信息。
    HttpRequest.META 一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器
    HttpRequest.session 一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。

    【拎出来详谈】HttpRequest.META:是 一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器

    头部信息示例 具体意义
    CONTENT_LENGTH 请求的正文的长度(是一个字符串)。
    CONTENT_TYPE 请求的正文的MIME 类型。
    HTTP_ACCEPT 响应可接收的Content-Type。
    HTTP_ACCEPT_ENCODING 响应可接收的编码。
    HTTP_ACCEPT_LANGUAGE 响应可接收的语言。
    HTTP_HOST 客服端发送的HTTP Host 头部。
    HTTP_REFERER Referring 页面。
    HTTP_USER_AGENT 客户端的user-agent 字符串。
    QUERY_STRING 单个字符串形式的查询字符串(未解析过的形式)。
    REMOTE_ADDR 客户端的IP 地址。
    REMOTE_HOST 客户端的主机名。
    REMOTE_USER 服务器认证后的用户。
    REQUEST_METHOD 一个字符串,例如"GET" 或"POST"。
    SERVER_NAME 服务器的主机名。
    SERVER_PORT 服务器的端口(是一个字符串)。

    请求方法 具体作用
    HttpRequest.get_host() 根据从HTTP_X_FORWARDED_HOST(如果打开 USE_X_FORWARDED_HOST,默认为False)和 HTTP_HOST 头部信息返回请求的原始主机。
    HttpRequest.get_full_path() 返回 path
    HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 返回签名过的Cookie 对应的值,如果签名不再合法则返回django.core.signing.BadSignature。
    HttpRequest.is_secure() 如果请求时是安全的,则返回True;即请求通是过 HTTPS 发起的。
    HttpRequest.is_ajax() 请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串'XMLHttpRequest'。

    Respondse对象

    我们写的每个视图都需要实例化,填充和返回一个HttpResponse。HttpResponse类位于django.http模块中。具体属性见下表

    属性 作用
    HttpResponse.content: 响应内容
    HttpResponse.charset: 响应内容的编码
    HttpResponse.status_code: 响应的状态码

    render()

    结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
    【】

    参数 作用
    request 用于生成响应的请求对象。
    template_name 要使用的模板的完整名称,可选的参数
    context 添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
    content_type 生成的文档要使用的MIME类型。默认为 DEFAULT_CONTENT_TYPE 设置的值。默认为'text/html'
    status 响应的状态码。默认为200。
    useing 用于加载模板的模板引擎的名称。

    【简单的实例】

    from django.http import HttpResponse
    from django.template import loader
    
    def my_view(request):
        # 视图代码写在这里
        t = loader.get_template('myapp/index.html')
        c = {'foo': 'bar'}
        return HttpResponse(t.render(c, request))
    

    redirect()

    【参数】:

    • 一个模型:将调用模型的get_absolute_url() 函数
    • 一个视图:可以带有参数,将使用urlresolvers.reverse 来反向解析名称
    • 一个绝对的或相对的URL,将原封不动的作为重定向的位置。

    默认情况下,redirect() 返回一个临时重定向;传递permanent=True 可以返回一个永久的重定向。

    相关文章

      网友评论

        本文标题:【Django】视图篇:视图系统、装饰器、Requset对象 V

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