python day21

1、文件上传
    a. Html Form表单提交
    b. Ajax提交
        原生XMLHttpRequest
            http://www.cnblogs.com/wupeiqi/articles/5703697.html
           
            XmlHttpReqeust() 类
            xhr = XmlHttpReqeust()
            xhr.send("k1=v1;k2=v2")
           
           
        jQuery Ajax
            $.ajax({}) 内部调用XmlHttpReqeust来发送的Ajax
           
            $.ajax({
                data: {'k1': 'v1', 'k2': 'v2'}
            })
       
   

2、验证码 + session


抽屉:
    需求分析
    数据库设计
        - 用户表
        - 短信、邮件临时表
        - 新闻类型表:
            1  42区
            2  段子
            3  兔皮纳
            4  挨踢
            5  你问我答
        - 新闻表:
                标题,摘要,url,赞数1
               
                    http://dajia.qq.com/original/oldtimes/csc20160925.html
                图片路径(url),摘要
                    /detail/1
                   
                标题:asdf
                摘要:asdfasd
                URL:http://dajia.qq.com/original/oldtimes/csc20160925.html
                类型:1
               
                标题:
                摘要:asdfasd
                URL:http://dajia.qq.com/original/oldtimes/csc20160925.html
                类型:2
               
        - 点赞表
            新闻ID    用户ID
              1         1   
       
        - 评论表
            新闻ID    用户ID    评论内容   评论事件    顶   踩
           
       
       
    功能开发:
        注册
        登录
        发布新闻
        点赞
        评论
       
       
作业:
    1、评论
        - 单级评论
        - 多级评论
       
        ---- 必须交
       
       
    2、预习Tornado
        Torando + SQLAchemy
        pip3 install tornado
        http://www.tornadoweb.cn
       
       
       
官网实例:
    瀑布流
    组合搜索   
   

 

 

验证码


pip3 install Pillow


urls.py
    from app01 import views

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^upload/', views.upload),
        url(r'^ajax/', views.ajax),
        url(r'^xhr_ajax/', views.xhr_ajax),
        url(r'^login/', views.login),
        url(r'^check_code/', views.check_code),
    ]

   
   
   
views.py
    from django.shortcuts import render,HttpResponse
    import os
    import json
    # Create your views here.

    def upload(request):
        if request.method == 'POST':
            ret = {'status': False, 'data': None, 'error': None}
            try:
                user = request.POST.get('user')
                # img = request.POST.get('img')
                img = request.FILES.get('img')
                print(type(img))
                from django.core.files.uploadedfile import InMemoryUploadedFile
                file_path = os.path.join('static', img.name)
                f = open(file_path,'wb')
                for chunk in img.chunks():
                    f.write(chunk)
                f.close()
                ret['status'] = True
                ret['data'] = file_path
            except Exception as e:
                ret['error'] = str(e)

            return HttpResponse(json.dumps(ret))
        return render(request, 'upload.html')

    def ajax(request):
        import time
        crruent_time = time.time()
        return render(request, 'ajax.html',{'crruent_time': crruent_time})

    def xhr_ajax(request):
        print(request.GET)
        print(request.POST)
        return HttpResponse('ok')

    def check_code(request):
        import io
        from backend import check_code as CheckCode

        stream = io.BytesIO()
        # img图片对象,code在图像中写的内容
        img, code = CheckCode.create_validate_code()
        img.save(stream, "png")

        request.session["CheckCode"] = code
        return HttpResponse(stream.getvalue())

        # 代码:生成一张图片,在图片中写文件
        # request.session['CheckCode'] =  图片上的内容

        # 自动生成图片,并且将图片中的文字保存在session中
        # 将图片内容返回给用户

    def login(request):
        if request.method == 'POST':
            input_code = request.POST.get('check_code')
            print(input_code.upper(),request.session['CheckCode'].upper())
        return render(request, 'login.html')
   
   
   
   
   
