Django框架的使用教程--类视图-中间间-模板[六]
类视图
类视图的使用
视图函数
- class class_view(View):
- """类视图"""
- def get(self, request):
- return render(request, 'index.html')
- def post(self, request):
- return render(request, 'show.html')
路由
- url(r'^class_view/$', views.class_view.as_view()),
结果
类视图的源码
- @classonlymethod
- def as_view(cls, **initkwargs):
- """
- Main entry point for a request-response process.
- """
- for key in initkwargs:
- if key in cls.http_method_names:
- raise TypeError("You tried to pass in the %s method name as a "
- "keyword argument to %s(). Don't do that."
- % (key, cls.__name__))
- if not hasattr(cls, key):
- raise TypeError("%s() received an invalid keyword %r. as_view "
- "only accepts arguments that are already "
- "attributes of the class." % (cls.__name__, key))
- # 类视图的函数
- def view(request, *args, **kwargs):
- self = cls(**initkwargs)
- if hasattr(self, 'get') and not hasattr(self, 'head'):
- self.head = self.get
- self.request = request
- self.args = args
- self.kwargs = kwargs
- return self.dispatch(request, *args, **kwargs)
- view.view_class = cls
- view.view_initkwargs = initkwargs
- # take name and docstring from class
- update_wrapper(view, cls, updated=())
- # and possible attributes set by decorators
- # like csrf_exempt from dispatch
- update_wrapper(view, cls.dispatch, assigned=())
- return view
- # 根据不同的请求函数返回不同的值
- def dispatch(self, request, *args, **kwargs):
- # Try to dispatch to the right method; if a method doesn't exist,
- # defer to the error handler. Also defer to the error handler if the
- # request method isn't on the approved list.
- if request.method.lower() in self.http_method_names:
- handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
- else:
- handler = self.http_method_not_allowed
- return handler(request, *args, **kwargs)
- # http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
类视图使用装饰器
方法一:使用装饰器定义类视图(不推荐使用,只能整个类添加装饰器,不能单独方法添加)
代码
- def my_decorator(func):
- def without(request, *args, **kwargs):
- print('装饰器被调用')
- print('路径%s' % request.path)
- return func(request, *args, **kwargs)
- return without
- class decorator_view(View):
- def get(self, request):
- print('这是get方法')
- return HttpResponse('ok')
- def post(self, request):
- print('这是post方法')
- return HttpResponse('ok')
路由
- # 直接在URL中使用装饰器
from .views import decorator_view
url(r'^decorator_view/$', views.my_decorator(decorator_view.as_view())),
结果
方法二:使用装饰器定义类视图(可以指定的请求方式)
代码(以下的视图函数名字可以自己定义过)
- # 可以指定装饰器的特定请求,如name='get'
- @method_decorator(my_decorator, name='dispatch')
- class decorator_view(View):
- def get(self, request):
- print('这是get方法')
- return HttpResponse('ok')
- def post(self, request):
- print('这是post方法')
- return HttpResponse('ok')
路由
- # 直接在URL中使用装饰器
- from .views import decorator_view
- url(r'^decorator_view/$', views.my_decorator(decorator_view.as_view())),
运行结果
方法三:使用装饰器定义类视图(定义方法的类装饰器)
代码
- class decorator_view(View):
- # 给get添加装饰器
- @method_decorator(my_decorator)
- def get(self, request):
- print('这是get方法')
- return HttpResponse('ok')
- # 给post添加装饰器
- @method_decorator(my_decorator)
- def post(self, request):
- print('这是post方法')
- return HttpResponse('ok')
路由
- # 直接在URL中使用装饰器
- from .views import decorator_view
- url(r'^decorator_view/$', views.my_decorator(decorator_view.as_view())),
运行(postman测试)
中间件
在子应用工程目录中新建一个middleware.py文件
middleware.py(在调试模式下,中间件被调用两次)
- def my_middleware(get_response):
- print('__init__初始化')
- def in_middleware(request):
- print('请求之前被调用')
- response = get_response(request)
- print('请求之后被调用')
- return response
- return in_middleware
视图函数
- def index_view(request):
- print('view视图被调用')
- return HttpResponse('ok')
运行
注册中间件
多个中间件的使用
1)在视图函数执行之前,中间件由上至下执行
2)在视图函数请求至后,中间间由下到上
注册中间间
定义两个中间件
- def my_middleware(get_response):
- print('__init__初始化')
- def in_middleware(request):
- print('请求之前被调用')
- response = get_response(request)
- print('请求之后被调用')
- return response
- return in_middleware
- def my_middleware1(get_response):
- print('__init2__初始化')
- def in_middleware(request):
- print('请求2之间被调用')
- response = get_response(request)
- print('请求2之后被调用')
- return response
- return in_middleware
运行结果
模板的使用
根目录创建一个静态文件static_files
修改静态文件的参数
访问
模板的配置
模板的继承
{% extends "父模板路径"%}
代码块
{% block 名称 %}
预留区域,可以编写默认内容,也可以没有默认内容
{% endblock 名称 %}
注释
{#...#}
多行注释
{% comment %}
...
{% endcomment %}
Django框架的使用教程--类视图-中间间-模板[六]的更多相关文章
- Django内置的通用类视图
1.ListView 表示对象列表的一个页面. 执行这个视图的时候,self.object_list将包含视图正在操作的对象列表(通常是一个查询集,但不是必须). 属性: model: 指定模型 te ...
- 六、Django之表单和类视图-Part 4
一.表单form 为了接收用户的投票选择,我们需要在前端页面显示一个投票界面.让我们重写先前的polls/detail.html文件,代码如下: <h1>{{ question.quest ...
- Django:(05)类视图,装饰器和中间件
一.类视图的定义和使用 在Django中还可以通过类来定义一个视图,称为类视图. 定义一个类视图:定义一个类,需继承 Django 提供的 View 类 . from django.views.gen ...
- Django框架的使用教程--视图和路由[二]
视图和路由 1.创建一个django_test应用 2.setting中设置django_test INSTALLED_APPS = [ 'django.contrib.admin', 'django ...
- Django框架的使用教程--路由-请求-响应[四]
路由 路由可以定义在工程的目录下(看你的需求),也可以定义在各个应用中来保存应用的路由,用主路文件urls中使用include()包含各个应用的子路由的数据 路由的解析顺序 Django接收到请求后, ...
- Django框架的使用教程--站点的管理[七]
Django的站点管理 创建超级管理员命令(密码要8位) python manage.py createsuperuser 进入站点管理 注册模型类 from django.contrib impor ...
- Django框架的使用教程--Cookie-Session[五]
Cookie cookie是存储在浏览器中的一段文本信息,下次同一网站请求,就会发送该cookie给服务器,一般的浏览器都有启动cookie,用cookie存储信息,最好不要存储密码,cookie也有 ...
- Django框架的使用教程--mysql数据库[三]
Django的数据库 1.在Django_test下的view.py里面model定义模型 from django.db import models # Create your models here ...
- Django框架的使用教程--环境的搭建和项目的创建[一]
Django环境的搭建 Django 常用的命令 # 创建一个名为Django_test子应用 python manage.py startapp Django_test # 生成迁移文件 pytho ...
随机推荐
- 全网最详细的IDEA、Eclipse和MyEclipse之间于Java web项目发布到Tomcat上运行成功的对比事宜【博主强烈推荐】【适合普通的还是Maven方式创建的】(图文详解)
不多说,直接上干货! IDEA [适合公司业务]全网最详细的IDEA里如何正确新建[普通或者Maven]的Java web项目并发布到Tomcat上运行成功[博主强烈推荐](类似eclipse里同一个 ...
- cropper实现图片剪切上传
一.引入文件 <script src="jquery.min.js"></script> <link rel="stylesheet&quo ...
- 记录一个简单的dbcp数据连接池
这个示例用到了ThreadLocal与dbcp,我觉得有点意思,就整理了下.使用dbcp,肯定要导入commons-dbcp.jar包.下面直接贴DBUtil代码: public class DBUt ...
- [TJOI 2018]智力竞赛
Description 题库链接 给出一张 \(m\) 个点的有向图.问可重最小路径覆盖是否 \(\leq n+1\) .若不,求最多用 \(n+1\) 条路径去覆盖,最大化未覆盖点点权最小值. \( ...
- [CF833B] The Bakery
Description 将一个长度为n的序列分为k段 使得总价值最大一段区间的价值表示为区间内不同数字的个数 \(n\leq 35000,k\leq 50,1\leq a_i\leq n\) Solu ...
- C#微信公众号开发--微信事件交互
前言 一切准备工作就绪时就先实现一个关注公众号后向客户端推送一条消息.关注后推送消息需要一个get请求.一个post请求,get请求主要是为了向微信服务器验证,post请求主要就是处理微信消息了. 调 ...
- Hyperledger Fabric密码模块系列之BCCSP(四)
前面说过要找时间介绍一下bccsp包下面的工厂factory,so here it is. 通过factory目前可以获得两类BCCSP实例,一个是上文说的sw,还有一个是通过pkcs11实现的. B ...
- Numbers、Strings、Lists 笔记<一>
下一篇:流程控制<二> 阅读链接:官方Python3.7教程 废话:最近开始阅读python3.7文档,希望把容易混淆的知识记下来. 除法总是返回一个浮点数 >>> 8/ ...
- 【Java并发编程】18、PriorityBlockingQueue源码分析
PriorityBlockingQueue是一个基于数组实现的线程安全的无界队列,原理和内部结构跟PriorityQueue基本一样,只是多了个线程安全.javadoc里面提到一句,1:理论上是无界的 ...
- Ansible安装 入门教程
learn一门新技术咯: ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置 ...