python搬砖狗

导航

 

一对一关系表查询

以员工与薪水表为例,两张表是一对一的关系,外键关系要建在薪水表中,一对一使用: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)
}
})

 

posted on 2019-07-18 20:55  python搬砖狗  阅读(263)  评论(0编辑  收藏  举报