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模块分 ...
随机推荐
- RMAN restore fails with ORA-01180: can not create datafile 1
最近在验证.测试备份有效性时,遇到了"ORA-01180: can not create datafile 1"这个错误,顺便结合metalink的官方文档"RMAN ...
- 获取Bing每日图片API接口
bing图片每日更新,对于这一点感觉挺不错的,如果能够把bing每日图片作为博客背景是不是很不错呢?首先我们进入Bing首页,会发现自动转到中国版.不过这没关系,中国版更符合国情,速度也比国际版快一些 ...
- WebAPI接口设计:SwaggerUI文档 / 统一响应格式 / 统一异常处理 / 统一权限验证
为什么还要写这类文章?因为我看过网上很多讲解的都不够全面,而本文结合实际工作讲解了swaggerui文档,统一响应格式,异常处理,权限验证等常用模块,并提供一套完善的案例源代码,在实际工作中可直接参考 ...
- 洗礼灵魂,修炼python(79)--全栈项目实战篇(7)—— 多级目录菜单之地址管理系统升级版
要求: 1.在上一篇的地址管理系统的基础上做升级改动 2.添加增删改的功能 3.尽量的贴近生活常识中的地址管理 分析: 需求不用多说了,干就完了 相关文件源码地址:github 这次由于要有增删改的操 ...
- IO Redirect 与 Pipe
对于任何一个进程,在启动时,都会打开三个流:stdin(标准输入), stdout(标准输出), stderr(标准错误输出).Stdout,stderr是process与Display之间,stdi ...
- 十大经典排序算法的python实现
十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序.包括:冒泡排序.选择排序.归并排序.快速 ...
- C# -- Lambda 表达式的使用
C# -- Lambda 表达式的使用 Lambda 表达式是作为对象处理的代码块(表达式或语句块). 它可作为参数传递给方法,也可通过方法调用返回. Lambda 表达式是可以表示为委托的代码,或者 ...
- Shell脚本中的 测试开关 和 特殊参数
1. 测试开关 Shell中自带的一些测试指令, 下表列出这些测试指令的含义以及是否可用于 test命令, bash, ksh. 开关 test bash ksh 定义 -a FILE 支持 支持 ...
- 《Java大学教程》—第12章 案例研究--第2部分
本章就是上一章的延续,主要是用GUI实现了控制界面. 编程练习:代码附件Hostel.java1. 正确运行2. Runhostel.java3. searchButton
- 《Java大学教程》—第5章 数组
5.6 增强的for循环:访问整个数组,读取数组元素,不基于数据下列5.7 数组方法:最大值.求和.成员访问.查找 1.答:P92存储固定个数相同数据类型的一组元素. 2.答:P92所有存储在一个特定 ...