backend/check_code.py
    #!/usr/bin/env python
    #coding:utf-8

    import random
    from PIL import Image, ImageDraw, ImageFont, ImageFilter

    _letter_cases = "abcdefghjkmnpqrstuvwxy"  # 小写字母,去除可能干扰的i,l,o,z
    _upper_cases = _letter_cases.upper()  # 大写字母
    _numbers = ''.join(map(str, range(3, 10)))  # 数字
    init_chars = ''.join((_letter_cases, _upper_cases, _numbers))

    def create_validate_code(size=(120, 30),
                             chars=init_chars,
                             img_type="GIF",
                             mode="RGB",
                             bg_color=(255, 255, 255),
                             fg_color=(0, 0, 255),
                             font_size=18,
                             font_type="Monaco.ttf",
                             length=4,
                             draw_lines=True,
                             n_line=(1, 2),
                             draw_points=True,
                             point_chance = 2):
        '''
        @todo: 生成验证码图片
        @param size: 图片的大小,格式(宽,高),默认为(120, 30)
        @param chars: 允许的字符集合,格式字符串
        @param img_type: 图片保存的格式,默认为GIF,可选的为GIF,JPEG,TIFF,PNG
        @param mode: 图片模式,默认为RGB
        @param bg_color: 背景颜色,默认为白色
        @param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000FF
        @param font_size: 验证码字体大小
        @param font_type: 验证码字体,默认为 ae_AlArabiya.ttf
        @param length: 验证码字符个数
        @param draw_lines: 是否划干扰线
        @param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
        @param draw_points: 是否画干扰点
        @param point_chance: 干扰点出现的概率,大小范围[0, 100]
        @return: [0]: PIL Image实例
        @return: [1]: 验证码图片中的字符串
        '''

        width, height = size # 宽, 高
        img = Image.new(mode, size, bg_color) # 创建图形
        draw = ImageDraw.Draw(img) # 创建画笔

        def get_chars():
            '''生成给定长度的字符串,返回列表格式'''
            return random.sample(chars, length)

        def create_lines():
            '''绘制干扰线'''
            line_num = random.randint(*n_line) # 干扰线条数

            for i in range(line_num):
                # 起始点
                begin = (random.randint(0, size[0]), random.randint(0, size[1]))
                #结束点
                end = (random.randint(0, size[0]), random.randint(0, size[1]))
                draw.line([begin, end], fill=(0, 0, 0))

        def create_points():
            '''绘制干扰点'''
            chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]

            for w in range(width):
                for h in range(height):
                    tmp = random.randint(0, 100)
                    if tmp > 100 - chance:
                        draw.point((w, h), fill=(0, 0, 0))

        def create_strs():
            '''绘制验证码字符'''
            c_chars = get_chars()
            strs = ' %s ' % ' '.join(c_chars) # 每个字符前后以空格隔开

            font = ImageFont.truetype(font_type, font_size)
            font_width, font_height = font.getsize(strs)

            draw.text(((width - font_width) / 3, (height - font_height) / 3),
                        strs, font=font, fill=fg_color)

            return ''.join(c_chars)

        if draw_lines:
            create_lines()
        if draw_points:
            create_points()
        strs = create_strs()

        # 图形扭曲参数
        params = [1 - float(random.randint(1, 2)) / 100,
                  0,
                  0,
                  0,
                  1 - float(random.randint(1, 10)) / 100,
                  float(random.randint(1, 2)) / 500,
                  0.001,
                  float(random.randint(1, 2)) / 500
                  ]
        img = img.transform(size, Image.PERSPECTIVE, params) # 创建扭曲

        img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 滤镜,边界加强(阈值更大)

        return img, strs

   

template/login.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form action="/login/" method="POST">
            <input type="text" name="username" />
            <input type="text" name="pwd" />
            <input type="text" name="check_code" />
            <img src="/check_code/" onclick="ChangeCode(this);">
            <input type="submit" />
        </form>
        <script>
            function ChangeCode(ths){
                ths.src = ths.src + '?';
            }
        </script>
    </body>
    </html>
   
   

   
Monaco.ttf

 

 

 

static/jquery-1.8.2.min.js

   


python3 manage.py makemigrations
python3 manage.py migrate

 


访问
http://127.0.0.1:8000/login/

posted @ 2016-10-15 09:42  颠覆自我  阅读(137)  评论(0编辑  收藏  举报