zoukankan      html  css  js  c++  java
  • jango下一对一对应查询,django列类型,分页,CSR攻击

    一对一关系表查询

    以员工与薪水表为例,两张表是一对一的关系,外键关系要建在薪水表中,一对一使用:OneToOneField("") 括号内填入被关系表名。

            class UserInfo(models.Model):
                name = models.CharField(max_length=32)
                age = models.CharField(max_length=32)
                
            
            class Salary(models.Model):
                money = models.CharField(max_length=32)
                us = models.OneToOneField("UserInfo")
            

    正向查询:

    res = models.Salary.objects.filter(money="3000").first()
                print(res.us.name)

    反向查询:

    res = models.UserInfo.objects.filter(name='zekai').first()
                print(res.salary.money)

    django 列类型

    数据类型可以与MySQL做对比,有许多相似的类型:

        mysql                                     django
                                
                            tinyint                                         无
                            smallint(unsigned)        SmallIntegerField (PositiveSmallIntegerField)
                    数字    int (unsigned))             IntegerField   (PositiveIntegerField)
                            mediumint                                    无
                            bigint(unsigned)            BigIntegerField
                            
                            float                                  FloatField
                            decimal(5,2) : 200.23                  DecimalField
                            
                            
                            char                                     无
                    字符串    varchar                               CharFiled
                            text                                 TextField
                            
                            
                    时间     datetime (2019-7-17 12:23:34)    DateTimeField        
                             date      (2019-7-17)              DateField

    Django常见参数:

    - 参数:
                            max_length=32
                            null=True  : 可以设置为null
                            db_index=True : 设置索引
                            default : 设置默认值
                            unique : 设置唯一索引
                                
                            db_column: 设置一个列名
                            
                            unique_together: 联合唯一索引
                            index_together :普通联合索引
                                class Meta:
                                    unique_together = (
                                        ('money', 'us_id'),
                                        ....
                                    )
                                    index_together = (
                                        ('money', '')
                                        ....
                                    )
                

    Django admin 

    admin是Django自带的管理系统

    命令生成:

    python3 manage.py  createsuperuser

    如果想要关林自己生成的表:

        admin.py:
                from app01 import models
                admin.site.register(models.UserInfo)

    dango admin中的列类型:

    django-admin中的列类型:
                EmailField(CharField):
                    - 字符串类型,Django Admin以及ModelForm中提供验证机制
                IPAddressField(Field)
                    - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
                GenericIPAddressField(Field)
                    - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
                    - 参数:
                        protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
                        unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both"
                URLField(CharField)
                    - 字符串类型,Django Admin以及ModelForm中提供验证 URL
                SlugField(CharField)
                    - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
                CommaSeparatedIntegerField(CharField)
                    - 字符串类型,格式必须为逗号分割的数字
                UUIDField(Field)
                    - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
                FileField(Field)
        
            djagno-admin中的参数 :
                verbose_name        Admin中显示的字段名称        
        
                blank               Admin中是否允许用户输入为空
                editable            Admin中是否可以编辑
                help_text           Admin中该字段的提示信息
    
                choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                choices = (
                    (1, ''),
                    (2, '')
                )
                gender = models.IntegerField(choices=chocies)
                
                id name  gender (男女)
                

    分页

    分页是将从数据库中查找到的数据分批次展示给用户看,如过数据有成千上万条,不做分页处理的话,给用户的用户体验极差。

    分页与MySQL中的分页相似,开始位置为当前页数减去一在在乘单页展示的数据量。结束位置为当前页数乘单页展示量。

    子定制分页:

    1  导入我们 的mypage模块

    2 通过get方法得到当前页数,使用.count 方法得到表中的总数据量

    3  传入我们自己定制的类中,得到页数,和做展示的具体判断。

    4 调用类中的start和end方法对取出的数据进行切片

    5 将我们操作出来的数据传到前台进行模板渲染

    6 在前台写入 {{page.page_html|safe}}  page_html 是我们在类中条件满足后得到的html语句。

    操作案例:

    from xx import mypage
    current_page = request.GET.get('page')
            all_count = models.students.objects.count()
            page_obj = mypage.Pagination(current_page=current_page, all_count=all_count)
            page_list = models.students.objects.all()[page_obj.start:page_obj.end]
            classes = app01.classes.objects.all()
            return render(request, 'students.html', {'students':page_list,"page":page_obj,'classes':classes})

    CSRF攻击

    全称为跨站请求伪造

    CSRF攻击指的是 当我们在在同一浏览器中先是访问了授信网站,在没有退出的情况下,又访问了没有守信的网站,恰好被被某块内容或者图片吸引点了进去,这时候我们就有可能被黑客得到我们的个人登录信息,得到后就可以模拟我们对授信网站进行操作,如果之前我们访问的是银行网站,那完蛋了,你的钱就可能不见了。这样的网络攻击就被称为CSRF攻击。

    解决办法是,开启CSRF验证,在djngo中是通过settings中的'django.middleware.csrf.CsrfViewMiddleware'来控制的,开启的话只要将注释打开即可,当我们开启后有些功能不想被控制的话,加上一个装饰器就好了。

    在views视图中引入如下函数:

    from django.views.decorators.csrf import csrf_exempt
                        
                        @csrf_exempt
                        def csrf1(request):
                            if request.method == 'GET':
                                return render(request, 'csrf1.html')
                            else:
                                return HttpResponse('ok')

    在未开启的情况下我们如果想开启部分功能接收CSRF验证的话,在视图中导入一下函数

                    1. settings中,注释 ====》#'django.middleware.csrf.CsrfViewMiddleware',
                    2. views中,引入如下函数
                        from django.views.decorators.csrf import csrf_protect
                        
                        @csrf_protect
                        def csrf1(request):
                            if request.method == 'GET':
                                return render(request, 'csrf1.html')
                            else:
                                return HttpResponse('ok')

    如果视图中是cbv的话:

    from django.utils.decorators import method_decorator
                        @method_decorator(csrf_protect, name='get')
                        class User(View):
                            def get(self, request):
                                pass
                            def post(self, request):
                                pass

    在Ajax请求数据的话:

    ajax:
    csrftoken = $('input[name="csrfmiddlewaretoken"]').val()
    $.ajax({
    type:"POST",
    url : '/xxxx/',
    data: {"name":'xxxx'},
    headers : {'X-CSRFToken': token},
    success: function(){
    console.log(data)
    }
    })
  • 相关阅读:
    对象的引用
    查询各个商品分类中各有多少商品的SQL语句
    将TP引擎改为smarty引擎
    图片预加载
    js中接口的声明与实现
    判断对象是否是某个类的实例
    判断变量是否为json对象
    Python 爬取淘宝商品数据挖掘分析实战
    Python 爬取淘宝商品数据挖掘分析实战
    扫盲丨关于区块链你需要了解的所有概念
  • 原文地址:https://www.cnblogs.com/1624413646hxy/p/11209932.html
Copyright © 2011-2022 走看看