1. 装饰器
  1.
   def wrapper(fn):
    def inner(*args,**kwargs):
     执行被装饰函数之前的操作
     ret = fn(*args,**kwargs)
     执行被装饰函数之后的操作
     
     return ret
    return inner
    
   
   def yue(tools):
    pass
    
   yue = wrapper(yue)
   
   print(yue(tools))
   
 2. tags
  1. for
   {% for i in list %}
    {{ i }}
   {% endfor %}
   
   {% for i in list %}
    {{ i }}
    
   {% empty %}
   
    空的
   {% endfor %}
  
   forloop  {}
   forloop.counter      当前循环的索引值   索引值从1开始
   forloop.counter0     当前循环的索引值   索引值从0开始
   forloop.revcounter   当前循环的索引值(倒序)   索引值到1结束
   forloop.revcounter0   当前循环的索引值(倒序)   索引值到0结束
   forloop.first   当前循环是否是第一次  True
   forloop.last   当前循环是否是最后一次  
   
   forloop.parentloop   {}
  2. if
   {%  if  条件%}
    操作
   {% endif %}
   
   {%  if  条件%}
    操作
    
   {% elif 条件 %}
   
   {% else %}
    
   {% endif %}
   
   注意:
    1. 不支持连续判断  a>b>c  a>b and b>c 
    2. 不支持算数运算  + - * /    add
    
  3. with 
   {% with 变量 as 别名%}
   
    {{ 别名 }}
   {% endwith %}
   
  4. csrf_token
   1. 放在form表单中
   2. 在表单中添加了一个隐藏的input标签
    name csrfmiddlewaretoken
    valve  askjdaskdhashdkasd  64
  5. 母版继承
   1. 定义一个母版  普通的HTML代码  base.html
   2. 在母版中定义block块
   3. 子页面中继承的母版 {% extends  'base.html' %}
   4. 重写block块
   
   注意事项:
    1. {% extends  'base.html' %}写在第一行
    2. {% extends name %}   name写继承的母版的名字字符串
    3. 自定义的内容写在block中
    4. 定义多个block块  一般要有js css

