首页 > 编程语言 >学习python-Day62

学习python-Day62

时间:2022-09-18 13:35:56浏览次数:89  
标签:code return img randint python random 学习 Day62 get

今日学习内容

具体项目:D:\pythonProject\django_day60

登录界面搭建

<div class="container-fluid">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <h1 class="text-center">用户登录</h1>
            <form id="id_form">
                {% csrf_token %}
                <div class="form-group">
                    <label for="id_username">用户名</label>
                    <input type="text" id="id_username" name="username" class="form-control">
                </div>

                <div class="form-group">
                    <label for="id_password">密码</label>
                    <input type="password" id="id_password" name="password" class="form-control">
                </div>

                <div class="form-group">
                    <label for="id_code">验证码</label>
                    <div class="row">
                        <div class="col-md-6">
                            <input type="text" id="id_code" name="code" class="form-control">
                        </div>

                        <div class="col-md-6">
                            <img src="/get_code/" id="id_img" alt="" width="285px" height="30px">
                        </div>
                    </div>
                </div>
                <div class="form-group text-center">
                    <div class="row">
                        <div style="position: relative"><input type="button" value="登录" class="btn btn-success" id="id_submit"></div>
                        <div style="margin: 20px -20px 0 0"> <span class="text-danger error"></span></div>

                    </div>

                </div>
            </form>
        </div>
    </div>

</div>

</body>

image

登录功能后端和前端

后端 views.py

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        # 前端输入的用户名,密码,验证码,校验用户名和密码
        res = {'code': 100, 'msg': '登录成功!'}
        # print(request.POST)
        code = request.POST.get('code')
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 获取后端的验证码 存于session中。
        old_code = request.session.get('code')
        if code.lower() == old_code.lower():
            user = authenticate(username=username, password=password)
            if user:
                # 登录成功,返回json格式字符串
                return JsonResponse(res)
            else:
                res['code'] = 101
                res['msg'] = '用户名或密码错误'
                return JsonResponse(res)
        else:
            res['code'] = 102
            res['msg'] = '验证码错误'
            return JsonResponse(res)
        
def get_rgb():
    return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))


