开源web框架django知识总结(三)

开源web框架django知识总结(三)

最近有点忙没来得急更新,不好意思啊,码农的悲哀。。。

一、静态文件

什么是静态文件?如:图片,css,js,音频,视频等

静态文件配置:settings.py中

1、配置静态文件的访问路径【该配置默认存在】

​ 通过哪个url地址找静态文件: STATIC_URL = ‘/static/’

​ 说明:指定访问静态文件时是需要通过/static/xxx或http://192.168.42.128:8000/static/xxx 【xxx表示具体的静态资源位置】

2、配置静态文件的存储路径STATICFILES_DIRS

STATICFILES_DIRS保存的是静态文件在服务器端存储位置

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]#逗号不能省略

3、在Django项目中创建静态文件夹static,模板文件夹templates,准备静态文件
在这里插入图片描述
test_static.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试静态文件</title>
</head>
<body>

<img src="http://192.168.42.128/static/image/adv01.jpg" width="200px" height="200px">

<img src="/static/image/adv01.jpg" width="200px" height="200px">

{% load static %}
<img src="{% static 'image/adv01.jpg' %}" width="200px" height="200px">
<br>
<audio src="/static/music/1.wav" controls="controls">第1章冰山美人</audio>
<br>
<video width="320" height="240"  src="/static/media/写真-净土 - 雷婷.mp4"  controls>
</video>

</body>
</html>

views.py

#day03
from django.shortcuts import render
def test_static(request):

    return render(request, 'test_static.html')

urls.py

#day03
path('test_static', views.test_static),

将课件中static中的内容,拷贝到项目中
模板中访问静态文件–img标签为例:

通过{% static %}标签访问静态文件:

​ 。加载 static – {% load static %}

​ 。使用静态资源 – {% static ‘静态资源路径’ %}

​ 。样例: <img src = “{% static ‘images/lena.jpg’ %}”

​ 。优点:动态加载,路径改变后,不会影响加载。例如: STATIC_URL = '/static/'改成 STATIC_URL = ‘/statics/’

二、Django应用以及分布式路由

什么是应用?应用,在Django项目中是一个独立的业务模块,可以包含自己的路由、视图、模板、模型

在这里插入图片描述
创建应用:

步骤1:用manage.py 中的子命令startapp创建应用文件夹

python3 manage.py startapp music

步骤2:下载同步,新建urls.py文件

步骤3:在settings.py的INSTALLED_APPS列表中配置安装此应用

settings.py配置样例:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'music',
    'news',
    'bookstore'
]

认识新建应用每个文件功能:

在这里插入图片描述
分布式路由:Django中,主路由配置文件(urls.py)可以不处理用户具体路由,主路由配置文件只做请求的分发(分布式请求处理)。具体的请求,可以由各自的应用来进行处理

在这里插入图片描述
步骤4:配置分布式路由:

1、主路由中调用include函数

语法:include(‘app名字.url模块名’)

作用:用于将当前路由转到各个应用的路由配置文件的urlpatterns,进行分布式处理

以http://192.168.42.128:8000/music/index为例:

from django.contrib import admin
from django.urls import path, include
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test_static', views.test_static),
    #http://192.168.42.128:8000/music/index
    path('music/', include('music.urls')),
    #http://192.168.42.128:8000/news/index
    path('news/', include('news.urls'))
]

2、应用下配置urls.py(参照步骤2,需要自己手动创建,内容结构同主路由完全一样)

from django.urls import path
from . import views

urlpatterns = [
    #http://192.168.42.128:8000/music/index
    path('index', views.index_view)
]

music下的views.py

from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
def index_view(request):

    return HttpResponse('这是音乐频道首页')

在这里插入图片描述
应用下的模板

应用内部可以配置模板目录

1、应用下手动创建templates文件夹

2、settings.py中开启应用模板功能。TEMPLATE配置中的’APP_DIRS’值为True即可,应用下的templates和外层templates都存在时,django得查找模板规则

。优先查找外层templates目录下得模板

。按INSTALLED_APPS配置下的应用顺序逐层查找

三、模型层及ORM介绍

模型层作用:负责跟数据库之间进行通信

Django配置mysql

安装mysqlclient(安装前,需确认是否已安装python3-dev和default-libmysqlclient-dev)

sudo apt list --installed|grep -E 'libmysqlclient-dev|python3-dev'
#若命令无输出则需要安装
sudo apt-get install python3-dev default-libmysqlclient-dev
pip install mysqlclient -i https://pypi.doubanio.com/simple

创建数据库,进入mysql数据库执行

create database 数据库名 default charset utf8;
# 通常数据库名跟项目名保持一致

创建用户

# 新建        用户                        密码 
create user suifeng001 identified by '123456';
# 赋予“suifeng001”“某库”的所有权限    库   后面是账号
grant all on df12.* to 'suifeng001'@'%'; 
#立即生效
FLUSH PRIVILEGES;

