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

  




原文地址:https://www.cnblogs.com/xiaopi-python/p/7119032.html