day21

1、文件上传
    a. Html Form表单提交
    b. Ajax提交
        原生XMLHttpRequest

XmlHttpReqeust() 类
            xhr = XmlHttpReqeust()
            xhr.send("k1=v1;k2=v2")
           
           
        jQuery Ajax
            $.ajax({}) 内部调用XmlHttpReqeust来发送的Ajax
           
            $.ajax({
                data: {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘}
            })

2、验证码 + session

- 点赞表
            新闻ID    用户ID
              1         1   
       
        - 评论表
            新闻ID    用户ID    评论内容   评论事件    顶   踩
           
       
       
    功能开发:
        注册
        登录
        发布新闻
        点赞
        评论
       
       
作业:
    1、评论
        - 单级评论
        - 多级评论
       
        ---- 必须交
       
       
    2、预习Tornado
        Torando + SQLAchemy
        pip3 install tornado
 
       
       
       
官网实例:
    瀑布流
    组合搜索

验证码

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/

时间: 2024-11-05 22:34:04

day21的相关文章

传智播客 2015年 刘意_Java基础视频-深入浅出精华版 笔记(day21~)(2016年3月26日01:10:44)

day21 1.编码表概述和常见编码表 计算机只能识别二进制数据,早期由来是电信号. 为了方便应用计算机,让它可以识别各个国家的文字. 就将各个国家的文字用数字来表示,并一一对应,形成一张表. ASCII:美国标准信息交换码. 用一个字节的7位可以表示. ISO8859-1:拉丁码表.欧洲码表 用一个字节的8位表示. GB2312:中国的中文编码表. GBK:中国的中文编码表升级,融合了更多的中文文字符号. GB18030:GBK的取代版本 BIG-5码 :通行于台湾.香港地区的一个繁体字编码方

21天战拖记——Day21:《小强升职记》学习感受(2014-05-24)

今天是第21天,学习@邹鑫_GTDLife 的<小强升职记(升级版)>的第21天,从5月2日错过了秋叶的PPT群中的分享后,连夜翻了分享记录,下单入手:到5月3号,微博上晒书@邹鑫老师:再到55号,开始了#21天战拖记#的第一篇文章,到今天21天,居然就这么坚持过来了. 在过去的21天里,每天学习<小强升职记>里的内容和,坚持写随书附赠的"实践手册",并拍照并将学习记录进行整理,写道自己的博客和长微博里,分享出来.不过一直没好意思@邹鑫老师,怕万一自己没有坚持下

Python之路,Day21 - 常用算法学习

Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算

Python基础day-21[面向对象:多态,绑定方法]

多态: 指的是一种事物的多种形态. 例如: 数据类型有多种形态:字符串,列表,元组 动物的多种形态:狗,猫,老虎,狮子... 一个抽象类有多个子类,因而多态的概念依赖于继承. import abc class A(metaclass=abc.ABCMeta): @abc.abstractmethod def talk(self): #子类必须有 talk方法 pass class B(A): def talk(self): print('say Hi') class C(A): def talk

leetcode -day21 Longest Substring Without Repeating Characters

 1.Longest Substring Without Repeating Characters Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the

[Java视频笔记]day21

操作对象 ObjectInputStream ObjectOutputStream 被操作的对象需要实现Serializable(标记接口,没有方法的接口通常称为标记接口) 把对象存到硬盘上,叫做对象的持久化. 一般情况: import java.io.*; class Person implements Serializable { String name; int age; Person(String name, int age) { this.name = name; this.age =

day21 java 语言中的读取写入数据(二)

day21  java 语言中的读取写入数据(二) 一.概述: 使用IO流写文件,就体现的是下载的功能.所以说很有必要单独说一下. 二.写入功能:(下载) 写入功能同样也是被分隔为了字符流写入和字节流写入两个方式. (一):字符流写入数据 1.FileWriter类. 2.bufferedwriter类.带缓冲流 (二):字节流写入数据 1.FileOutputStream类. 2.bufferoutputstream类.带有缓冲流 三.具体实例     (一):字符流写入数据 //io数据流输

day21 数据库(DataBase)

1.数据库由多张表组成,一张表就是一个实体. 2.表的列就是属性的值,行就是一个个具体的对象的属性值. primary key主键:1.非空.2.不能修改(定好不变).3.业务无关. 作用:在表中具体唯一标识某条记录. foreign key外键:记录这张表和另一张表的数据关系. 1对1的时候,外键可以在任何一方. 1对多的时候,外键只能在多的一方. 多对多的时候,需要添加一张关系表来表示他们的关系. RDBMS(relationship data base management system)

【DAY21】JDBC 与 MySQL 的学习笔记

Properties : ---------------- 1.extends Hashtable ,线程安全的. 2.key - value SQL : Structurual query language,结构化查询语言. ------------------------------------------------- database : -------------- 1.数据库 2.表的集合. 3.操作 1.增加 id   | name  | age -----------------

字符流总结--Day21

转换流出现的原因及思想由于字节流操作中文不是特别方便,所以,java就提供了转换流(InputStreamReader,OutputStreamWriter).OutputStreamWriter:是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节.InputStreamReader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符.把字节流转换为字符流.字符流=字节流+编码表. 究竟什么时候采用字节流,什么时候采用字符流?能够用