django中介模型,CBV模型,及logging日志配制
1.中介模型
中介模型,这个是在我们创建表格时,多对多添加的时候应用到的,通过制定ManyToManyField字段中的through参数来定义,为两者的关系新建一个中介class
为什么会产生这个中介模型呢?主要还是和业务需求有关系:
我们都知道,建立多对多关系后,django会自动帮我们生成第三张表,对于这张表只包含相关的id。但是由于业务需要,我们现在需要在第三张表添加其它字段,这时候就需要自己去创建第三张表
1.1用法实例
常规多对多创建表模型:
class Author(models.Model):
name = models.CharField(max_length=32) class Book(models.Model):
title = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author')
效果:
中介模型:
class Author(models.Model):
name = models.CharField(max_length=32) class Book(models.Model):
title = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author', through='Book2Author') class Book2Author(models.Model):
book_id = models.ForeignKey(to='Book',on_delete=models.CASCADE)
author_id = models.ForeignKey(to='Author',on_delete=models.CASCADE)
place = models.CharField(max_length=32)
class Meta:
unique_together = [("book_id", "author_id")]
效果:
# 注意:中介模型没有add,areate,remove方法,但是clear() 方法却是可用的。它可以清空某个实例所有的多对多关系
2.CBV模式说明
相应的还有FBV(funvcion base view)模式,FBV(function base views) 就是在视图里使用函数处理请求
CBV的实现是django中把之前的视图函数通过类来实现
CBV定义一定要继承django.views.View
注册路由的时候要写类名.as_view()
具体原理是dispatch()方法中利用反射找到每个请求要执行的方法
2.1用法实例(如果还不明白,可以点击源码查看相关属性介绍)
urls.py
注意:这里的Login_cbv是类名,它必须后面调用as_view()
url(r'^login_cbv/$', views.Login_cbv.as_view())
views.py
from django.views import View
class Login_cbv(View):
def get(self,request): #如果是get请求需要执行的代码
return render(request,"login_cbv.html")
def post(self,request): #如果是post请求需要执行的代码
return HttpResponse(".....")
def delete(self,request):
pass
login_cbv.html
<form action="/login_cbv/" method="post">
{% csrf_token %}
姓名:<input type="text">
<input type="submit">
</form>
# 在源码说明中,可以看见总共有八种请求方式:
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
部分请求协议说明:
GET :从服务器取出资源(一项或多项) POST :在服务器新建一个资源 PUT :在服务器更新资源(客户端提供改变后的完整资源) PATCH :在服务器更新资源(客户端提供改变的属性) DELETE :从服务器删除资源
3.LOGGING日志
写Django项目常用的logging配置,在django的setting文件下配置如下代码:
BASE_LOG_DIR = os.path.join(BASE_DIR, 'log')
# 日志相关配置
LOGGING = {
'version': 1, # 保留字段
'disable_existing_loggers': False, # 不要禁用已经存在的logger实例 'formatters': { # 定义三种日志显示的格式
'standard': {
'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
'[%(levelname)s][%(message)s]'
},
'simple': {
'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
},
'collect': {
'format': '%(message)s'
}
}, 'filters': { # 定义一个过滤规则
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
}, 'handlers': { # 日志流的处理方式
'console': { # 把日志打印到终端
'level': 'DEBUG',
'filters': ['require_debug_true'], # 只有在Django debug为True时才在屏幕打印日志
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'default': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "info.log"), # 日志文件
'maxBytes': 1024 * 1024 * 500, # 日志大小 500M
'backupCount': 3, #
'formatter': 'standard',
'encoding': 'utf-8',
},
'error': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "err.log"), # 日志文件
'maxBytes': 1024 * 1024 * 500, # 日志大小 500M
'backupCount': 5,
'formatter': 'standard',
'encoding': 'utf-8',
},
'collect': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "collect.log"),
'maxBytes': 1024 * 1024 * 500, # 日志大小 500M
'backupCount': 5,
'formatter': 'collect',
'encoding': "utf-8"
}
},
'loggers': { # 默认的logger应用如下配置
'': {
'handlers': ['default', 'console', 'error'], # 上线之后可以把'console'移除
'level': 'DEBUG',
'propagate': True, # 是否向父级logger实例传递日志信息
}, # 名为 'collect'的logger还单独处理
'collect': {
'handlers': ['console', 'collect'],
'level': 'INFO',
}
},
} INTERNAL_IPS = ['127.0.0.1', ]
DEBUG_TOOLBAR_CONFIG = {
"JQUERY_URL": '//cdn.bootcss.com/jquery/2.2.4/jquery.min.js',
}
# 用法:
在需要的文件中引入
import logging loger = logging.getLoggr(__name__) # 生成一个以当前文件名为名字的 logger实例
在需要的位置下引入即可
示例:
def get(self, request, name):
res = {"code": 0}
# 拿到第一个学校对象
school_obj = models.School.objects.filter(name=name).first()
if not school_obj:
logger.warning('找不到学校信息...')
collect_logger.info(name) logger.debug('我来获取名字为{}学校详情'.format(name))
logger.info('我来获取名字为{}学校详情'.format(name))
4.django-debug-toolbar
一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息。文档地址猛戳这里
4.1 安装模块
pip3 install django-debug-toolbar
4.2 setting配制
settings.py中将 debug_toolbar 添加到 INSTALL_APPS 中
INSTALLED_APPS = [
…
'debug_toolbar',
]
4.3 urls.py中
from django.conf import settings
from django.conf.urls import include, url if settings.DEBUG:
import debug_toolbar
urlpatterns = [
url(r'^__debug__/', include(debug_toolbar.urls)),
] + urlpatterns
4.4 settings.py中在中间件中加入DebugToolbarMiddleware
MIDDLEWARE = [
# ...
'debug_toolbar.middleware.DebugToolbarMiddleware',
# ...
]
4.5 如果是本机调试,还在将127.0.0.1加入 INTERNAL_IPS,在settings.py中加入以下配置项:
INTERNAL_IPS = ['127.0.0.1', ]
4.6 配置jQuery的URL
django-debug-toolbar 默认使用的是Google的地址,默认配置如下:
JQUERY_URL = '//ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js'
国内用不了的话可以在settings.py中配置一下,例如(我这里特意选用了和原作者相同版本的jQuery):
DEBUG_TOOLBAR_CONFIG = {
"JQUERY_URL": '//cdn.bootcss.com/jquery/2.2.4/jquery.min.js',
}
# 或者你如果在Django项目中使用了jquery的话就可以直接将这一项置为空,即 "JQUERY_URL": ' ',那么django-debug-toolbar 就会使用你项目中用到的jquery,
4.7使用效果
访问具体路径的时候在页面右侧有各项配置面板,点击即可查看各种调试信息。
django中介模型,CBV模型,及logging日志配制的更多相关文章
- Django之logging日志
简介 Django使用python自带的logging 作为日志打印工具.简单介绍下logging. logging 是线程安全的,其主要由4部分组成: Logger 用户使用的直接接口,将日志传递给 ...
- 解决在django中应用keras模型时出现的ValueError("Tensor %s is not an element of this graph." % obj)问题
用keras训练好模型,再在django初始化加载模型,这个过程没有问题,但是在调用到模型执行model.predict()的时候就报错: raise ValueError("Tensor ...
- Django 创建模型 激活模型 简单的使用模型
创建模型: 在你的开发环境中,已经有一个“项目” —— 已经建立起来,你将开始在上面做一些东西. 你编写的每个Django应用都是一个遵循特定约定的Python包. Django自带一个工具,它可以自 ...
- Django学习笔记(16)——扩展Django自带User模型,实现用户注册与登录
一,项目题目:扩展Django自带User模型,实现用户注册与登录 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册,登录,用户认证,注销,修改密码等功能. ...
- Django—logging日志
简介 Django使用python自带的logging 作为日志打印工具.简单介绍下logging. logging 是线程安全的,其主要由4部分组成: Logger 用户使用的直接接口,将日志传递给 ...
- Django 的 logging日志文件配置
在Django的settings配置文件里配置以下信息: import os BASE_LOG_DIR = os.path.join(BASE_DIR , "log") # log ...
- Django框架(七):模型(三) 关联、模型类的属性
1. 关联 1.1 模型类关系 关系型数据库的关系包括三种类型: ForeignKey:一对多,将字段定义在多的一端中. ManyToManyField:多对多,将字段定义在任意一端中. OneToO ...
- Django中的CBV视图
Web 开发是一项无聊而且单调的工作,特别是在视图功能编写方面更为显著.为了减少这种痛苦,Django植入了视图类这一功能,该功能封装了视图开发常用的代码,无须编写大量代码即可快速完成数据视图的开发, ...
- form,ajax注册,logging日志使用
一.form表单类型提交注册信息 二.ajax版本提交注册信息 <!DOCTYPE html> <html lang="en"> <head> ...
随机推荐
- Zookeeper的集群配置和Java测试程序 (一)
概述 Zookeeper是Apache下的项目之一,倾向于对大型应用的协同维护管理工作.IBM则给出了IBM对ZooKeeper的认知: Zookeeper 分布式服务框架是 Apache Hadoo ...
- C语言判别输入的东东
梗概:现在很多用C语言写出来的作业,都是用户输入后,电脑对应操作的.其实这样有没有漏洞呢? 这样的管理系统,相信大家也不陌生,我们这里不是谈它的功能和怎样实现..我们就谈谈最后一行.[输入序号].其实 ...
- iTween Scale缩放
void Start () { //键值对儿的形式保存iTween所用到的参数 Hashtable args = new Hashtable(); //放大的倍数 args.Add(, , )); / ...
- Ubuntu截图工具gnome-screenshot使用教程
Ubuntu自带的截图工具非常好用,可以自已设置各种截图的快捷键,下面我们一起来了解一下这个截图工具gnome-screenshot Ubuntu自带的截图工具非常好用,可以自已设置各种截图的快捷 ...
- MATLAB矩阵操作和算术运算符
矩阵的表示 矩阵之间用空格或者是逗号间隔 矩阵可以拼接(可以用矩阵拼接) 实部矩阵和虚部矩阵构成复数矩阵,一一对应. 冒号表达式: 格式: e1:e2:e3 e1表示初始值 e2表示步长 e ...
- ErlangC 最佳人力效益指标
以平均服务时间(AHT)180秒,顾客来电量每15分钟150通以及服务目标时间在20秒内为例子说明最佳人力效益指标.此假设条件下由Erlang C模拟器的结果如下图, 假设我希望客服中心的期望服务水准 ...
- Nginx主主负载均衡架构
在和一些朋友交流Nginx+Keepalived技术时,我虽然已成功多次实Nginx+Keepaived项目方案,但这些都是用的单主Nginx在工作,从Nginx长期只是处于备份状态,所以我们想将二台 ...
- Spring自定义注解配置切面实现日志记录
一: spring-mvc.xml: <!--配置日志切面 start,必须与mvc配置在同一个配置文件,否则无法切入Controller层--><!-- 声明自动为spring容器 ...
- nopcommerce 3.6网银在线支付插件(源码)
网银在线支付插件,下载后通过后台插件管理安装.配置即可使用. 下载:网银在线支付插件3.1.3.6版.rar (106.3KB) 源代码放在\Plugins目录下,用vs打开重新生成. 源地址:htt ...
- ArcGIS for Service中JavaScript预览在内网环境无法使用
1.问题说明 在使用ArcGIS for Service时经常会遇到一个问题,那就是我们需要对已经发布的服务进行预览,预览时点击对应服务,选择View in中的ArcGIS JavaScript就可在 ...