1. 模板
  1. 组件
   1. 写一段的代码  nav.html
   2. {% include 'nav.html' %}
   
  2. 静态文件相关
   1. {% load static %}
   
   2. {% static  '相对路径' %}   ——》 去settings中获取STATIC_URL  '/static/' 和相对路径进行拼接
   
   3. {% get_static_prefix %}    ——》 去settings中获取STATIC_URL  '/static/'
    
    "{% get_static_prefix %}相对路径"
   
   
  3. 自定义inclusion_tag
   1. 在app下创建一个templatetags的python包   templatetags名字不能错
   2. 在包下写py文件 mytags
   3. 编辑文件
    from django import template
    register = template.Library()
    
   4. 定义函数
    可以接受参数
    返回一个字典
   5. 函 v数上加装饰器
    @register.inclusion_tag('pagination.html')
   6. 函数返回的字典 交给 pagination.html 渲染
  4.自定义simpletag
           和自定义filter类似,只不过接收更灵活的参数。
   定义注册simple tag
   @register.simple_tag(name="plus")
   def plus(a, b, c):
             return "{} + {} + {}".format(a, b, c)
   使用自定义simple tag
   {% load app01_demo %}

    {# simple tag #}
   {% plus "1" "2" "abc" %} 
   
  
 
 2. 视图
 
  1。 CBV 和 FBV
   FBV function based view
   CBV class based view
   
  2. CBV的流程
  
   1. 定义CBV
    from django.views import View
    class AddPress(View):
    
     def get(self, request):
      print('get')
      print(self.request)
      return render(self.request, 'add_press2.html')
     def post(self, request):
      print('post')
      press_name = request.POST.get('name')
      Press.objects.create(name=press_name)
      return redirect('/press_list/')
      
   2. 使用
    url(r'^add_press/$', views.AddPress.as_view()),  # 添加出版社
    
   3. 流程
    1. AddPress.as_view()  —— 》 view函数
    
    
    2. 当请求到来的时候执行view函数:
     1. 实例化自己写的类   —— 》self
      self = cls(**initkwargs)
     2. self.request = request
     
     3. 执行 self.dispatch(request, *args, **kwargs)
     
      1. 执行父类中的dispatch方法
       1. 判断请求方式是否被允许
        1. 允许的情况
         handler = 通过反射获取 get  post 方法
         
        2. 不允许的情况
         handler = 不允许的方法
         
        3. handler(request, *args, **kwargs)
        
      2. 返回HttpResponse对象
     4. 返回HttpResponse对象 给django
     
  3. request
     print(request.method)
    print(request.GET)
    print(request.POST)
    print(request.FILES)
    print(request.path_info)
    print(request.body)
    print(request.scheme)
    print(request.path)
    print(request.encoding)
    print(request.META)
请求相关的常用值
path_info     返回用户访问url,不包括域名
method        请求中使用的HTTP方法的字符串表示,全大写表示。
GET              包含所有HTTP  GET参数的类字典对象
POST           包含所有HTTP POST参数的类字典对象
body            请求体,byte类型 request.POST的数据就是从body里面提取到的
属性
所有的属性应该被认为是只读的,除非另有说明。
 
属性:
  django将请求报文中的请求行、头部信息、内容主体封装成 HttpRequest 类中的属性。
   除了特殊说明的之外,其他均为只读的。
0.HttpRequest.scheme
   表示请求方案的字符串(通常为http或https)
1.HttpRequest.body
  一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
  但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。
  另外,我们还可以用 python 的类文件方法去操作它,详情参考 HttpRequest.read() 。
 
2.HttpRequest.path
  一个字符串,表示请求的路径组件(不含域名)。
  例如:"/music/bands/the_beatles/"
 
3.HttpRequest.method
  一个字符串,表示请求使用的HTTP 方法。必须使用大写。
  例如:"GET"、"POST"
 
4.HttpRequest.encoding
  一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。
   这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。
   接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
   如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。
 
5.HttpRequest.GET
  一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。
 
6.HttpRequest.POST
  一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
  POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。
   因此,不应该使用 if request.POST  来检查使用的是否是POST 方法;应该使用 if request.method == "POST"
  另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。
 7.HttpRequest.COOKIES
  一个标准的Python 字典,包含所有的cookie。键和值都为字符串。
 
8.HttpRequest.FILES
  一个类似于字典的对象,包含所有的上传文件信息。
   FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。
  注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会
   包含数据。否则,FILES 将为一个空的类似于字典的对象。
 
9.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 —— 服务器的端口(是一个字符串)。
   从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时,
    都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_  前缀。
    所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。
 
10.HttpRequest.user
  一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。
  如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。
    例如:
    if request.user.is_authenticated():
        # Do something for logged-in users.
    else:
        # Do something for anonymous users.
    
       user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。
     -------------------------------------------------------------------------------------
    匿名用户
    class models.AnonymousUser
    django.contrib.auth.models.AnonymousUser 类实现了django.contrib.auth.models.User 接口,但具有下面几个不同点:
    id 永远为None。
    username 永远为空字符串。
    get_username() 永远返回空字符串。
    is_staff 和 is_superuser 永远为False。
    is_active 永远为 False。
    groups 和 user_permissions 永远为空。
    is_anonymous() 返回True 而不是False。
    is_authenticated() 返回False 而不是True。
    set_password()、check_password()、save() 和delete() 引发 NotImplementedError。
    New in Django 1.8:
    新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User。
 
11.HttpRequest.session
   一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。
    完整的细节参见会话的文档。
上传文件示例
 
def upload(request):
    """
    保存上传文件前,数据需要存放在某个位置。默认当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。从内存读取一次,写磁盘一次。
    但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。
    :param request:
    :return:
    """
    if request.method == "POST":
        # 从请求的FILES中获取上传文件的文件名,file为页面上type=files类型input的name属性值
        filename = request.FILES["file"].name
        # 在项目目录下新建一个文件
        with open(filename, "wb") as f:
            # 从上传的文件对象中一点一点读
            for chunk in request.FILES["file"].chunks():
                # 写入本地文件
                f.write(chunk)
        return HttpResponse("上传OK")
    print(request.get_host())
    print(request.get_full_path())
    print(request.is_secure())
    print(request.is_ajax())
1.HttpRequest.get_host()
  根据从HTTP_X_FORWARDED_HOST(如果打开 USE_X_FORWARDED_HOST,默认为False)和 HTTP_HOST 头部信息返回请求的原始主机。
   如果这两个头部没有提供相应的值,则使用SERVER_NAME 和SERVER_PORT,在PEP 3333 中有详细描述。
  USE_X_FORWARDED_HOST:一个布尔值,用于指定是否优先使用 X-Forwarded-Host 首部,仅在代理设置了该首部的情况下,才可以被使用。
  例如:"127.0.0.1:8000"
  注意:当主机位于多个代理后面时,get_host() 方法将会失败。除非使用中间件重写代理的首部。
 
2.HttpRequest.get_full_path()
  返回 path,如果可以将加上查询字符串。
  例如:"/music/bands/the_beatles/?print=true"
 
3.HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
  返回签名过的Cookie 对应的值,如果签名不再合法则返回django.core.signing.BadSignature。
  如果提供 default 参数,将不会引发异常并返回 default 的值。
  可选参数salt 可以用来对安全密钥强力攻击提供额外的保护。max_age 参数用于检查Cookie 对应的时间戳以确保Cookie 的时间不会超过max_age 秒。
        复制代码
        >>> request.get_signed_cookie('name')
        'Tony'
        >>> request.get_signed_cookie('name', salt='name-salt')
        'Tony' # 假设在设置cookie的时候使用的是相同的salt
        >>> request.get_signed_cookie('non-existing-cookie')
        ...
        KeyError: 'non-existing-cookie'    # 没有相应的键时触发异常
        >>> request.get_signed_cookie('non-existing-cookie', False)
        False
        >>> request.get_signed_cookie('cookie-that-was-tampered-with')
        ...
        BadSignature: ...   
        >>> request.get_signed_cookie('name', max_age=60)
        ...
        SignatureExpired: Signature age 1677.3839159 > 60 seconds
        >>> request.get_signed_cookie('name', False, max_age=60)
        False
        复制代码
        
4.HttpRequest.is_secure()
  如果请求时是安全的,则返回True;即请求通是过 HTTPS 发起的。
 
5.HttpRequest.is_ajax()
  如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串'XMLHttpRequest'。
  大部分现代的 JavaScript 库都会发送这个头部。如果你编写自己的 XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 可以工作。
  如果一个响应需要根据请求是否是通过AJAX 发起的,并且你正在使用某种形式的缓存例如Django 的 cache middleware,
   你应该使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 装饰你的视图以让响应能够正确地缓存。
注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
request.POST.getlist("hobby")
 
  4. response
  
   from django.shortcuts import render, HttpResponse, redirect
   1. HttpResponse    HttpResponse('字符串')  
   2. render(request,'html文件名',{})    —— 》 HTML代码
   3. redirect(跳转的地址)
   
   4.
       HttpResponse(json.dumps(ret))  # Content-Type: text/html; charset=utf-8
    JsonResponse(ret)      # Content-Type: application/json

---恢复内容结束---

django (装饰器,母版继承,自定义,request对象,response对象)的更多相关文章

  1. python装饰器、继承、元类、mixin,四种給类动态添加类属性和方法的方式(一)

    介绍装饰器.继承.元类.mixin,四种給类动态添加类属性和方法的方式 有时候需要給类添加额外的东西,有些东西很频繁,每个类都需要,如果不想反复的复制粘贴到每个类,可以动态添加. # coding=u ...

  2. 【转】Django中的request与response对象

    关于request与response 前面几个 Sections 介绍了关于 Django 请求(Request)处理的流程分析,我们也了解到,Django 是围绕着 Request 与 Respon ...

  3. python 视图 (FBV、CBV ) 、Request 和Response对象 、路由系统

    一.FBV和CBV1.基于函数的view,就叫FBV(Function Based View) 示例: def add_book(request): pub_obj=models.Publisher. ...

  4. java web(三):ServletContext、session、ServletConfig、request、response对象

    上一篇讲了Servlet: 1)什么是Servlet[servlet本身就是一种Java类,这种Java类提供了web形式的方法,只要实现了servlet接口的类,都是一种servlet资源.] 2) ...

  5. SpringMvc4中获取request、response对象的方法

    springMVC4中获取request和response对象有以下两种简单易用的方法: 1.在control层获取 在control层中获取HttpServletRequest和HttpServle ...

  6. request与response对象.

    request与response对象. 1. request代表请求对象 response代表的响应对象. 学习它们我们可以操作http请求与响应. 2.request,response体系结构. 在 ...

  7. request与response对象详述

    request与response对象. 1. request代表请求对象 response代表的响应对象. 学习它们我们可以操作http请求与响应. 2.request,response体系结构. 在 ...

  8. 在springMVC的controller中获取request,response对象的一个方法

    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttr ...

  9. Request和Response对象

    Request 和 Response 对象起到了服务器与客户机之间的信息传递作用.Request 对象用于接收客户端浏览器提交的数据,而 Response 对象的功能则是将服务器端的数据发送到客户端浏 ...

