django防错料系统开发总结

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值