• 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/

  • 相关阅读:
    关于IP4上WIFI设置静态IP的一点经验
    迷你MVVM框架 avalonjs 1.1发布
    r.js合并实践
    IE6的checkbox, radio是通过defaultChecked决定是否选中
    2013年最后的收成:avalon1.0正式发布
    还要多少年, 前端开发才能像后端那样轻松
    JavaScript Promise:去而复返
    JavaScript 18岁生日快乐
    web界面上的字体兼容方案
    键盘钩子原理----开发按键发音程序
  • 原文地址:https://www.cnblogs.com/wangminghu/p/5962769.html
Copyright © 2020-2023  润新知