def get_code(request):
    # 方式一,直接返回一张图片,启动文件路口是manage.py
    # with open('./media/avatar/my.png', 'rb') as f:
    #     data = f.read()
    #
    #     return HttpResponse(data)

    # 方式二:自己生成一张图片,返回,借助模块,pillow
    # 参数1:rgb:三原色   red green  blue
    # 参数2:宽度和高度
    # 参数3:三原色的色值  0-255
    # 创建图片
    # img = Image.new('RGB', (285, 30), (0, 255, 255))
    # #保存到本地
    # with open('my.png', 'wb') as f:
    #     img.save(f)
    # with open('./my.png', 'rb') as f:
    #     data = f.read()
    #     return HttpResponse(data)
    # 方式三:生成的图片写到内容中
    # 创建图片
    # img = Image.new('RGB', (285, 30), (0, 0, 0))
    # # 保存到内存
    # byte_io = BytesIO()
    # img.save(byte_io, 'png')  # 指定图片格式
    # # 从BytesIO取出二进制,返回给前端
    # return HttpResponse(byte_io.getvalue())
    # 方式四:在图片上写文字
    # 创建图片
    # img = Image.new('RGB', (285, 30), (0, 0, 0))
    # # 在图片上写文字,相当于画板
    # img_draw = ImageDraw.Draw(img)
    # img_draw.text((0, 0), "xzwyb")
    # # 保存到内存
    # bytes_io = BytesIO()
    # img.save(bytes_io, 'png')  # 指定图片格式
    # # 从BytesIO取出二进制,返回给前端
    # return HttpResponse(bytes_io.getvalue())
    # 方式五:图片上写文字,字体是指定的字体,指的颜色是随机
    # img = Image.new('RGB', (285, 30), (0, 0,0))
    # #创建一个字体对象
    # font = ImageFont.truetype('./static/font/font1.ttf', 30)
    # #在图片上写文字,相当于画板
    # img_draw = ImageDraw.Draw(img)
    # img_draw.text((0, 0), "xzwyb", font=font)
    # #保存到内存上
    # byte_io = BytesIO()
    # img.save(byte_io, 'png')  #指定图片格式
    # #从BytesIO取出二进制,返回给前端
    # return HttpResponse(byte_io.getvalue())
    # 方式六:终极方案自己造,验证码
    # img = Image.new('RGB', (285, 30), get_rgb())
    img = Image.new('RGB', (200, 30), (255, 255, 255))
    # 创建一个字体对象
    font = ImageFont.truetype('./static/font/font1.ttf', 20)
    # 在图片上写字
    img_draw = ImageDraw.Draw(img)
    # 在图片上写文字(数字,大写字母,小写字母组合  5个)
    code_str = ''
    for i in range(5):
        num = random.randint(0, 9)
        upper = chr(random.randint(65, 90))
        lowe = chr(random.randint(97, 122))
        ran = str(random.choice([num, upper, lowe]))
        code_str += ran  # python 是强类型语言,不同类型直接不能直接相加,需要类型转换

        img_draw.text((50 + i * 20, 10), ran, fill=get_rgb(), font=font)
    print(code_str)
    ################
    request.session['code'] = code_str  # 重点,存到session中,下次从session中取出来比较
    ################
    # #在图片上画点划线
    width = 285
    height = 30
    for i in range(10):
        x1 = random.randint(0, width)
        x2 = random.randint(0, width)
        y1 = random.randint(0, height)
        y2 = random.randint(0, height)
    # 画线
    img_draw.line((x1, y1, x2, y2), fill=get_rgb())

    for i in range(50):
        # 画点
        img_draw.point([random.randint(0, width), random.randint(0, height)], fill=get_rgb())
        x = random.randint(0, width)
        y = random.randint(0, height)
        # 画弧线
        img_draw.arc((x, y, x + 4, y + 4), 0, 90, fill=get_rgb())
    # 保存到内存
    bytes_io = BytesIO()
    img.save(bytes_io, 'png')
    # 从BytesIO取出二进制,返回给前端
    return HttpResponse(bytes_io.getvalue())

image

点击图片验证码更新以及验证码发送

<script>
    $("#id_img").click(function () {
        //图片的src地址变成原地址
        //alter($(this)[0].src)
        var timestamp = new Date().getTime()
        $(this)[0].src = '/get_code/?t=' + timestamp
    })
    $("#id_submit").click(function (){
        //取出填入的数据,发送ajax的post请求
        //$('#id_form').serializeArray()
        $.ajax({
            url:'/login/',
            type:'post',
            data: {
                "username": $('#id_username').val(),
                'password': $('#id_password').val(),
                'code': $('#id_code').val(),
                'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val(),
                //根据属性取标签
            },
            success:function (data){
                console.log(data)
                if(data.code == 100){
                    location.href='/index/'
                }else{
                    $('.error').html(data.msg)
                }
            }

        })
    })

</script>

image

首页导航和首页轮播图

image-20220913223143742

前端页面搭建

通过bootstrap中文网,来cope 修改代码。

轮播图 models.py
class Banner(models.Model):
    name = models.CharField(max_length=32)
    img = models.FileField(upload_to='banner', default='./media/banner/banner1.png')
    link = models.CharField(max_length=32)  # 点击轮播图跳转的地址

    class Meta:
        verbose_name_plural = '轮播图表'

    def __str__(self):
        try:
            return '图名: %s/跳转地址: %s' % (self.name, self.link)
        except:
            return '图名:%s' % (self.name)


页面文章列表页面

admin  后台录入数据,文章录入数据

admin  是django的一个app,它是后台管理,内置的,方便我们做第二次开发和录入数据。
	在app的admin.py 把表注册一下,登录到后台可以看到
        admin.site.register(UserInfo)
        admin.site.register(Article)
        admin.site.register(Blog)
        admin.site.register(Tag)
        admin.site.register(Category)
        admin.site.register(UpAndDown)
        admin.site.register(Comment)
        admin.site.register(Banner)
    直接录入数据,跟在数据表录入数据的本质一样的。

