一、昨日内容回顾

    

  1. 1. tags
  2. 1. for循环
  3. {% for name in name_list %}
  4. {{ name }}
  5. {% endfor %}
  6.  
  7. {% for name in name_list %}
  8. {{ name }}
  9. {% empty %}
  10. 空空如也
  11. {% endfor %}
  12.  
  13. forloop { }
  14. forloop.counter 当前循环的索引值 1开始
  15. forloop.counter0 当前循环的索引值 0开始
  16. forloop.revcounter 当前循环的索引值(倒序) 1结束
  17. forloop.revcounter0 当前循环的索引值(倒序) 0结束
  18. forloop.first 单前循环是否是第一次循环 布尔值
  19. forloop.last 单前循环是否是最后一次循环 布尔值
  20. forloop.parentloop 当前循环的外层循环
  21.  
  22. 上台阶,可以一次上1个台阶,可以上2个台阶,可以上3个台阶。问有n个台阶,有多少种走法?
  23. 2. if判断
  24. {% if 条件 %}
  25. 操作
  26. {% endif %}
  27.  
  28. {% if 条件 %}
  29. 操作
  30. {% else %}
  31. 其他操作
  32. {% endif %}
  33.  
  34. {% if 条件 %}
  35. 操作
  36. {% elif 条件 %}
  37. 不同操作
  38. {% else %}
  39. 其他操作
  40. {% endif %}
  41. 注意事项:
  42. 1. 不能连续判断 a > b > C and连接
  43. 2. 不支持算数运算 +-*/ filter
  44. 3. csrf_tokrn
  45. 使用:在form表单中使用
  46. 效果:添加了一个隐藏的input标签,标签名叫csrfmiddlewaretoken 值:随机字符串
  47. 作用:提交POST请求
  48. 4. 注释 {# 注释部分 #}
  49.  
  50. 2. 母板和继承
  51. 1.为什么要用母板和继承:
  52. 很多页面有重复或相似的代码,减少代码的重复和修改方便才用母板和继承
  53. 2.具体步骤:
  54. 1. 创建一个母板,'base.html' 将多个页面的重复代码提取出来
  55. 2. 在母板中定义多个block,来区分不同页面的不同内容
  56. 3. 在子页面中继承母板 {% extends 'base.html' %}
  57. 4. block中写自己页面独特的内容
  58.  
  59. 3. 注意事项
  60. 1. {% extends 'base.html' %} 写在第一个行
  61. 2. {% extends 'base.html' %} base.html加上引号 不然当做是变量
  62. 3. 通常定义多个block,还有一个page-css page-js
  63. 3. 组件
  64. 将一小部分的HTML代码写在一个模板中。———》 组件
  65. 在其他的页面中 {% include 'nav.html' %}
  66.  
  67. 4. 静态文件的内容
  68. {% load static %}
  69. "{% static 'css/mycss.css' %}" ——》 /static/css/mycss.css
  70.  
  71. {% get_static_prefix %} —— /static/
  72.  
  73. "{% get_static_prefix %}css/mycss.css"
  74.  
  75. 5. 自定义simple_tag inclusion_tag

tag\母版和继承\组件\静态文件的内容

inclusion_tag

二、今日内容总结

  1.视图系统

0. CBV(calss base view ) 和 FBV(funcation base view )

定义CBV
from django.views import View

class AddPublisher(View):

def dispatch(self, request, *args, **kwargs):
  print('处理请求之前')
  ret = super().dispatch(request, *args, **kwargs)
  print('处理请求之后')
  return ret

def get(self, request):
  pass

def post(self, request):
  pass

使用:

  url(r'^add_publisher/', views.AddPublisher.as_view()),

简版的流程:
AddPublisher.as_view() ——》 view 函数
当请求来的时候才执行view
view中执行:
1. 先实例化AddPublisher,给self
2. 执行self.dispatch()
self 有dispatch 就执行自己的
没有就是执行 父类(View)的dispatch方法
3. dispatch中执行:
先通过反射获取到AddPublisher中定义get或者post方法。
执行get或者post方法 返回httpresponse对象
4. view接收到dispatch的返回值——httpresponse对象
5. view返回httpresponse对象

1.给视图函数和类视图加装饰器

  1) 给视图函数加装饰器

    

            2)给类视图加装饰器

              导入单独 django.utils.decorators import method_decorator

               方法一:

                

               方法二:相当于给get 、post等方法都加了

                

                方法三:给类加但要指定作用函数的名字

      

