zoukankan      html  css  js  c++  java
  • Python学习笔记第十九周

    目录:

      一、路由系统URL

        1、Django请求生命周期

        2、创建Django project

        3、配置

        4、编写程序

      二、视图

      三、模板

      四、ORM操作

      

    内容:

    一、URL

      1、Django请求生命周期

        URL对应关系(匹配)-> 视图函数 -> 返回用户字符串

         URL对应关系(匹配)    -> 视图函数 -> 打开一个HTML文件,读取内容

       2、创建Django project

       django-admin  startproject myproject

       cd  myproject

       python  manage.py  startapp  myapp

          

        myproject

         - myproject

           - 配置文件

           - url.py

           - settings.py

         - myapp

           - views.py

           - admin.py

           - models.py  #创建数据库表

      3、配置

         模板路径

        静态文件路径

        # CSRF

      4、编写程序

        a. url.py

          /index/   ->  func 

        b. views.py

          def func(request):

            #包含所有的请求数据

            return HttpResponse('字符串')

            return   render(request, 'index.html',{'dict':dict})

            return redirect(‘URL’)

        c.模板语言

          {%  for i in item%}

            <h1>{{  i }}</h1>

            {% endfor %}

          *************索引*************

          <h2>{{ item.0 }}</h2>

        d.后端获取前端的方法:

        1、普通方式:get

        2、特殊方式:input的type=checkbox方式(多选模式),需要使用getlist方法

        3、文件获取:input的type=file方式,默认使用get只能取得文件名,需要说明的是,上传文件是上传到request.FILES中,而request.POST.get只是从request.FILES中获取文件名,可以通过request.FILES.get()

        备注:

        在获取文件时,需要在对应的form表单中添加 <form action='/login/' method='POST' enctype='multipart/form-data'>  

        obj=request.FILES.get('file_name')

        obj.name # request.FILES.get('file_name')中包含很多参数,其中name表示获取文件名

        f = open(obj.name, mode='wb')#准备一个文件,将上传的文件写入

        for item in obj.chunks():#chunks表示文件一点一点上传到内存中,然后在通过内存写入

          f.write(item)

        f.close()

         

        5、FBV(function base  view)& CBV(class base view)

        url   --->  函数名   FBV

        url   --->  类         CBV

        建议:两者都用

        例子: 

    views.py文件
    
    from django.views import View
    
    class Home(View):
    
    
        #重新这个方法是为了实现类装饰器的作用,因为dispaths先于get和post执行的
        def dispath(self,request,*args,**kwargs):
            print('before)
            result = super(Home,self).dispath(request,*args,**kwargs)
            print('after')
            return  result  
    
        def get(self,request):
            print(request.method)
            return render(request,'home.html')
            
            
            
        def post(self,request):
            print(request.method)
            return render(request,'home.html')
            
            
    备注:
    查找(知道使用get还是post方法)操作是通过View类中的dispath方法中的getattr来反射的,dispath先于get和post方法执行        
    
    urls.py文件
    
    from app01 import views
    
    urlpatterns = [
    
        url(r'^home/',views.Home.as_view()),
    
    ]
    View Code

        

      4、模板语言第二波:

        字典的循环:

        user_dict = {

          'k1': 'v1',

          'k2':'v2',

          'k3':'v3',

        }

        {% for k,v in user_dict.items%} #items还可以换成keys和values,和items一样都是不带括号的

          {{k}}----{{v}}

         {% endfor %}    

      5、 动态URL

        urls.py文件中

        url(r'^detail-(d+).html', views.detail), #通过这种方式从url中可以取到后面的数字传递给函数中

        views.py文件中

        def detail(request,nid):

          return HttpResponse(nid)#可以获取并返回该值

      

        detail.html文件中

        <li><a target="_blank",href="/detail-{{ k }}.html">{{ row.name }}</a></li>

       

        URL路由系统总结:

        1、普通静态路由设置  

        url(r'^index/', views.index),

        2、动态的路由系统,可以对应一类路由,此类也可以对应多个,不过也需要严格匹配   

        url(r'^index-(d+).html', views.index),

        3、多条件匹配

        url(r'^index-(?P<uid>d+)-(?P<nid>d+).html', views.index),
        对应的函数也发生变化:
        def index(request,*args,**kwargs):
        对应第二种情况,会把全部变量放入列表中,对应第三种情况,会把变量都放入字典里

        
        4、name
       对URL路由关系进行命名,以后可以根据此名称生成自己想要URL
       
    urls.py文件:
        url(r'^abcdef//', views.index,name='i1'),
        url(r'^abcdef/(d+)/(d+)/', views.index,name='i2'),
        url(r'^abcdef/(?P<nid>d+)/(?P<uid>d+)/', views.index,name='i3'),
    
    模板语言中:
    <form action="{% url "i1"   %}" method="POST"> 
    <form action="{% url "i2"  参数 %}" method="POST">  #这个参数可以任意添加,这种方式可以指定提交后返回特定的页面,也就是参数对应的页面
    <form action="{% url "i3"  nid=1  uid=2 %}" method="POST">
    
    注:
    模板语言中:
    <form action="{{ request.path_info }}" method="POST">  #这个参数可以在提交后回到当前界面
    
    同时在views.py文件中:
    def index(request,*args,**kwargs):
        from django.urls import reverse    #专门做反转
        url1 = reverse('i1')
        url2 = reverse('i2' args=(1,2,))
        url3 = reverse('i3'   kwargs={'nid':1, 'uid':2})

      5、URL分级

    全局urls.py文件:
    from django.conf.urls import url
    from django.contrib import admin
    from django.conf.urls import include
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^cmdb/', include("app01.urls") ),
        url(r'^home/', include("app02.urls") ),
    ]
    
    app01的urls.py文件中
    from django.conf.urls import url
    from app01 import views
    urlpatterns = [
        url(r'^login/', views.login),
    
    ]
    
    app02的urls.py文件中
    from django.conf.urls import url
    from app02 import views
    urlpatterns = [
        url(r'^login/', views.login),
    
    ]

      

    四、ORM操作
      创建类
      1、根据类自动创建数据库表
      2、根据数据库表创建数据
      备注:
      由于python3.5以后不支持mysqldb,所以使用pymysql代替,需要在创建的project的同名文件夹里__init__.py文件中添加如下配置:
    1 import pymysql
    2 pymysql.install_as_MySQLdb()
    
    
      数据库操作步骤:
      1、 在创建的settings里添加如下配置:
    DATABASES = {
       'default': {
           'ENGINE': 'django.db.backends.mysql',
           'NAME': 's14day19',
           'USER': 'gavin',
           'PASSWORD': 'gavin',
           'HOST': '192.168.246.250',
           'PORT': '3306',
       }
        }
    View Code
    DATABASES = {
       'default': {
           'ENGINE': 'django.db.backends.mysql',
           'NAME': 's14day19',
           'USER': 'gavin',
           'PASSWORD': 'gavin',
           'HOST': '192.168.246.250',
           'PORT': '3306',
           'OPTIONS': {
                'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
           }
       }
        }
    View Code
       
    2、通过命令创建数据库
      
    create database s14day19 charset utf8;

       3、app的models配置里创建对应的类:

        

    from django.db import models
    
    # Create your models here.
    
    #app01的名字默认叫app01_userinfo
    
    class UserInfo(models.Model):
        #id列自增,主键
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=64)
    View Code

       4、产生临时log文件,并生成数据库

        a. python manage.py makemigrations (执行完毕后,会在app01的migration文件夹下发现多出来的log文件)

        b. python manage.py migrate

    
    

       5、ORM增删改查:

    def orm(request):
        #增加数据方式一:(推荐第一种方式)
        models.UserInfo.objects.create(
            username = 'root',
            password = '123',
        )
        #增加数据方式二
        obj = models.UserInfo(username='root1',password='123')
        obj.save()
        #增加数据方式三
        dic = {'username': 'root3','password':'123'}
        models.UserInfo.objects.create(**dic)
    
        #查询全体
        result = models.UserInfo.objects.all()
        #返回的QuerySet类型,django提供的,是一个列表
        for row in result:
            print(row.id,row.username,row.password)
        #查询单个
        result1 = models.UserInfo.objects.filter(username='root')
    
    
        #删除
        models.UserInfo.objects.filter(id=4).delete()
    
        #更新
        models.UserInfo.objects.all().update(password='666')
    
        return HttpResponse('orm')

       例子:登录对话框的认证

    def login(request):
        u = request.POST.get('user')
        p = request.POST.get('pwd')
        obj = models.UserInfo.objects.filter(username=u,password=p).first()
        #如果不加first,获取的值为一个列表,如果有first或者的值为一个类,后者在没有获取值的情况下返回的是None

        备注:

          对数据库新增column时如果默认情况下需要对新增column进行赋值

       创建超级管理员用户:

       python3 manage.py createsuperuser

      model创建类型:

      字段:

    AutoField(Field)
            - int自增列,必须填入参数 primary_key=True
    
        BigAutoField(AutoField)
            - bigint自增列,必须填入参数 primary_key=True
    
            注:当model中如果没有自增列,则自动会创建一个列名为id的列
            from django.db import models
    
            class UserInfo(models.Model):
                # 自动创建一个列名为id的且为自增的整数列
                username = models.CharField(max_length=32)
    
            class Group(models.Model):
                # 自定义自增列
                nid = models.AutoField(primary_key=True)
                name = models.CharField(max_length=32)
    
        SmallIntegerField(IntegerField):
            - 小整数 -32768 ~ 32767
    
        PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
            - 正小整数 0 ~ 32767
        IntegerField(Field)
            - 整数列(有符号的) -2147483648 ~ 2147483647
    
        PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
            - 正整数 0 ~ 2147483647
    
        BigIntegerField(IntegerField):
            - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
    
        自定义无符号整数字段
    
            class UnsignedIntegerField(models.IntegerField):
                def db_type(self, connection):
                    return 'integer UNSIGNED'
    
            PS: 返回值为字段在数据库中的属性,Django字段默认的值为:
                'AutoField': 'integer AUTO_INCREMENT',
                'BigAutoField': 'bigint AUTO_INCREMENT',
                'BinaryField': 'longblob',
                'BooleanField': 'bool',
                'CharField': 'varchar(%(max_length)s)',
                'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
                'DateField': 'date',
                'DateTimeField': 'datetime',
                'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
                'DurationField': 'bigint',
                'FileField': 'varchar(%(max_length)s)',
                'FilePathField': 'varchar(%(max_length)s)',
                'FloatField': 'double precision',
                'IntegerField': 'integer',
                'BigIntegerField': 'bigint',
                'IPAddressField': 'char(15)',
                'GenericIPAddressField': 'char(39)',
                'NullBooleanField': 'bool',
                'OneToOneField': 'integer',
                'PositiveIntegerField': 'integer UNSIGNED',
                'PositiveSmallIntegerField': 'smallint UNSIGNED',
                'SlugField': 'varchar(%(max_length)s)',
                'SmallIntegerField': 'smallint',
                'TextField': 'longtext',
                'TimeField': 'time',
                'UUIDField': 'char(32)',
    
        BooleanField(Field)
            - 布尔值类型
    
        NullBooleanField(Field):
            - 可以为空的布尔值
    
        CharField(Field)
            - 字符类型
            - 必须提供max_length参数, max_length表示字符长度
    
        TextField(Field)
            - 文本类型
    
        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格式的验证
    
        FilePathField(Field)
            - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
            - 参数:
                    path,                      文件夹路径
                    match=None,                正则匹配
                    recursive=False,           递归下面的文件夹
                    allow_files=True,          允许文件
                    allow_folders=False,       允许文件夹
    
        FileField(Field)
            - 字符串,路径保存在数据库,文件上传到指定目录
            - 参数:
                upload_to = ""      上传文件的保存路径
                storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
    
        ImageField(FileField)
            - 字符串,路径保存在数据库,文件上传到指定目录
            - 参数:
                upload_to = ""      上传文件的保存路径
                storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
                width_field=None,   上传图片的高度保存的数据库字段名(字符串)
                height_field=None   上传图片的宽度保存的数据库字段名(字符串)
    
        DateTimeField(DateField)
            - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
    
        DateField(DateTimeCheckMixin, Field)
            - 日期格式      YYYY-MM-DD
    
        TimeField(DateTimeCheckMixin, Field)
            - 时间格式      HH:MM[:ss[.uuuuuu]]
    
        DurationField(Field)
            - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
    
        FloatField(Field)
            - 浮点型
    
        DecimalField(Field)
            - 10进制小数
            - 参数:
                max_digits,小数总长度
                decimal_places,小数位长度
    
        BinaryField(Field)
            - 二进制类型
    
    字段
    View Code

        字符串类型

        数字

        时间

        二进制

        自增autoField(primary_key=True)

      字段的参数:

        null            字段是否可以为空

        default           默认值

        primary_key    主键

        db_column      类名

        db_index      是否是索引 db_index=True

        unique       unique=True 唯一索引

         unique_for_date   只对时间做索引

        unique_for_month

        unique_for_year

        auto_now      创建时自动生成,

        auto_now_add    更新时,自动更新为当前时间

        备注:auto_now     auto_now_add

          自动更新时一定要这种操作才会更新

          obj = UserGroup.objects.filter(id=1).first()

          obj.caption = 'CEO'

          obj.save()   

        verbose_name -> django admin显示字段中文
        editable -> django admin是否可以被编辑
        error_messages -> 错误信息欠
        help_text -> django admin提示
        validators -> django form ,自定义错误信息(欠)

    
    

        根据类对数据库表中的数据进行各种操作

        一对多:

          a. 外检
          b.
            外键字段_id
          c.
            models.tb.object.create(name='root', user_group_id=1)

          d.

            userlist = models.tb.object.all()
            for row in userlist:
              row.id
              row.user_group_id
              row.user_group.caption

      




  • 相关阅读:
    [CSP-S模拟测试]:赛(贪心+三分)
    [CSP-S模拟测试]:联(小清新线段树)
    [CSP-S模拟测试]:z(模拟+map+小根堆)
    赛瓦维斯特定理
    [CSP-S模拟测试]:y(DP+bitset)
    [CSP-S模拟测试]:x(数学+并查集)
    [杂题]:staGame(博弈论+Trie树+DFS)
    [杂题]:group(状压DP+轮廓线)
    [CSP-S模拟测试]:w(树上DP)
    BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】
  • 原文地址:https://www.cnblogs.com/xiaopi-python/p/7119032.html
Copyright © 2011-2022 走看看