開源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順利!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/304080.html
標籤:區塊鏈
