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模块分 ...
随机推荐
- python之restful api(flask)获取数据
需要用到谷歌浏览器的扩展程序 Advanced Rest Client进行模拟请求 1.直接上代码 from flask import Flask from flask import request ...
- MySQL 5.6.20-enterprise-commercial的参数文件位置问题
今天在折腾MySQL的参数文件时,突然发现MySQL 5.6.20-enterprise-commercial-advanced-log这个版本数据库的参数文件my.cnf的位置有点奇怪,如下所示: ...
- tesseract安装及问题处理
错误1 pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your p ...
- 自动化测试基础篇--Selenium单选框(Radio)复选框(CheckBox)
摘自:https://www.cnblogs.com/sanzangTst/p/7686602.html 一.什么是单选框.复选框? 二.单选框:radio 三.复选框:checkbox 四.判断是否 ...
- 【底层原理】深入理解Cache (上)
存储器是分层次的,离CPU越近的存储器,速度越快,每字节的成本越高,同时容量也因此越小.寄存器速度最快,离CPU最近,成本最高,所以个数容量有限,其次是高速缓存(缓存也是分级,有L1,L2等缓存),再 ...
- redmine screenshot paste(粘贴截图)
前言 本文所使用的 redmine 3.1.x 查看redmine版本:以管理员帐号登录 – 点 管理 – 点 信息,示例如下: 在线插件库 插件仓库,可以下载丰富的插件: http://www.re ...
- Cs231n课堂内容记录-Lecture 3 最优化
Lecture 4 最优化 课程内容记录: (上)https://zhuanlan.zhihu.com/p/21360434?refer=intelligentunit (下)https://zhua ...
- spring cloud 实践坑点记录
用spring cloud 微服务框架有一段时间了有一些坑点在这里给大家记录一下希望大家用得着 1.当我们使用聚合性能监控的时候,我们采用 rabbitmq作为消息中间件来收集性能信息最后在使用Tur ...
- May 25. 2018 Week 21st Friday
Nothing for nothing. 不费力气,就一无所得. These days I am busy in compiling a lightweight communication libra ...
- C语言 设一个函数process,调用它时,实现不同功能。
//凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 输入a, b,第一次调用process找最大值,第二次调用process找最小值,第三次调用求和. 方法1 ...