1.数据库可以存入空字符串,存之前需进行空值判断
为过滤前端传递的空值,input框可加上required属性,表示为必填项
<input type="text" name="username" required>
2.重定向给路由地址
3.前后端交互:json
json.dumps() 转为json格式
json.loads() 转为python格式
前端使用$.get()接收数据,格式参数选为json后不用再转格式,拿到的就是json
4.验证码
1.实现方式:登录页中插入img标签,src指向验证码生成的url,返回验证码的同时将验证码的值存入session中
2.动态刷新:
原理:当一个img的src改变时,页面会自动刷新这个img
请求验证码的url结尾别写死,然后在url后面加个随机数就行
<script>
$(function () {
$('#verifyImg').click(function () {
$(this).prop('src','/test/verifycode/'+Math.random());
});
})
</script>
3.设置验证码的有效期:request.session.set_expiry()
def verifycode(request):
'''在django中用于生成随机验证码,返回验证码图片并将随机字符保存进session'''
# 得到4位随机码
base_str = string.ascii_letters + string.digits
rnd_list = random.sample(base_str, 4)
rnd_str = ''.join(rnd_list)
# 保存验证码到session
request.session['verifycode'] = rnd_str.lower()
# 设置保存时间
request.session.set_expiry(60)
服务端验证OK后再将session的有效期改回来
def login_(request):
if request.method == 'POST':
if int(request.POST.get('count',0)) > 2:
verify = request.POST.get('verify').lower()
if not request.session.get('verifycode',False):
return render(request,'login.html',{'message':'验证码过期','count':3})
if verify != request.session.get('verifycode',False):
return render(request,'login.html',{'message':'验证码错误','count':3})
username = request.POST.get('username')
password = request.POST.get('password')
user = auth.authenticate(username=username,password=password)
if user is not None and user.is_active:
auth.login(request,user)
request.session.set_expiry(None)
request.session.set_expiry(value)
-
如果value是个整数,session会在些秒数后失效(适用于整个Django框架,即这个数值时效时整个页面都会session失效)。
-
如果value是个datatime或timedelta,session就会在这个时间后失效。
-
如果value是0,用户关闭浏览器session就会失效。
-
如果value是None,session会依赖全局session失效策略。
5.DatetimeField和DateField()参数
# orm模型
match_time = models.DateTimeField('比对时间',default=False)
# 存数据
record.match_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
其他参数书写后migrate时均报错,这个写法可以正常使用
6.模板中日期格式输出:
{{ record.match_time | date:"Y-m-d" }} {{ record.match_time | time:"H:i:s" }}
#渲染后:2019-04-14 10:12:28
7.ajax局部刷新页面内容
服务端响应html内容,前端对div中的html内容进行替换
8.涉及日期时间段的查询
# 根据用户输入查询数据,未输入则查询所有
def query_(request):
if request.is_ajax():
order_no = request.GET.get('order_no')
start_date = request.GET.get('start_date')
end_date = request.GET.get('end_date')
#先查询所有结果集,后续进行过滤
records = Recode.objects.all()
if order_no:
order = Order_list.objects.filter(order_no=order_no).first()
records = Recode.objects.filter(order=order)
if start_date:
records = records.filter(match_time__gte=start_date)
if end_date:
#查询结果包含最后一天的数据
end_date += ' 23:59:59'
records = records.filter(match_time__lt=end_date)
return render(request,'table.html',locals())
else:
records = Recode.objects.all()
return render(request,'query.html',locals())
9.关闭浏览器session失效:
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
#设置session在cookie中的保存时长
SESSION_COOKIE_AGE = 60*30
10.生成二维码
# qrcode依赖于Image库,需要提前装好
import qrcode
from django.utils.six import BytesIO
def qrcode_(request):
#test为要写在二维码中的内容
text = request.GET.get('text')
img = qrcode.make(text)
# 创建二进制内存对象,存储图片
buf = BytesIO()
img.save(buf)
return HttpResponse(buf.getvalue())
ajax动态加载二维码图片
<script>
$.get('/match/',data,function (resp) {
# 移除上一次的二维码图片
$('img').remove();
if(resp.result == 1){
var img = $('<img></img>');
#src='/qrcode_?/text=........'
img.prop('src',resp.src);
$('body').append(img)
}
},'json')
})
})
</script>
11.实现单用户登录
from django.contrib.sessions.models import Session
from django.utils import timezone
def login_(request):
if request.method == 'POST':
verify = request.POST.get('verify').lower()
if verify != request.session['verifycode']:
return render(request,'login.html',{'message':'验证码错误'})
username = request.POST.get('username')
password = request.POST.get('password')
user = auth.authenticate(username=username,password=password)
if user is not None and user.is_active:
auth.login(request,user)
#挤掉之前登录的同一个账号
# 遍历django_session表中的信息,但本次登录的user_id并不会及时更新到数据库中
# 因为中间件?暂时不确定原因。遍历得到的session是对应session表中的一条数据
for session in Session.objects.filter(expire_date__gte=timezone.now()):
# 对session进行解析,得到一个字典
# {'_auth_user_backend': 'django.contrib.auth.backends.ModelBackend',
# 'verifycode': 'qpae', '_auth_user_id': '7',
# '_auth_user_hash': 'a9a3f21ad6e762d2c881fcf80037bf9dbf993942'}
data = session.get_decoded()
if data.get('_auth_user_id', None) == str(request.user.id):
session.delete()
return redirect('/')
12.导出csv文件
import csv, codecs
def download_(request):
records = Recode.objects.all()
# 申明响应类型
response = HttpResponse(content_type='text/csv')
# 添加UTF-8的BOM标记,解决文件中 中文乱码问题
response.write(codecs.BOM_UTF8)
# 设置文件名
response['Content-Disposition'] = 'attachment; filename="%s.csv"'% datetime.now().strftime('%Y%m%d%H%M%S')
writer = csv.writer(response)
count = 0
for record in records:
if count == 0:
L = ['序号', '姓名', '订单号', '比对结果', '比对日期']
else:
L = [count,record.user.name,record.order.order_no,record.result,record.match_time]
writer.writerow(L)
count += 1
return response