2. request:
request.method 请求方式 GTE POST
request.GET ——》 字典 URL上传的参数
request.POST ——》 字典 form表单传的参数

request.path_info __》 路径信息 端口号之后 ?之前

request.get_full_path --> path_info 加?之后

request.body ___》 请求体,byte类型 request.POST的数据就是从body里面提取到的

request.FILES['uploadfile'].name  -->获取上传文件

request.POST.getlist('hobby_list')  -->键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:

新的:

请求相关方法

  1. 属性:
  2.   django将请求报文中的请求行、头部信息、内容主体封装成 HttpRequest 类中的属性。
  3. 除了特殊说明的之外,其他均为只读的。
  4.  
  5. 0.HttpRequest.scheme
  6. 表示请求方案的字符串(通常为httphttps
  7.  
  8. 1.HttpRequest.body
  9.  
  10.   一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
  11.  
  12.   但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST
  13.  
  14.   另外,我们还可以用 python 的类文件方法去操作它,详情参考 HttpRequest.read()
  15.  
  16. 2.HttpRequest.path
  17.  
  18.   一个字符串,表示请求的路径组件(不含域名)。
  19.  
  20.   例如:"/music/bands/the_beatles/"
  21.  
  22. 3.HttpRequest.method
  23.  
  24.   一个字符串,表示请求使用的HTTP 方法。必须使用大写。
  25.  
  26.   例如:"GET""POST"
  27.  
  28. 4.HttpRequest.encoding
  29.  
  30.   一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。
  31. 这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。
  32. 接下来对属性的任何访问(例如从 GET POST 中读取数据)将使用新的 encoding 值。
  33. 如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。
  34.  
  35. 5.HttpRequest.GET
  36.  
  37.   一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。
  38.  
  39. 6.HttpRequest.POST
  40.  
  41.   一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
  42.  
  43.   POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。
  44. 因此,不应该使用 if request.POST 来检查使用的是否是POST 方法;应该使用 if request.method == "POST"
  45.  
  46.   另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。
  47.  
  48. 7.HttpRequest.COOKIES
  49.  
  50.   一个标准的Python 字典,包含所有的cookie。键和值都为字符串。
  51.  
  52. 8.HttpRequest.FILES
  53.  
  54.   一个类似于字典的对象,包含所有的上传文件信息。
  55. FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。
  56.  
  57.   注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会
  58. 包含数据。否则,FILES 将为一个空的类似于字典的对象。
  59.  
  60. 9.HttpRequest.META
  61.  
  62.   一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:
  63.  
  64. CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
  65. CONTENT_TYPE —— 请求的正文的MIME 类型。
  66. HTTP_ACCEPT —— 响应可接收的Content-Type
  67. HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
  68. HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
  69. HTTP_HOST —— 客服端发送的HTTP Host 头部。
  70. HTTP_REFERER —— Referring 页面。
  71. HTTP_USER_AGENT —— 客户端的user-agent 字符串。
  72. QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
  73. REMOTE_ADDR —— 客户端的IP 地址。
  74. REMOTE_HOST —— 客户端的主机名。
  75. REMOTE_USER —— 服务器认证后的用户。
  76. REQUEST_METHOD —— 一个字符串,例如"GET" "POST"
  77. SERVER_NAME —— 服务器的主机名。
  78. SERVER_PORT —— 服务器的端口(是一个字符串)。
  79.   从上面可以看到,除 CONTENT_LENGTH CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时,
  80. 都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_ 前缀。
  81. 所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。
  82.  
  83. 10.HttpRequest.user
  84.  
  85.   一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。
  86.  
  87.   如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。
  88.  
  89. 例如:
  90.  
  91. if request.user.is_authenticated():
  92. # Do something for logged-in users.
  93. else:
  94. # Do something for anonymous users.
  95.  
  96.   user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。
  97.  
  98. -------------------------------------------------------------------------------------
  99.  
  100. 匿名用户
  101. class models.AnonymousUser
  102.  
  103. django.contrib.auth.models.AnonymousUser 类实现了django.contrib.auth.models.User 接口,但具有下面几个不同点:
  104.  
  105. id 永远为None
  106. username 永远为空字符串。
  107. get_username() 永远返回空字符串。
  108. is_staff is_superuser 永远为False
  109. is_active 永远为 False
  110. groups user_permissions 永远为空。
  111. is_anonymous() 返回True 而不是False
  112. is_authenticated() 返回False 而不是True
  113. set_password()、check_password()、save() delete() 引发 NotImplementedError
  114. New in Django 1.8:
  115. 新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User
  116.  
  117. 11.HttpRequest.session
  118.  
  119.   一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。
  120. 完整的细节参见会话的文档。
  121.  
  122. request属性相关
  123.  
  124. -------------------------------------------------------------------------1.HttpRequest.get_host()
  125.  
  126.   根据从HTTP_X_FORWARDED_HOST(如果打开 USE_X_FORWARDED_HOST,默认为False)和 HTTP_HOST 头部信息返回请求的原始主机。
  127. 如果这两个头部没有提供相应的值,则使用SERVER_NAME SERVER_PORT,在PEP 3333 中有详细描述。
  128.  
  129.   USE_X_FORWARDED_HOST:一个布尔值,用于指定是否优先使用 X-Forwarded-Host 首部,仅在代理设置了该首部的情况下,才可以被使用。
  130.  
  131.   例如:"127.0.0.1:8000"
  132.  
  133.   注意:当主机位于多个代理后面时,get_host() 方法将会失败。除非使用中间件重写代理的首部。
  134.  
  135. 2.HttpRequest.get_full_path()
  136.  
  137.   返回 path,如果可以将加上查询字符串。
  138.  
  139.   例如:"/music/bands/the_beatles/?print=true"
  140.  
  141. 3.HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
  142.  
  143.   返回签名过的Cookie 对应的值,如果签名不再合法则返回django.core.signing.BadSignature
  144.  
  145.   如果提供 default 参数,将不会引发异常并返回 default 的值。
  146.  
  147.   可选参数salt 可以用来对安全密钥强力攻击提供额外的保护。max_age 参数用于检查Cookie 对应的时间戳以确保Cookie 的时间不会超过max_age 秒。
  148.  
  149. 复制代码
  150. >>> request.get_signed_cookie('name')
  151. 'Tony'
  152. >>> request.get_signed_cookie('name', salt='name-salt')
  153. 'Tony' # 假设在设置cookie的时候使用的是相同的salt
  154. >>> request.get_signed_cookie('non-existing-cookie')
  155. ...
  156. KeyError: 'non-existing-cookie' # 没有相应的键时触发异常
  157. >>> request.get_signed_cookie('non-existing-cookie', False)
  158. False
  159. >>> request.get_signed_cookie('cookie-that-was-tampered-with')
  160. ...
  161. BadSignature: ...
  162. >>> request.get_signed_cookie('name', max_age=60)
  163. ...
  164. SignatureExpired: Signature age 1677.3839159 > 60 seconds
  165. >>> request.get_signed_cookie('name', False, max_age=60)
  166. False
  167. 复制代码
  168.  
  169. 4.HttpRequest.is_secure()
  170.  
  171.   如果请求时是安全的,则返回True;即请求通是过 HTTPS 发起的。
  172.  
  173. 5.HttpRequest.is_ajax()
  174.  
  175.   如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串'XMLHttpRequest'
  176.  
  177.   大部分现代的 JavaScript 库都会发送这个头部。如果你编写自己的 XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 可以工作。
  178.  
  179.   如果一个响应需要根据请求是否是通过AJAX 发起的,并且你正在使用某种形式的缓存例如Django cache middleware
  180. 你应该使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 装饰你的视图以让响应能够正确地缓存。

3   response
   1). HttpResponse 类 字符串
   2). render 返回一个HTML页面
   3). redirect 跳转 重定向 Location:/index/

    a.传递一个具体的ORM对象,实际上调用对象的get_absolute_url()

    b.传递一个视图的名称

    c.传递要重定向到的一个具体的网址

    d.也可以是一个完整的网址

   HttpResponse的使用:

  1) 传递字符串

    

  1.             from django.http import HttpResponse
  2.             response = HttpResponse('text only!',content-type='text/plain'

  

  2) 设置或者删除响应头信息              response = HttpResponse()              response['Content-Type'] = 'text/html; charset=UTF-8'              del response['Content-Type']

  1.         3) 属性
                  HttpResponse.content:响应内容
                  HttpResponse.charset:响应内容的编码
                  HttpResponse.status_code:响应的状态码               
  2.          4. JsonResponse 对象  
                
              我们自己通过json.dumps编码后用HttpResponse传过去,使用的Content-Type:‘text/html
              而用JsonResponse传过去,使用的Content-Type:'application/json'
  1. from django.http import JsonResponse
  2.  
  3. response = JsonResponse({'foo': 'bar'})
  4. print(response.content)
  5.  
  6. b'{"foo": "bar"}'
  7. 默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数。
  8.  
  9. response = JsonResponse([1, 2, 3], safe=False)

