zoukankan      html  css  js  c++  java
  • Django-笔记

    Django 框架

    1、软件框架:是由其中的各个软件模块组成的,每一个模块都有特定的功能
    2、MVC 框架:
    产生理念:分工,让专门的人去做专门的事
    核心思想:解耦
    M:Model 模型 和数据库进行交互
    V:View 视图 产生html 页面
    C:Controller 控制器,接受请求,进行处理,与 M 和 V 交互返回答应
    3、MVT
    M:Model 模型
    V: View 视图(和 MVC 中 c 相同,)
    T: Temlate 模板 (和MVC中V相同,产生html页面)

    快速开发 和DRF 原则
    4、虚拟环境
    虚拟环境是真是python 环境的复制环境
    创建虚拟环境命令(mkvirtualenv 虚拟环境名)
    创建python3 虚拟环境:mkvirtualenv -p python3 bj11_py3
    进入虚拟环境工作:workon 虚拟环境名
    查看机器上有多少个虚拟环境:workon 空格 + 两个tab键
    退出虚拟环境:deactivate
    删除虚拟环境:rmvirtualenv 虚拟环境名
    pip list(查看安装的包)
    pip install 包(==版本号)
    pip freeze
    5、项目创建
    1、安装django(用命令行添加)
    2、在D:pythonpython374Scripts 路径下的命令行 输入django-admin startproject test1
    3、目录就创建在D:pythonpython374Scripts

    目录包括:
    __init__.py:说明test1 是一个python包
    setting.py: 项目的配置文件
    urls.py: 进行url路由的配置
    wsgi.py:web 服务器和Django交互的入口
    manage.py: 项目的管理文件
    (在目录中使用命令行:python manage.py startapp booktest)
    Django 开发中一个模块一个应用

    __init__.py:说明目录是一个python 模块
    models.py: 写和数据库相关的内容
    views.py: 定义处理函数,视图函数
    tests.py: 写测试代码的文件
    admin.py: 网站的后台管理文件

    建立应用和项目之间的练习,需要对应用进行注册
    在test 文件下的settings.py 中 INSTALLED_APPS 列表后面添加
    'booktest', #进行应用的注册

    运行开发web服务器命令:
    python manage.py runserver(如果有报错请执行 python manage.py migrate)
    6、ORM
    O:Object 对象类
    R:Relations 关系、数据库中表
    M:Mapping: 映射

    ORM 另外一个作用:根据设计的类生成数据库中的表

    模型类生成表
    1) 生成迁移文件
    命令: python manage.py makemigrations
    2) 执行迁移生成表
    命令:python manage.py migrate

    3) 通过模型类操作数据表
    命令:python manage.py shell

    然后通过实例化操作数据
    from booktest.models import BookInfo
    b = BookInfo() # 实例化
    b.btitle = '天龙八部'
    from datetime import date
    b.bpub_date = date(1990,1,1)
    b.save() # 保存

    # 查询
    b2 = BookInfo.objects.get(ID=1)# 查找ID = 1的数据
    type(b2)
    b2.title # 查看列
    b2.bpub_date

    # 修改数据
    b2.bpub_date= date(1990,10,10)
    b2.save()

    #删除
    b2.delete()

    设置外键
    hbook = models.ForeignKey(to='BookInfo', on_delete=models.CASCADE)

    如何查看跟一本图书关联的
    b.heroinfo_set.all()#小写, 由一查多
    h.hbook #由多查一

    BookInfo.objects.all() # 查询图书表里面的所有内容

    后台管理
    1)本地化--语言和时区的本地化, 修改项目的settings.py
    age: LANGUAGE_CODE = 'en-us' -->LANGUAGE_CODE = 'zh-hans'
    TIME_ZONE = 'UTC' -->TIME_ZONE = 'Asia/Shanghai'
    2)创建管理员
    命令:python manage.py createsuperuser
    然后输入:
    用户名:fu
    电子邮箱:1024238316@qq.com
    密码:fu13460517032
    然后启动服务器(命令):python manage.py runserver
    3)注册模型类
    在应用下的admin.py 中注册模型类
    告诉Django 框架 根据注册的模型类来生成对应的表管理页面
    b = BookInfo()

    #修改显示的内容 在models下添加函数
    def __str__(self):
    # 返回书名
    return self.hname

    4、自定义管理页面(admin)
    自定义模型管理类:告诉Django 在生成的管理页面上显示那些内容

    --------上面是M------------
    --------下面是V------------
    视图:在Django 中,通过浏览器去请求一个页面时,使用视图函数来处理这个请求,
    视图函数处理之后,要给浏览器返回这个页面的内容

    视图函数的使用:
    1)定义视图函数:视图函数定义在view.py 中
    def index2(request):
    # 进行处理,和M 和T进行交互
    return HttpResponse('Hello, python!')
    视图函数必须有一个参数 ruquest, 进行处理之后,需要返回一个HttpResponse雷的对象,Hello, python!就是返回给显示器的内容
    2)进行url 配置
    urlpatterns = [url(r'^index$', views.index), # 建立/index 和视图之间的关系
    url(r'^index2$', views.index2),]
    一、所有的url配置项都定义在一个叫做urlpatterns的列表中
    二、每一个配置项都会调用url函数,第一个参数是正则表达式,第二个参数是对应的处理动作,可以写一个视图函数的名字
    三、和url字符串进行正则匹配,匹配成功则执行其后对应的处理动作
    四、工作对应的动作可以是一个视图函数的名字,也可以是包含一个应用的urls.py

    url 匹配过程
    在项目的url.py 文件中包含具体应用的urls.py 文件,应用的 url.py 文件中写url 和视图函数的对应关系

    模板
    模板:不仅仅是一个html 文件
    模板文件的使用
    1)创建模板文件夹(在根目录中创建 Directory 文件夹,命名为 templates)
    2)配置模板目录(在settings中TEMPLATES--> 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 设置目录)
    3)只用模板文件
    a) 加载模板文件
    去模板目录下面获取html文件的内容,得到一个模板对象
    b)定义模板上下文
    向模板文件传递数据
    c)模板渲染
    得到一个标准的html内容

    给模板文件传递数据
    模板变量使用:{{模板变量名}}
    模板代码段:{%代码段%}
    for 循环:
    {%for i in list%}
    <li>{{i}}</li>
    {% endfor %}

    模型M:
    1、Django ORM
    2、Django 数据库配置
    2.1 mysql 命令回顾
    登入mysql 数据库:mysql -uroot -p
    查看有哪些数据库:show databases
    创建数据库:create database test2 charset=utf8; # 切记:指定编码
    使用数据库:use test2;
    查看数据库中的表: show tables;
    2.2 Djanogo 配置使用 mysql 数据库
    修改 settings.py 中的DATABASES
    DATEBASES = {
    'default':{
    #'ENGINE': 'django.db.backends.sqlite3',
    'ENGINE': 'django.db.backends.mysql', #使用mysql 数据库
    #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    'NAME': 'test2', # 使用的数据库名字
    'USER': 'root', # mysql数据库的用户名
    'PASSWORD':'root', #数据库的登入密码
    'HOST':'localhost', '数据库所在主机'
    'PORT':3306, #数据库端口号
    }
    }
    # 在python3 中需要安装pymysql
    # 安装之后,需要在test2/__init__.py 中加如下内容:
    import pymysql
    pymysql.install_as_MySQLdb()
    # 模型 M
    # 1、 在Django的安装目录(D:pythonpython374Scripts)下打开命令行
    # 输入django-admin startproject test2 #test2为项目名
    # 2、在新建的test2 目录(D:pythonpython374Scripts est2)下打开命令行
    # 输入python manage.py startapp booktest #booktest 为应用
    # 3、用pycharm 打开我们新建的项目--> 在项目名中setting 添加注册应用 和修改数据库
    # INSTALLED_APPS 中添加 'booktest', #注册应用
    # DATABASES 中更改数据库如下:(默认为SQLite)
    # DATABASES = {
    # 'default': {
    # # 'ENGINE': 'django.db.backends.sqlite3',
    # 'ENGINE': 'django.db.backends.mysql',
    # #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # 'NAME': 'fu', # 使用数据库的名字
    # 'USER':'root', #链接mysql的用户名
    # 'PASSWOED':'', #用户对应的密码
    # 'HOST':'localhost', #指定mysql 数据库所在电脑IP
    # 'PORT':3306, # mysql 服务
    # }
    # }
    # 4、在test2中__init__.py 文件下添加
    # import pymysql
    # pymysql.install_as_MySQLdb()


    # 5、在模型 booktest->migrations->models.py 中声明类(如下):
    '''
    class BookInfo(models.Model):
    #图书模型类
    # 图书名称
    btitle = models.CharField(max_length=20)
    # 出版日期
    bpub_date = models.DateField()
    # 阅读量
    bread = models.BooleanField(default=False)
    # 评论量
    bcomment = models.IntegerField(default=0)
    # 删除标记
    isDelete = models.BooleanField(default=False)

    # 多类
    class HeroInfo(models.Model):
    #英雄人物模型
    # 英雄名
    hname = models.CharField(max_length=20)
    # 性别
    hgender = models.BooleanField(default=False)
    # 备注
    hcomment = models.CharField(max_length=200)
    # 关系属性
    hbook = models.ForeignKey('BookInfo')
    # 删除标记
    isDelete = models.BooleanField(default=False)
    '''
    # 注释 如果有报错 请把关系属性改为 hbook = models.ForeignKey(to='BookInfo', on_delete=models.CASCADE)

    # 6、 在命令行中执行
    # python manage.py makemigrations #生成迁移文件,在booktest->migrations 下方
    # python manage.py migrate #根据迁移文件生成迁移表,(在mysql 数据库对应的库中可以查看)
    '''
    可以在把下面的语句在数据库执行
    insert into booktest_bookinfo(btitle, bpub_date, bread, bcomment, isDelete)
    values('射雕英雄传', '1980-5-1', 12, 34, 0),
    ('天龙八部', '1986-7-24', 36, 40, 0),
    ('笑傲江湖', '1995-12-24', 20, 80, 0),
    ('雪山飞狐', '1987-11-11', 58, 24, 0);

    insert into booktest_heroinfo
    (hname, hgender, hbook_id, hcomment, isDelete)
    values('郭靖', 1,1,'降龙十八掌',0),
    ('黄蓉', 0,1,'打狗棍法', 0),
    ('黄药师', 1,1,'弹指神通', 0),
    ('欧阳锋', 1,1,'蛤蟆功', 0),
    ('梅超风', 0,1,'九阴白骨抓', 0),
    ('乔峰', 1,2,'降龙十八掌', 0),
    ('段誉', 1,2,'六脉神剑', 0),
    ('虚竹', 1,2,'天山六阳掌', 0),
    ('王语嫣', 0,2,'神仙姐姐', 0),
    ('令狐冲', 1, 3,'独孤九剑', 0),
    ('任盈盈', 0, 3,'弹琴', 0),
    ('岳不群', 1, 3,'华山剑法', 0),
    ('东方不败', 0, 3,'葵花宝典', 0),
    ('胡斐', 1, 4,'花胡家刀', 0),
    ('苗诺兰', 0, 4,'黄衣', 0),
    ('程灵素', 0, 4,'医术', 0),
    ('袁紫衣', 0, 4,'六合拳', 0);
    '''


    # 7、添加模板,在test2下添加templates 文件夹,并且在tests2中settings 中TEMPLATES中
    # 修改:'DIRS': [os.path.join(BASE_DIR, 'templates')],
    # 为了方便管理在templates下再新建一个模块booktest里面放置html模板


    # 8、在booktest->views 中定义一个视图
    def index(request):
    '''显示图书信息'''
    # 1、查看所有的图书信息
    books = BookInfo.objects.all()
    # 2、使用模板
    return render(request, 'booktest/index.html', {'books': books})


    # 9、配置url
    # 在test2 中添加
    # url(r'^', include('booktest.url')) # 包含booktest的应用文件
    # 10、在booktest中新建url.py
    # from django.conf.urls import url
    # from booktest import views
    # urlpatterns = [
    # url(r'^index$', views.index), # 包含booktest的应用文件
    # ]


    # 运行时报错,版本不一样,找到Django (D:pythonpython374Libdjangodbackendsmysql)中的base.py
    # 修改为
    if version < (1, 3, 3):
    raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

    # 继续改为operations.py中的
    # if query is not None:
    # query = query.encode(errors='replace')
    # return query
    # 如果还是报错,看看报错的位置的进行修改(我的第二次报错位置为 D:pythonpython374Libdjangodbackendsmysql)
    '''
    # 字段属性和选项
    模型类属性命名限制:
    1)不能是python 的保留关键字
    2)不允许使用连续的下划线
    3)定义属性时需要制定字段类型,通过字段类型的参数制定选项(属性名=models.字段类型(选项))
    字段类型(使用时需要引用django.db.models)
    1)AutoField: 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
    2)BooleanField: 布尔字段,值为True 或False
    3)NullBooleanField: 支持Null、True、False 三种值
    4)CharField(max_length=最大长度):字符串,参数max_length 表示最大字符个数
    5)TextFiled:大文本字符串,一般超过4000个字符使用
    6)IntegerField:整数
    7)DecimalField(max_digits=None,decimal_places=None):十进制浮点数(max_digits表示总位数,decimal_places表示小数位)
    8)FloatField:浮点数,同上(上面更加精确)
    9)DateField([auto_now=False, auto_now_add=False]):日期
    auto_now:更新属性的时间
    auto_now_add:自动设置创建时间
    上面两个只能同时用一个
    10)TimeField:时间,参数同上
    11)DateTimeField:日期时间,参数同DateField
    12)FileField:上传文件字段
    13)ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片

    选项:
    1)default:默认值,设置默认值
    2)primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
    3)unique:若为True,这个字段在表中必须有名唯一,默认值是False
    4)db_index:若为True,则在表中会为此字段创建索引,默认值是False
    5)db_column:字段的名称,如果没有指定,则使用属性的名称
    6)null:如果为True,表示允许为空,默认值是False
    7)blank:如果为True,则该字段允许为空白,默认值是False
    注释:null 是数据库范畴的概念,blank 是后台管理页面表单验证范畴的
    https://docs.djangoproject.com/zh-hans/2.1/

    5.查询
    配置mysql,让其产生日志文件(未能实现)
    1、使用下面的命令打开mysql的配置文件,去除68、69行注释,然后保存
    sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
    2、重启mysql 服务,就产生mysql 日志文件
    sudo service mysql restart
    3、打开MySQL 的日志文件
    /var/log/mysql/mysql.log 是mysql 日志文件所在的位置

    查询函数(通过模型类.objects属性)
    函数名 功能 返回值 说明
    get:返回表中满足条件的一条只能是一条数据 返回值是一个模型类的对象 查到多条数据会抛出异常MultipeObjectsReturned
    查不到数据会抛出异常DoesNotExit
    all:返回模型类中对应表格的所有数据 返回值是QuerySet 查询集
    filter:返回满足条件的数据 返回值是QuerySet 参数写查询条件
    exclude:返回不满足条件的数据 返回值是QuerySet 参数写查询条件
    order_by:用于查询排序 返回值是QuerySet 参数中是根据那些字段进行排序
    # .all().order_by('id') # 升序
    # .all().order_by('-id') #降序
    filter 方法:
    a) 判等 条件名:exact(可以省略)
    BookInfo.objects.filter(id__exact=1)
    b) 模糊查询 (包含 contains、结尾 endwith、开头 startwith)
    c) 空查询 isnull (字段名__isnull=False)
    d) 范围查询 in (字段名__in = (1,3,5))# 元组列表都可以
    e) 比较查询 gt(greate than) 大于 lt(less than) #(id__gt=3) 大于三
    gte(equal) 大于等于 lte()
    f) 日期查询 年 (字段名__year=1980)月month 日day

    6、F对象
    作用:用类属性之间的比较,
    from django.db.models import F
    BookInfo.objects.filter(bread__gt=F('comment') * 2)
    7、Q对象
    作用:用于查询时,条件之间的逻辑关系, not and or 可以对Q对象进行&|~
    from django.db.models import Q
    BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))

    8、集合函数
    作用:用于查询结果进行集合操作 sum count avg max min
    aggregate:调用这个函数来使用聚合(返回一个字典)
    from django.db.models import Sum、Count、Avg、Max、Min
    # BookInfo.objects.all().aggregate(Count('id')) #返回的结果{'id__count':5}
    # BookInfo.objects.count() 和上面的代码结果一样,返回一个整数

    9、查询集
    返回集.exists() #查看返回集有没有数据

    10、模型类关系
    1)一对多 models.ForeignKey() #定义在多类
    2)多对多 models.ManyToManyField() #定义在哪个类中都可以
    3)一对一 models.OneToOneFile()定义在哪个类中都可以

    11、关联查询(一对多)
    由一查多
    b=BookInfo.objects.get(id=1)
    b.heroinfo_set.all()
    例如:查询图书信息,要求图书关联的英雄的描述包含‘八’
    BookInfo.object.filter(heroinfo__hcomment__contains='八')
    由多查一
    查看书名为'天龙八部的所有英雄'
    HeroInfo.objects.filter(hbook__btitle='天龙八部')# hbook为外面的名字

    通过模型类实现关联查询时,需查哪个表中的数据,就需要通过哪个类查询

    写关联查询条件的时候,如果类中没有关系属性,条件需要对应类的名
    如果类中有关系属性,直接写关系属性

    12、插入、更新和删除
    通过调用一个模型类对象的save方法的时候就可以实现对模型类对用数据表的插入和更新
    通过调用一个模型类对象的delete 方法的时候就可以实现对模型类对用数据表的删除

    13、自关联:一种特殊的一对多关系

    14、管理类
    BookInfo.objects.all()-->
    objects 是Django 帮我自动生成的管理器对象,通过这个管理器对象可以实现对数据的查询

    objects 是 models.Manager 类的一个对象,自己一旦定义了,Django就不在提供了

    15、元选项
    在定义表中添加
    class Meta:
    db_table = 'bookinfo'
    作用:生成自己想要对用的表名

    =======视图=============
    1、视图的功能
    接受请求,进行处理,与M和 T进行交互,返回应答
    返回html 内容HttpResponse,也可能重定向redirect
    2、视图函数使用
    2.1 使用
    1)定义视图函数
    request 参数必须有,是一个HttpRequest 类对象,可以改但是不要改
    2)配置url
    建立url 和视图函数之间的对应关系
    2.2 url配置过程
    1)在项目的urls 文件中添加具体的urls文件,再具体应用的urls文件中包含具体的url和视图的对应关系
    2)url 配置项是定义在一个名叫urlpatterns 的列表中,其中每一个元素就是一个配置项,每一个配置项都调用url函数
    3、匹配过程
    4、错误视图
    404:找不到页面,默认会显示一个错误的标准页面,如果要自定义页面,在templates 目录下自定义一个404.html
    a)url 没有配置
    b)url 配置错误
    500:视图出错
    网站开发完成需要关闭调试模式,在settings.py 文件中:
    DEBUG = False
    ALLOWED_HOSTS = [*]
    5、捕获url 参数
    进行url 匹配时,把所需要的捕获的部分设置成一个正则表达式组,这样
    Django框架就会自动把匹配成功后相应组的内容作为参数传递给视图函数
    1)位置参数 # url(r'^showarg(d+)$', views.show_arg)
    参数名可以随意制定
    2)关键字参数 # url(r'^showarg(?P<num>d+)$', views.show_arg)
    参数名必须和正则表达式中的一样
    6、普通登入案例
    request 是HttpRequest 类型的对象
    request 包含浏览器请求的信息

    在请求的html 中
    <form method="post" action="login_check">
    用户名:<input type="text" name="username" /> <br/>
    密码:<input type="password" name = 'password' /><br />
    <input type="submit" value="登入" />
    </form>

    给出接受的login_check视图
    def login_check(request):
    #登入校验视图
    # request.POST 保存的是post方式提交的参数
    # request.GET 保存的是get方式提交的参数
    # 1、 获取提交的用户名和密码
    username = request.POST.get('username')
    password = request.POST.get('password')
    print(username)
    print(password)
    # 2、 进行登入校验
    if username == 'smart' and password == '123':
    # 用户名密码正确
    return redirect('/index')
    else:
    return redirect('/login')

    并且配置url


    7、ajax
    新建static 文件,并且再新建js、css、images文件

    ajax:异步的javascript
    在不加载页面的情况下,对页面进行局部刷新
    $.ajax({
    'url':请求地址,
    'type':请求方式,
    'dataType':预期返回的数据格式,
    'data':参数,
    'async':false, //同步的设置,按照代码的顺序执行,默认异步不会等待服务器的返回结果继续执行代码
    }).success(function(data){
    //回调函数
    })

    示例:
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>ajax</title>
    <script src="/static/js/jquery-1.12.4.min.js"></script>
    <script>
    $(function () {
    // 绑定 btnAjax的click 事件
    $('#btnAjax').click(function () {
    $.ajax({
    'url':'/ajax_handle',
    'dataType': 'json'
    }).success(function (data) {
    //进行处理
    // alert(data.res)
    if (data.res == 1){
    $('#message').show().html('提示信息')
    }
    })

    })
    })
    </script>
    <style>
    #message{
    display: none;
    color: red;
    }
    </style>
    </head>
    <body>
    <input type="button" id="btnAjax" value="ajax请求">
    <div id="message"></div>
    </body>
    </html>

    定义ajax_handle视图,并且配置url
    示例如下:
    def ajax_handle(request):
    # 返回ajax处理
    # 返回json 数据
    return JsonResponse({'res':1})

    8、cookie 和 session

    1)以键值对的格式写session
    request.session['键'] = 值
    2)根据键读取值
    request.session.get('键', 默认值)
    3)清楚所有session,在储存中删除值部分
    request.session.clear()
    4)清除session 数据,在储存中删除session的整条数据
    request.session.flush()
    5)删除session中的指定键及值,在储存中只删除摸个键及对应的值
    del request.session['键']
    6) 设置会话的超时时间,如果没有指定过期时间则两个星期后过期
    request.session.set_expiry(value)

    8.3 cookie和session的应用场景
    cookie:记住用户名。安全性要求不高。
    session:涉及到安全性要求比较高的数据。银行卡账户,密码

    '''
    '''
    模板文件的使用
    1、新建Django
    1.1 使用pycharm--> File --> New Project --> Django -->选择:Location 和Application name 填写
    1.2 设置数据库 和 __init__.py

    2、在 template 中新建booktest 文件,在其中添加index.html
    3、定义视图、配置url
    '''


  • 相关阅读:
    同余方程
    倒酒
    机器翻译
    vue 锚点定位
    解决vuex刷新页面数据丢失
    h5 input失去焦点软键盘把页面顶起
    js 监听ios手机键盘弹起和收起的事件
    js 将数组中的每一项安装奇偶重新组合成一个数组对象
    moment.js获取本周本月本年的开始日期和结束日期
    vue 所有的路由跳转加一个统一参数
  • 原文地址:https://www.cnblogs.com/fuyouqiang/p/11844583.html
Copyright © 2011-2022 走看看