pycharm远程连接mysql设置。

settings.py里进行数据库得配置:修改DATABASES配置项的内容,由sqlite3改为mysql

DATABASES = {
    
    
    'default': {
    
    
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'df12',
        'USER': 'suifeng001',
        'PASSWORD': '123456',
        'HOST': '192.168.42.128',
        'PORT': '3306'
    }
}

使用navicat远程连接mysql出现错误提示:
在这里插入图片描述

修改mysql设置文件mysqld.cnf:

(py3env) pyvip@VIP:~$ cd /etc/mysql
(py3env) pyvip@VIP:/etc/mysql$ ls
conf.d  debian.cnf  debian-start  my.cnf  my.cnf.fallback  mysql.cnf  mysql.conf.d
(py3env) pyvip@VIP:/etc/mysql$ cd mysql.conf.d
(py3env) pyvip@VIP:/etc/mysql/mysql.conf.d$ ls
mysqld.cnf  mysqld_safe_syslog.cnf
(py3env) pyvip@VIP:/etc/mysql/mysql.conf.d$ sudo vim mysqld.cnf

修改内容:
在这里插入图片描述
重启mysql服务

(py3env) pyvip@VIP:/etc/mysql/mysql.conf.d$ sudo service mysql restart

什么是模型?模型是一个python类,它是由django.db.models.Model派生出来的子类

一个模型类代表数据库中的一张数据表。

模型类中每一个类属性都代表数据库中的一个字段。

模型是数据交互的接口,是表示和操作数据库的方法和方式。

ORM框架

定义:ORM(Object Relational Mapping)即对象关系映射,它是一种程序技术,它允许你使用类和对象,对数据库进行操作,从而避免通过SQL语句操作数据库

作用:1、建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库。

​ 2、根据涉及的模型类生成数据库中的表格。

​ 3、通过简单的配置就可以进行数据库的切换。

优点:只需要面向对象编程,不需要面向数据库编写代码。

​ 。对数据库的操作都转换成对类属性和方法的操作。

​ 。不用编写各种数据库的sql语句

实现了数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异

​ 。不再关注用的是mysql、oracle…等数据库的内部细节

​ 。通过简单的配置就可以更轻松更换数据库,而不需要修改代码

缺点:对于复杂业务,使用成本较高

​ 根据对象的操作转换成sql语句,根据查询的结果转换成对象,在映射过程中有性能损失
在这里插入图片描述
模型示例:

添加一个bookstore_book数据表来存放图书馆中书目信息

1、添加一个bookstore的app

python3 manage.py startapp bookstore

2、添加模型类并注册app

模型类代码示例:

写在bookstore/models.py中

from django.db import models

# Create your models here.
class Book(models.Model):

    title = models.CharField('书名', max_length=50, default='',unique=True)
    pub = models.CharField('出版社', max_length=100, default='')
    price = models.DecimalField('价格', max_digits=7, decimal_places=2)
    market_price = models.DecimalField('零售价', max_digits=7, decimal_places=2, default=0.0)

    class Meta:
        db_table = 'book'

3、数据库迁移

迁移是Django同步您对模型所做更改(添加字段、删除模型类等)到您的数据库模式的方法。

​ 。生成迁移文件 执行:python3 manage.py makemigrations 将应用下的models.py文件生成一个中间文件,并保存在migrations文件夹中

​ 。执行迁移脚本程序 执行:python3 manage.py migrate 执行迁移程序实现迁移。将每个应用下的migrations目录中的中间文件同步到数据库

模型类 创建

from django.db import models
class 模型类名(models.Model):
	字段名 = models.字段类型(字段选项)

四、ORM基础字段及选项
在这里插入图片描述
字段类型:

BooleanField():

​ 数据库类型:tinyint(1),编程语言中,使用True或False来表示值;在数据库中:使用1或0来表示具体值

CharField():

​ 数据类型:varchar;注意:必须要指定max_length参数值

DateField():

​ 数据库类型:date 作用:表示日期

​ 参数:1、auto_now:每次保存对象时,自动设置该字段为当前时间(取值:True/False)。

​ 2、auto_now_add:当对象第一次被创建时,自动设置当前时间(取值:True/False)。

​ 3、default:设置当前时间(取值:字符串格式时间如:‘2019-6-1’)。

​ 以上三个参数只能多选一

DateTimeField():

​ 数据库类型:datetime(6) 作用:表示日期和时间 参数:同DateField

FloatField():

​ 数据库类型:double 编程语言中和数据库中都使用小数表示值

DecimalField():

​ 数据库类型:decimal(x,y) 编程语言中:使用小数表示该列的值 在数据库中:使用小数

​ 参数:max_digits:位数总数,包括小数点后的位数。该值必须大于等于decimal_places(小数点后的数字数量)。

EmailField():