随机推荐

  1. [python]自问自答:python -m参数? (转) ( python2.7 版本 )

    原文地址: http://www.cnblogs.com/xueweihan/p/5118222.html python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当 ...

  2. Android中对文件的读写进行操作

    1. 在文件的地方生成一个read.txt文件,并且写入一个read数据.IO流用完之后一定要记得关闭. 对于try和catch是对于错误的抓取. 2. 首先先new file来找到那个文件,然后在通 ...

  3. CTF-练习平台-Misc之 Linux??????

    八.Linux?????? 下载文件,解压后只得到一个没有后缀名的文件,添加后缀名为txt,打开搜索,关键词为“flag”,没有找到:改关键词为“key”得到答案

  4. LeetCode-Microsoft-Populating Next Right Pointers in Each Node

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  5. All the Apache Streaming Projects: An Exploratory Guide

    The speed at which data is generated, consumed, processed, and analyzed is increasing at an unbeliev ...

  6. Oracle plsql乱码

    方法1.执行  set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK 方法2.执行--regedit--查找--NLS_LANG--设置值 SIMPLIFIED ...

  7. PHP 中的对象传递

    <?php class A { public $age = 0; public $username = ""; public $obj = null; } $a = new ...

  8. dslr control vis usb

    nikon https://sdk.nikonimaging.com/apply/compmail.do Digital-SLR cameras           We are offering L ...

  9. ORA-10997:another startup/shutdown operation of this instance in progress解决方法

    SQL> startup ORA-10997: another startup/shutdown operation of this instance inprogress ORA-09967: ...

  10. Django中更新多个对象数据与删除对象的方法

    更新多个对象 例如说我们现在想要将Apress Publisher的名称由原来的”Apress”更改为”Apress Publishing”.若使用save()方法,如: ? 1 2 3 >&g ...