JsonResponse对象

         5. 文件上传

          

  1. from django.views import View
  2. class Upload(View):
  3. def get(self,request):
  4. return render(request,'test.html')
  5.  
  6. def post(self,request):
  7. filename = request.FILES['uploadfile'].name
  8. upload_obj = request.FILES['uploadfile']
  9. with open(filename,mode='wb') as f:
  10. for chunk in upload_obj.chunks():
  11. f.write(chunk)
  12. return HttpResponse('ok')

类视图

  1. <form action="" method="post" enctype="multipart/form-data">
  2. <input type="file" name="uploadfile">
  3. <button>提交</button>
  4. </form>

HTML上传文件

        

  2.路由系统

    1) URLconf配置

    2)正则表达式详解

      (1) 注意事项    

      1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
      2. 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
      3. 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
      4. 每个正则表达式前面的'r' 是可选的但是建议加上。

       (2) 补充说明

         # 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项

         APPEND_SLASH = True

    3)分组命名匹配

      无名分组:元组

      有名分组:字典

      分组捕获的参数永远都是字符串

      视图函数中指定默认值

      include其他的URLconfs

    4)传递额外的参数给视图函数

      如果传递的参数和有名分组同名,则会覆盖有名分组的值

  1. from django.conf.urls import url
  2. from . import views
  3.  
  4. urlpatterns = [
  5. url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
  6. ]

    

    5) URL命名和URL反向解析

  1. URL命名和URL反向解析
  2. url起别名 name= 'book'
  3. 1. 无名分组
  4. url('^book/([0-9]{4})/([0-9]{2})', views.book, name='book')
  5.  
  6. 视图的用法:
  7. from django.shortcuts import reverse
  8. print(reverse('book',args=('1999','08')))
  9. # /book/1999/08
  10. 模板的用法:
  11.  
  12. {% url 'book' '1998' '08' %}
  13. # /book/1998/08
  14. 2. 有名分组
  15.  
  16. url('^book/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.book, name='book')
  17.  
  18. 视图的用法:
  19. from django.shortcuts import reverse
  20. print(reverse('book',kwargs={'year':'1999','month':'09'}))
  21. # /book/1999/08
  22. 模板的用法:
  23. 方法一: 按位置传参
  24. {% url 'book' '1998' '08' %}
  25. # /book/1998/08
  26.  
  27. 方法二:
  28. {% url 'book' year='1998' month='08' %}
  29. {% url 'book' month='08' year='1998' %}

URL命名和URL反向解析

    6)命名空间模式

      即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL。

      应用文件夹下的urls中设置(urlpatterns)

       app_name = '应用名'

      也可以做直接写在url(r'book/',views.book,namespace='app01',name='book')

      视图函数中用:

      reverse('app01:book',args=(参数1,参数2))

      reverse('app01:book',kwargs={‘year’:2018,'month':08})

      模板中用:{%  url('app01:book')  2018 09 %}

           {%  url('app01:book')  year= 2018  month= 09 %}