​ 数据库类型:varchar 编程语言和数据库使用字符串

IntegerField():

​ 数据库类型:int 编程语言和数据库中使用整数

ImageField():

​ 数据库类型:varchar(100) 作用:在数据库中为了保存图片的路径 编程语言和数据库中使用字符串

TextField():

​ 数据库类型:longtext 作用:表示不定长的字符数据

创建模型类课堂练习:
在这里插入图片描述

class Author(models.Model):

    name = models.CharField('姓名', max_length=11)
    age = models.IntegerField('年龄', default=1)
    email = models.EmailField('邮箱', null=True)

    class Meta:
        db_table = 'author'

模型类–字段选项

​ 字段选项,指定创建的列的额外的信息,允许出现多个字段选项,多个字段选项之间使用‘,’号隔开

primary_key:如果设置为True,表示该列为主键,如果指定一个字段为主键,则此数据库表不会创建id字段。

blank:设置为True时,字段可以为空。设置为False时,字段时必须填写的

null:如果设置为True,表示该列值允许为空。默认为False,如果此项为False,建议加入default选项来设置默认值。

default:设置所在列的默认值,如果字段选项null=False建议添加此项

db_index:如果设置为True,表示为该列增加索引

unique:如果设置为True,表示该字段在数据库中的值必须时唯一(不能重复出现)

db_column:指定列的名称,如果不指定的话,则采用属性名作为列的名(外键关联时,不一致)

verbose_name:设置此字段在admin界面上的显示名称
在这里插入图片描述
注意:修改过字段选项【添加或更改】均要执行makemigrations和migrate。定义字段需谨慎考虑,有时候,建立字段后,会不让进行修改。

模型类-Meta类

from django.db import models

# Create your models here.
class Book(models.Model):

    title = models.CharField('书名', max_length=50, default='',unique=True)
    pub = models.CharField('出版社', max_length=100, default='')
    price = models.DecimalField('价格', max_digits=7, decimal_places=2)
    market_price = models.DecimalField('零售价', max_digits=7, decimal_places=2, default=0.0)

    class Meta:
        db_table = 'book'

课堂练习:

在这里插入图片描述

from django.db import models

# Create your models here.
class Book(models.Model):

    title = models.CharField('书名', max_length=50, default='',unique=True)
    #注意上面default='',unique=True实际不能同时出现,会冲突
    pub = models.CharField('出版社', max_length=100, default='')
    price = models.DecimalField('价格', max_digits=7, decimal_places=2)
    market_price = models.DecimalField('零售价', max_digits=7, decimal_places=2, default=0.0)

    class Meta:
        db_table = 'book'


class Author(models.Model):

    name = models.CharField('姓名', max_length=11)
    age = models.IntegerField('年龄', default=1)
    email = models.EmailField('邮箱', null=True)

    class Meta:
        db_table = 'author'

五、ORM基本操作-创建数据

常见问题处理:

问题1:

在这里插入图片描述
在这里插入图片描述
错误原因:

​ 当对模型类新添加一个字段时可出现错误。原因是,添加新字段后,数据库不知道原来已有数据对新字段该如何赋值,所以新增字段时,务必要添加default默认值。

处理方法: 选择1,则会进入shell中,手动输入一个默认值

​ 选择2,推出当前生成迁移文件的过程,自己修改models.py,新增加一个’defaule=xxx’的缺省值(推荐使用)

问题2:
在这里插入图片描述
在这里插入图片描述
创建数据

基本操作包括增删改查操作,即(CRUD操作)

CURD是指在做计算处理时的增加(Create)、读取查询(Read)、更新(Update)和删除(Delete)

ORM CRUD核心 -> 模型类.管理器对象

管理器对象,每个继承自models,Model的模型类,都会有一个objiects对象被同样继承下来。这个对象叫管理器对象。数据库的增删改查可以通过模型的管理器实现。

class MyModel(models.Model):
	...
MyModel.objects.create(...)  # objects 是管理器对象

Django ORM使用一种直观的方式把数据库表中的数据表示成Python对象

创建数据中每一条记录就是创建一个数据对象

方案1

MyModel.objects.creat(属性1= 值1,属性2 = 值2,…)

​ 成功:返回创建好的实例对象

​ 失败:抛出异常

方案2:

创建MyModel实例对象,并用save()进行保存

obj = MyModel(属性=,属性=)
obj.属性 = 值
obj.save()

Django Shell

在Django提供了一个交互式的操作项目叫Django Shell它能够在交互模式用项目工程的代码,执行响应的操作

利用Django Shell可以代替编写view的代码来进行直接操作

注意:项目代码发生变化时,要重新进入Django shell

启动方式: python3 manage.py shell
在这里插入图片描述

在这里插入图片描述

祝大家学习python顺利!!

猜你喜欢

转载自blog.csdn.net/weixin_54733110/article/details/120511038