form,ajax注册,logging日志使用
一.form表单类型提交注册信息


二.ajax版本提交注册信息

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/fontawesome/css/font-awesome.min.css">
<link rel="stylesheet" href="/static/sweetalert/sweetalert.css">
<style>
#show_avatar{
width: 80px;
height:80px;
}
</style>
</head>
<body>
<div class="container">
<div class="row">
<div class="page-header">
<h1>博客园注册页面
<small>技术精英的地盘</small>
</h1>
</div>
</div>
<div class="row">
<div class="panel panel-primary">
<div class="panel-heading">
<div class="row">
<div class="col-md-6"><h3 class="panel-title"><i class="fa fa-user-secret fa-3x" aria-hidden="true"></i></h3></div>
<div class="col-md-6 "><i class="fa fa-users fa-3x pull-right " aria-hidden="true"></i></div>
</div>
</div>
<div class="panel-body">
<form class="form-horizontal" action="" method="post" novalidate enctype="multipart/form-data">
{% csrf_token %}
<div class="form-group">
{# 如果这个字段有报错信息,那我就添加has-error的样式#}
<label for="{{ form_obj.username.id_for_label }}"
class="col-sm-2 control-label col-lg-push-2">{{ form_obj.username.label }}</label>
<div class="col-sm-4 col-lg-push-2">
{{ form_obj.username }}
<span class="help-block"></span>
</div>
</div>
<div class="form-group">
<label for="{{ form_obj.password.id_for_label }}"
class="col-sm-2 control-label col-lg-push-2">{{ form_obj.password.label }}</label>
<div class="col-sm-4 col-lg-push-2">
{{ form_obj.password }}
<span class="help-block"></span>
</div>
</div>
<div class="form-group ">
<label for="{{ form_obj.confirm_password.id_for_label }}"
class="col-sm-2 control-label col-lg-push-2">{{ form_obj.confirm_password.label }}</label>
<div class="col-sm-4 col-lg-push-2">
{{ form_obj.confirm_password }}
<span class="help-block"></span>
</div>
</div>
<div class="form-group">
<label for="{{ form_obj.phone.id_for_label }}"
class="col-sm-2 control-label col-lg-push-2">{{ form_obj.phone.label }}</label>
<div class="col-sm-4 col-lg-push-2">
{{ form_obj.phone }}
<span class="help-block"></span>
</div>
</div>
{# <div class="form-group {% if form_obj.email.errors.0 %}has-error{% endif %}">#}
{# <label for="{{ form_obj.email.id_for_label }}"#}
{# class="col-sm-2 control-label col-lg-push-2">{{ form_obj.email.label }}</label>#}
{# <div class="col-sm-4 col-lg-push-2">#}
{# {{ form_obj.email }}#}
{# <span style= }}</span>#}
{# </div>#}
{# </div>#}
{# <div class="form-group">#}
{# <label class="col-md-2 control-label col-lg-push-2">{{ form_obj.gender.label }}</label>#}
{# <div class="col-md-10 col-lg-push-2">#}
{# <div class="radio">#}
{# {% for radio in form_obj.gender %}#}
{# <label for="{{ radio.id_for_label }}">#}
{# {{ radio.tag }}{{ radio.choice_label }}#}
{# </label>#}
{# {% endfor %}#}
{# </div>#}
{# </div>#}
{# </div>#}
{# <div class="form-group">#}
{# <label class="col-md-2 control-label col-lg-push-2">{{ form_obj.hobby.label }}</label>#}
{# <div class="col-md-4 col-lg-push-2">#}
{# {{ form_obj.hobby }}#}
{# </div>#}
{# </div>#}
<div class="form-group">
<label for='id_avatar' class="col-sm-2 control-label col-lg-push-2">头像</label>
<div class="col-md-4 col-lg-push-2">
<label for="id_avatar"><img src="/static/img/default.png" alt="" id="show_avatar"></label>
<input type="file" name="avatar" id="id_avatar" style="display: none">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-5 col-sm-2">
<button type="button" class="btn btn-primary btn-block" id="b1">注册</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<script src="/static/jquery-3.3.1.min.js"></script>
<script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
<script src="/static/setup_Ajax.js"></script>
<script>
$('#b1').click(function () {
let formDataObj=new FormData();
formDataObj.append('username',$('#id_username').val());
formDataObj.append('password',$('#id_password').val());
formDataObj.append('confirm_password',$('#id_confirm_password').val());
formDataObj.append('phone',$('#id_phone').val());
formDataObj.append(].files[]);
$.ajax({
url:'',
type:'POST',
processData:false,
contentType:false,
data:formDataObj,
success:function (data) {
if (!data.flag){
location.href=data.data || '/middle/'
}else {
let errorMsg=data.data;
$.each(errorMsg,function (k,v) {
$(]).parent().parent().addClass('has-error')
})
}
}
})
});
$('#id_avatar').change(function () {
//拿到用户选中的头像文件
let FileObj=];
//读取文件路径
let fileReader=new FileReader();
fileReader.readAsDataURL(FileObj);
//等图片读取完毕之后,再做后续的操作
fileReader.onload=function () {
//设置预览图片
$('#show_avatar').attr('src',fileReader.result);
};
});
$('input').focus(function () {
$(this).next().text('').parent().parent().removeClass('has-error')
})
</script>
</body>
</html>
html
三.关于用户上传的文件类数据保存路径
用户提交的数据除了正常的文本信息外,还包含文件,图片,视频等信息,这些信息我们不可能记录到数据库中,而是创建一个文件目录将数据全部保存到该目录下,书库中只存放上传数据的路径,这里需要在Django settings.py中告诉Django

除了告诉Django你设置了这一个存放用户上传的文件类型的目录之外,你还需要在视图函数中添加特点的路由指示

四.logging日志模块
LOGGING = {
,
'disable_existing_loggers': False,
'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, "xxx_info.log"), # 日志文件
* * , # 日志大小 50M
,
'formatter': 'standard',
'encoding': 'utf-8',
},
'error': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"), # 日志文件
* * , # 日志大小 50M
,
'formatter': 'standard',
'encoding': 'utf-8',
},
'collect': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"),
* * , # 日志大小 50M
,
'formatter': 'collect',
'encoding': "utf-8"
}
},
'loggers': {
# 默认的logger应用如下配置
'': {
'handlers': ['default', 'console', 'error'], # 上线之后可以把'console'移除
'level': 'DEBUG',
'propagate': True,
},
# 名为 'collect'的logger还单独处理
'collect': {
'handlers': ['console', 'collect'],
'level': 'INFO',
}
},
}
赋值粘贴即可使用版本
进阶,如果我让你记录所有访问我Django项目的请求方法,你该如何进行日志的记录?
这个时候就可以结合我们学到的中间件来帮我们实现一劳永逸的效果,废话不多说直接上图




form,ajax注册,logging日志使用的更多相关文章
- django中介模型,CBV模型,及logging日志配制
1.中介模型 中介模型,这个是在我们创建表格时,多对多添加的时候应用到的,通过制定ManyToManyField字段中的through参数来定义,为两者的关系新建一个中介class 为什么会产生这个中 ...
- python 自动化之路 logging日志模块
logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511 ...
- 第一百六十节,封装库--JavaScript,ajax注册表单到数据库
封装库--JavaScript,ajax注册表单到数据库 效果图 前台js var biaodan = $().xu_lie_biao_dan($('form').sh_jd()); //序列化获取表 ...
- logging日志模块详细,日志模块的配置字典,第三方模块的下载与使用
logging日志模块详细 简介 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么 了,但是当我需要看大量的地方或者在一个文件中查看的时 ...
- logging 日志模块学习
logging 日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪,所以还是灰常重要滴,下面我就来从入门到放弃的系统学习一下日志既可以在屏幕上显示,又可以在文件中体现. ...
- logging日志模块
为什么要做日志: 审计跟踪:但错误发生时,你需要清除知道该如何处理,通过对日志跟踪,你可以获取该错误发生的具体环境,你需要确切知道什么是什么引起该错误,什么对该错误不会造成影响. 跟踪应用的警告和错误 ...
- Ajax注册验证用户名是否存在 ——引自百度经验
Ajax注册验证用户名是否存在 http://jingyan.baidu.com/article/a948d6515fdf870a2dcd2e85.html
- python-整理-logging日志
python的日志功能模块是logging 功能和使用方式非常类似于log4 如何使用logging: # 导入日志模块import logging# 使用配置文件设置日志时,需要导入这个模块 imp ...
- 【转】python模块分析之logging日志(四)
[转]python模块分析之logging日志(四) python的logging模块是用来写日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分 ...
随机推荐
- Linux 最小化安装后IP的配置(手动获取静态IP地址)
一.图形化界面配置(假设为电脑A) 如果你的Linux安装有图形化界面,那么通过以下方式来配置: 我这里是有两块网卡,第一个网卡在上篇中已经通过DHCP来配置了:Linux 最小化安装后IP的配置(D ...
- 关于wordpress慢的问题
随笔记载: 关于wordpress访问慢的原因,主要是wordpress采用了google前端库, 需替换wordpress/wp-includes/script-header.php中所有的goog ...
- SQL Server 缓存清除与内存释放
Sql Server系统内存管理在没有配置内存最大值,很多时候我们会发现运行SqlServer的系统内存往往居高不下.这是由于他对于内存使用的策略是有多少闲置的内存就占用多少,直到内存使用虑达到系统峰 ...
- [Hive_add_5] Hive 的 join 操作
0. 说明 在 Hive 中进行 join 操作 1. 操作步骤 1.0 建表 在 hiveserver2 服务启动的前提下,在 Beeline客户端中输入以下命令 # 新建顾客表 create ta ...
- HTML 页面自动刷新
学习就是一个不断积累的过程,每一天能够学到一点新东西说明自己就在进步!! HTML head 里面设置页面自动刷新功能 <meta http-equiv="Refresh" ...
- C语言 投票系统:给定候选人,从键盘输入候选人的名字,统计票数,并输出最终获胜者
投票系统:给定候选人名单,从键盘输入候选人的名字,统计票数,并输出最终获胜者.若投票人输入的名字不在其候选名单上,则该票数无效. //凯鲁嘎吉 - 博客园 http://www.cnblogs.com ...
- (转)Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践
http://www.ityouknow.com/springboot/2018/03/28/dockercompose-springboot-mysql-nginx.html 我知道大家这段时间看了 ...
- ASP.Net在64位环境开发部署常见问题
越来越多的开发团队開始使用64位操作系统作为开发环境,也计划将应用部署在安装有64位操作系统的server上.对于ASP.Net开发人员来说.使用64位环境开发部署须要注意下面几个问题.可在项目过程中 ...
- wait和notify
① wait() 与 notify/notifyAll 方法必须在同步代码块中使用 synchronized修饰的同步代码块或方法里面调用wait() 与 notify/notifyAll()方法 ...
- UVA11491-Erasing ans Winning(贪心)
Problem UVA11491-Erasing ans Winning Accept: 799 Submit: 5753Time Limit: 3000 mSec Problem Descript ...