三、预习和扩展

python全栈开发day66-视图系统、路由系统的更多相关文章

  1. python 全栈开发,Day81(博客系统个人主页,文章详情页)

    一.个人主页 随笔分类 需求:查询当前站点每一个分类的名称以及对应的文章数 完成这个需求,就可以展示左侧的分类 它需要利用分组查询,那么必须要会基于双下划线的查询. 基于双下划线的查询,简单来讲,就是 ...

  2. python 全栈开发,Day83(博客系统子评论,后台管理,富文本编辑器kindeditor,bs4模块)

    一.子评论 必须点击回复,才是子评论!否则是根评论点击回复之后,定位到输入框,同时加入@评论者的用户名 定位输入框 focus focus:获取对象焦点触发事件 先做样式.点击回复之后,定位到输入框, ...

  3. python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  4. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  5. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  6. Python全栈开发【基础一】

    Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...

  7. python 全栈开发之路 day1

    python 全栈开发之路 day1   本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...

  8. 自学Python全栈开发第一次笔记

           我已经跟着视频自学好几天Python全栈开发了,今天决定听老师的,开始写blog,听说大神都回来写blog来记录自己的成长. 我特别认真的跟着这个视频来学习,(他们开课前的保证书,我也写 ...

  9. Win10构建Python全栈开发环境With WSL

    目录 Win10构建Python全栈开发环境With WSL 启动WSL 总结 对<Dev on Windows with WSL>的补充 Win10构建Python全栈开发环境With ...

  10. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

随机推荐

  1. how to get address of member function

    see:http://www.cplusplus.com/forum/general/136410/ & http://stackoverflow.com/questions/8121320/ ...

  2. 浅谈深度优先和广度优先(scrapy-redis)

    首先先谈谈深度优先和广度优先的定义 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的 ...

  3. Json 文件中value的基本类型

    在Json中,value的类型只能是以下几种: 1.字符串 2.数字 3.true 或者 false (注意,和字符串不同,没有双引号包裹) 4.null

  4. Go语言从入门到放弃(一) 变量/常量/函数

    HelloWorld 我们先看看一个最简单的HelloWorld代码 package main import "fmt" func main() { fmt.Println(&qu ...

  5. C#一元二次方程

  6. nginx+ssl 服务器 双向认证

    项目后台服务器采用nginx+tomcat 负载均衡架构  不久 访问协议有http升级为https 对服务器认证采用沃通的ssl证书 nginx ssl证书安装 参照沃通官方文档 他们有技术支持沟通 ...

  7. Confluence 6 重构查找索引

    查找索引是自动维护的,但是你有时候可能会因为你在查找的时候或查看者邮件主题出现了异常,或者你的 Confluence 实例升级到了新的版本,你可能需要手动重构索引. 进行搜索索引重构: 在屏幕的右上角 ...

  8. Best Cow Line(POJ3617)

    Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year&quo ...

  9. 获取表单内的所有元素的值 表单格式化插件jquery.serializeJSON

    简单描述:一个form表单里有十几个input或者select,要获取到他们的值,我的做法一直都是$("#id").val();这样做本来没什么说的,但是如果有很多呢,就很麻烦,看 ...

  10. poj2728 生成树01分数规划 (二分答案)

    给定整数序列a,b,求出下式的最大值 sum{ai*xi}/sum{bi*xi},xi=0|1 通俗来说,就是选出一些整数对(ai,bi),使得选出的a之和与选出的b之和商最大化 二分答案L,即选出的 ...