image

image

注意:需要在models.py中将表名变成中文展示在admin后台管理需要
    class Meta:
        verbose_name_plural = '用户表'  # 后台管理显示中文
 	打印的时候,方便查询
        def __str__(self):
        	return self.name

开启media访问

1.上传的图片,目前访问不到,要啊开启media的访问,才能看到图片。
2.开启media访问,本质就是把项目中某个目录可以让客户端(浏览器)直接访问。这是很危险的所以media下不能放重要的东西。
3.本身static 文件夹从浏览器可以访问,默认这个目录已经开放。
如果开启
	配置文件中:
    	MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    在路由中
    	path('media/<path:path>',serve, {'document_root':settings.MEDIA_ROOT}),
        

image

image

图片防盗链

有的网站有上传图片的功能,我们可以把图片上传上去,然后在自己的网站中使用,这样不会消耗我们自己网站的宽带,比如cnblogs,cnblogs就屏蔽了这种行为,这就是图片防盗链。

本质原理:
	因为发送http请求,请求头中有个参数叫referer,是个url地址,它表示上一次访问的地址。
    图片防盗链可以通过这个来控制,判断一下refeer是不是我们自己的地址,如果不是就不返回。
    通过请求头中得referer来控制不做非自己的地址请求。

标签:code,return,img,randint,python,random,学习,Day62,get
From: https://www.cnblogs.com/bjyxxc/p/16704658.html

相关文章

  • 经验分享:使用邮件触发流程,要避免“假死”这个坑!RPA学习天地
    在RPA场景中,有很多流程的自动化的触发是从读取邮件中相关内容进行触发。笔者所在的公司就有诸多类似的邮件触发场景!**注意:有的RPA流程设计需要通过发送固定邮件内容模板,......
  • Python函数-2
    一.导入$$f(x,y)=2x+3y$$上面括号里面的就是数学公式里的自变量,自变量就相当于函数里的参数。二.为什么要有参数如果一个大楼里有两种尺寸不一的窗户,显然在......
  • 修改-Python函数-2
    一.导入$$f(x,y)=2x+3y$$上面括号里面的就是数学公式里的自变量,自变量就相当于函数里的参数。二.为什么要有参数如果一个大楼里有两种尺寸不一的窗户,显然在......
  • 给大一新生的C语言学习经验分享
    学弟学妹们好!我是一名已经大四即将毕业的老学长,也是一名退役算法竞赛选手,使用C++/C语言也有三年的时间了。今天结合自己的学习历程给大家分享一下学习经验。一、享受氛围......
  • 【学习笔记】圆方树
    同学们都会树的定义了吧,那么接下来我们来学习圆方树吧圆方树基础理论圆方树,适用于仙人掌上问题,可将仙人掌转化为普通树。将仙人掌上的点双连通分量合成一个方点(tarjan),......
  • 信安系统学习笔记三
    第十章、sh编程一.知识点归纳(一)sh脚本-sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。shebang(#!)的一些具体用法:如果脚本文件中没有#!这一行,那......
  • 5.Maven学习
    尚硅谷-Maven教程笔记1.maven:(项目管理工具)构建管理工具,依赖管理工具第一章Maven概述第一节为什么要学习Maven?1.Maven作为依赖管理工具(1)jar包规模过大(2) jar包的来源......
  • 配置绿色免安装版的C/C++、java、python环境,重装系统可以继续使用
    windows系统用一段时间就会变得臃肿,我平均每年都会重装一下系统,因此需要配置免安装的环境,重装系统可以继续使用。 1、C/C++环境安装配置主流都是用minGwin的gcc/g++,最......
  • 【Python】初学者常犯错误
     CONTENT1语法类1.1忘记结束符号2变量类2.1全局变量忘记声明3习惯类 1语法类1.1忘记结束符号有些符号需要结束符号。比如:()、<>、''和""......
  • 20201320第三周学习笔记
    sh编程sh脚本sh脚本是一个包含sh语句的文本文件,命令行解释程序sh要执行该语句。创建mysh:1#!/bin/bash2#commentline3echohello 使用chmod-xm......