类视图

类视图的使用

视图函数

  1. class class_view(View):
  2. """类视图"""
  3.  
  4. def get(self, request):
  5. return render(request, 'index.html')
  6.  
  7. def post(self, request):
  8. return render(request, 'show.html')

路由

  1. url(r'^class_view/$', views.class_view.as_view()),

结果

类视图的源码

  1. @classonlymethod
  2. def as_view(cls, **initkwargs):
  3. """
  4. Main entry point for a request-response process.
  5. """
  6. for key in initkwargs:
  7. if key in cls.http_method_names:
  8. raise TypeError("You tried to pass in the %s method name as a "
  9. "keyword argument to %s(). Don't do that."
  10. % (key, cls.__name__))
  11. if not hasattr(cls, key):
  12. raise TypeError("%s() received an invalid keyword %r. as_view "
  13. "only accepts arguments that are already "
  14. "attributes of the class." % (cls.__name__, key))
  15.      # 类视图的函数
  16. def view(request, *args, **kwargs):
  17. self = cls(**initkwargs)
  18. if hasattr(self, 'get') and not hasattr(self, 'head'):
  19. self.head = self.get
  20. self.request = request
  21. self.args = args
  22. self.kwargs = kwargs
  23. return self.dispatch(request, *args, **kwargs)
  24. view.view_class = cls
  25. view.view_initkwargs = initkwargs
  26.  
  27. # take name and docstring from class
  28. update_wrapper(view, cls, updated=())
  29.  
  30. # and possible attributes set by decorators
  31. # like csrf_exempt from dispatch
  32. update_wrapper(view, cls.dispatch, assigned=())
  33. return view
  34.     # 根据不同的请求函数返回不同的值
  35. def dispatch(self, request, *args, **kwargs):
  36. # Try to dispatch to the right method; if a method doesn't exist,
  37. # defer to the error handler. Also defer to the error handler if the
  38. # request method isn't on the approved list.
  39. if request.method.lower() in self.http_method_names:
  40. handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
  41. else:
  42. handler = self.http_method_not_allowed
  43. return handler(request, *args, **kwargs)
  44.  
  45. # http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

类视图使用装饰器

方法一:使用装饰器定义类视图(不推荐使用,只能整个类添加装饰器,不能单独方法添加)

代码

  1. def my_decorator(func):
  2. def without(request, *args, **kwargs):
  3. print('装饰器被调用')
  4. print('路径%s' % request.path)
  5. return func(request, *args, **kwargs)
  6.  
  7. return without
  8.  
  9. class decorator_view(View):
  10. def get(self, request):
  11. print('这是get方法')
  12. return HttpResponse('ok')
  13.  
  14. def post(self, request):
  15. print('这是post方法')
  16. return HttpResponse('ok')

路由

  1. # 直接在URL中使用装饰器
    from .views import decorator_view
    url(r'^decorator_view/$', views.my_decorator(decorator_view.as_view())),

结果

方法二:使用装饰器定义类视图(可以指定的请求方式)

代码(以下的视图函数名字可以自己定义过)

  1. # 可以指定装饰器的特定请求,如name='get'
  2. @method_decorator(my_decorator, name='dispatch')
  3. class decorator_view(View):
  4. def get(self, request):
  5. print('这是get方法')
  6. return HttpResponse('ok')
  7.  
  8. def post(self, request):
  9. print('这是post方法')
  10. return HttpResponse('ok')

路由

  1. # 直接在URL中使用装饰器
  2. from .views import decorator_view
  3. url(r'^decorator_view/$', views.my_decorator(decorator_view.as_view())),

运行结果

方法三:使用装饰器定义类视图(定义方法的类装饰器)

代码

  1. class decorator_view(View):
  2. # 给get添加装饰器
  3. @method_decorator(my_decorator)
  4. def get(self, request):
  5. print('这是get方法')
  6. return HttpResponse('ok')
  7.  
  8. # 给post添加装饰器
  9. @method_decorator(my_decorator)
  10. def post(self, request):
  11. print('这是post方法')
  12. return HttpResponse('ok')

路由

  1. # 直接在URL中使用装饰器
  2. from .views import decorator_view
  3. url(r'^decorator_view/$', views.my_decorator(decorator_view.as_view())),

运行(postman测试)

中间件

在子应用工程目录中新建一个middleware.py文件

middleware.py(在调试模式下,中间件被调用两次)

  1. def my_middleware(get_response):
  2. print('__init__初始化')
  3.  
  4. def in_middleware(request):
  5. print('请求之前被调用')
  6. response = get_response(request)
  7. print('请求之后被调用')
  8. return response
  9.  
  10. return in_middleware

视图函数

  1. def index_view(request):
  2. print('view视图被调用')
  3. return HttpResponse('ok')

运行

注册中间件

多个中间件的使用

1)在视图函数执行之前,中间件由上至下执行

2)在视图函数请求至后,中间间由下到上

注册中间间

