zoukankan      html  css  js  c++  java
  • day-68BBS

    前端image标签的src属性可以接收三种类型的值
        1.图片绝对路径
        2.图片的二进制数据
        3.url(自动超当前url发get请求)

    图片防盗链
        为了防止其他网站盗用本网站资源 ,当请求是从其他网站来的话 我就直接拒绝
        只有当请求是从我自己的网站发出的时候 我才正常响应

        refer:用来表示你上一次所在的路径

        UserAgent:表示你是否是个浏览器

    django admin后台管理(补充):    

      帮你自动生成注册了的模型表起码增删改查四个页面
        1.应用下对应的admin.py注册模型表
          admin.site.register(models.UserInfo)
        2.创建超级用户
          createsuperuser
        3.models.py参数配置


          class Meta:
            verbose_name_plural = '表名'

          def __str__(self):
            return self.name

          blank = True 仅仅是告诉django该字段可以为空

    media配置(暴露后端任意文件)
      网站用到的静态资源默认放到static文件夹下
      用户上传的静态资源默认放到任意名称的文件夹下(media)
      1.settings.py
        MEDIA_ROOT = os.path.join(BASE_DIR,'media')
      2.手动开辟url
        from django.view.staic import serve
        from BBS import settings
        url(r'^media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT})

    注:HTTPResponse返回的数据是没有做任何的处理

    views

    from PIL import Image,ImageDraw,ImageFont
    from io import BytesIO
    import random
    # BytesIO 内存管理器 以二进制的形式帮你存储数据
    # Image自动生成图片
    # ImageDraw画笔对象
    # ImageFont字体
    
    def get_random():
        return random.randint(0,255),random.randint(0,255),random.randint(0,255)
    
    def get_code(request):
       
        img_obj = Image.new('RGB',(260,35),get_random())                     # 第三个参数既可以放颜色英文 也可以放rgb参数
        img_draw = ImageDraw.Draw(img_obj)                                   # 在当前图片上生成一个画笔
        img_font = ImageFont.truetype('static/font/222.ttf',30)              #选择字体和字体大小
    
     
        code = ''
        for i in range(5):                                                  #A-Z:65-90  a-z:97-122
            upper_str = chr(random.randint(65,90))
            lower_str = chr(random.randint(97,122))
            random_int = str(random.randint(0,9))
            
            res = random.choice([upper_str,lower_str,random_int])            # 从上面三个里面随机选择一个
            img_draw.text((40 + i * 40, -5), res, get_random(), img_font)    #验证数字、颜色、字体样式
            code += res 
      
    
        io_obj = BytesIO()                                                   # BytesIO:内存管理器 以二进制的形式帮你存储数据
        img_obj.save(io_obj,'png')                                          
       
        request.session['code'] = code                                       # 找一个公共的地方 存储验证码 以便后续其他视图函数 校验
       
        return HttpResponse(io_obj.getvalue())                               # 将写好字的图片返回出来
    def login(request):
        back_dic = {'code':None,'msg':''}
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            code = request.POST.get('code')
            
            if request.session.get('code').upper() == code.upper():                         # 验证码忽略大小写进行比较
                user_obj = auth.authenticate(username=username,password=password)           # 类似于models.Userinfo.objects.filter(username=username,password=password).first()
              
                if user_obj:
                    auth.login(request,user_obj)  
                  
                    back_dic['code'] = 100
                    back_dic['msg'] = '登陆成功'
                    back_dic['url'] = '/home/'
                else:
                    back_dic['code'] = 200
                    back_dic['msg'] = '用户名或密码错误'
            else:
                back_dic['code'] = 300
                back_dic['msg'] = '验证码错误'
            return JsonResponse(back_dic)
        return render(request,'login.html')

    HTML

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link rel="stylesheet" href="/static/bs-3.3.7/css/bootstrap.css">
        <script src="/static/bs-3.3.7/js/bootstrap.min.js"></script>
    </head>
    <body>
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <h1 class="text-center">登陆</h1>
                <hr>
                <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" name="code" id="id_code" class="form-control">
                        </div>
                        <div class="col-md-6">
                            <img src="/get_code/" alt="" width="260" height="35" id="id_img">            #访问Django的路由并接受返回值
                        </div>
                    </div>
                </div>
                <input type="button" class="btn btn-info" value="登陆" id="id_submit">
                <span style="color: red" id="id_error"></span>
            </div>
        </div>
    </div>
    <script>
        $('#id_img').click(function () {
           
            var oldPath = $(this).attr('src');
            $(this).attr('src',oldPath += '?')             // 基于上一次src属性值 再加一个?号,局部刷新验证码
          
        });
        $('#id_submit').click(function () {
            $.ajax({
                url:'',
                type:'post',
                data:{
                    'username':$('#id_username').val(),
                    'password':$('#id_password').val(),
                    'code':$('#id_code').val(),
                    'csrfmiddlewaretoken':'{{ csrf_token }}'
                },
                success:function (data) {
                    if (data.code == 100){
                        location.href = data.url
                    }else{
                        $('#id_error').html(data.msg)
                    }
                }
            })
        })
    </script>
    </body>
    </html>
  • 相关阅读:
    Redis 客户端
    Redis 数据库
    Redis 对象
    Redis 跳跃表
    Redis 字典
    Redis 链表实现
    Redis 事务
    winform,自定义文本框控件 实现文本框验证加水印功能
    WinForm中,每隔一段时间(参数)调用一次函数(使用定时器)
    GMap.Net 实现离线地图
  • 原文地址:https://www.cnblogs.com/klw1/p/11241793.html
Copyright © 2011-2022 走看看