定义两个中间件

  1. def my_middleware(get_response):
  2. print('__init__初始化')
  3.  
  4. def in_middleware(request):
  5. print('请求之前被调用')
  6. response = get_response(request)
  7. print('请求之后被调用')
  8. return response
  9.  
  10. return in_middleware
  11.  
  12. def my_middleware1(get_response):
  13. print('__init2__初始化')
  14.  
  15. def in_middleware(request):
  16. print('请求2之间被调用')
  17. response = get_response(request)
  18. print('请求2之后被调用')
  19. return response
  20. return in_middleware

运行结果

模板的使用

根目录创建一个静态文件static_files

修改静态文件的参数

访问

模板的配置

模板的继承

{% extends "父模板路径"%}

代码块

{% block 名称 %}

预留区域,可以编写默认内容,也可以没有默认内容

{% endblock 名称 %}

注释

{#...#}

多行注释

{% comment %}

...

{% endcomment %}

Django框架的使用教程--类视图-中间间-模板[六]的更多相关文章

  1. Django内置的通用类视图

    1.ListView 表示对象列表的一个页面. 执行这个视图的时候,self.object_list将包含视图正在操作的对象列表(通常是一个查询集,但不是必须). 属性: model: 指定模型 te ...

  2. 六、Django之表单和类视图-Part 4

    一.表单form 为了接收用户的投票选择,我们需要在前端页面显示一个投票界面.让我们重写先前的polls/detail.html文件,代码如下: <h1>{{ question.quest ...

  3. Django:(05)类视图,装饰器和中间件

    一.类视图的定义和使用 在Django中还可以通过类来定义一个视图,称为类视图. 定义一个类视图:定义一个类,需继承 Django 提供的 View 类 . from django.views.gen ...

  4. Django框架的使用教程--视图和路由[二]

    视图和路由 1.创建一个django_test应用 2.setting中设置django_test INSTALLED_APPS = [ 'django.contrib.admin', 'django ...

  5. Django框架的使用教程--路由-请求-响应[四]

    路由 路由可以定义在工程的目录下(看你的需求),也可以定义在各个应用中来保存应用的路由,用主路文件urls中使用include()包含各个应用的子路由的数据 路由的解析顺序 Django接收到请求后, ...

  6. Django框架的使用教程--站点的管理[七]

    Django的站点管理 创建超级管理员命令(密码要8位) python manage.py createsuperuser 进入站点管理 注册模型类 from django.contrib impor ...

  7. Django框架的使用教程--Cookie-Session[五]

    Cookie cookie是存储在浏览器中的一段文本信息,下次同一网站请求,就会发送该cookie给服务器,一般的浏览器都有启动cookie,用cookie存储信息,最好不要存储密码,cookie也有 ...

  8. Django框架的使用教程--mysql数据库[三]

    Django的数据库 1.在Django_test下的view.py里面model定义模型 from django.db import models # Create your models here ...

  9. Django框架的使用教程--环境的搭建和项目的创建[一]

    Django环境的搭建 Django 常用的命令 # 创建一个名为Django_test子应用 python manage.py startapp Django_test # 生成迁移文件 pytho ...

随机推荐

  1. An Exploration of ARM TrustZone Technology

    墙外通道:https://genode.org/documentation/articles/trustzone ARM TrustZone technology has been around fo ...

  2. Kafka文件存储机制那些事

    Kafka是什么 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx ...

  3. mybatis教程之原理剖析

    MyBatis是目前非常流行的ORM框架,功能很强大,然而其实现却比较简单.优雅.本文通过代理的方式来看下其实现 方式一:传统API方式 @Test public void add() throws ...

  4. WebFrom 小程序【分页功能 】

    实现分页展示功能 基本功能:上一页.下一页.首页.尾页.跳转 两个重要的变量 1.每页显示几条数据  2.现在是第几页    方法 } /*表格样式*/ .tab { width: %; backgr ...

  5. 【Java并发编程】14、Thread,线程说明

    线程的状态:New.Runnable.Blocked.Waiting.Timed waiting.Terminated 1. RUNNABLE,对应"就绪"和"运行&qu ...

  6. Hadoop HDFS 设计随想

    目录 引言 HDFS 数据块的设计 数据块应该设置成多大? 抽象成数据块有哪些好处? 操作块信息的命令 HDFS 中节点的设计 有几种节点类型? 用户如何访问 HDFS? 如何对 namenode 容 ...

  7. Best way to learn android and java?

    Question: I have been getting my feet wet with android sdk, eclipse, and other various beginner step ...

  8. Starting zookeeper ... already running as process 1805错误

    启动zookeeper的时候,报Starting zookeeper ... already running as process 1805错误 上面这个错误意思为以作为进程1805运行.系统检测到你 ...

  9. JAVA的高并发基础认知 二

    一.JAVA高级并发 1.5JDK之后引入高级并发特性,大多数的特性在java.util.concurrent 包中,是专门用于多线程发编程的,充分利用了现代多处理器和多核心系统的功能以编写大规模并发 ...

  10. 初学HTML-7

    表单中的一些标签 label标签:让文字和输入框进行绑定,即,点击文字,输入框可以开始输入(默认文字和输入框没有关系,不会聚焦) 格式:<form action=""> ...