1. 程式人生 > 其它 >靜態檔案配置 django連線MySQL django模型層初識 ORM基本語句

靜態檔案配置 django連線MySQL django模型層初識 ORM基本語句

目錄

靜態檔案配置

1. 問題描述

無法使用本地bootstrap檔案搭建CSS頁面,只能用CDN。

2. 靜態檔案

不怎麼經常變化的檔案 主要針對html檔案所使用的到的各種資源
比如bootstrap 的 css js 都是別人寫好的 你無需怎麼修改

這些就稱之為靜態檔案
比如說img圖片檔案、第三方外掛、第三方框架檔案、都是寫好之後你不會修改他的,這些都稱之為靜態檔案。

靜態檔案不能隨便放置,它會混淆django的目錄結構,所以要放到django指定的目錄 >>> static目錄

該目錄下如果各種型別的檔案都多 還可以繼續建立目錄:
         	css目錄
            	js目錄
                img目錄
            	utils目錄/plugins目錄/libs目錄/others目錄/不創

3. 資源訪問

我們在位址列中之所以可以屬於路由獲取到相應的資源是因為程式設計師提前開設了資源的介面

介面:暫時理解介面就是一個網址,輸入這個網址的時候,網址可以返回對應的資料。

檢視開發者工具:

這相當於瀏覽器向這個地址發請求 而在urls.py我們沒有開設介面讓瀏覽器訪問 如下:

所以要在urls.py開設介面,但是靜態檔案太多了!不能全部寫在這個url列表裡。

4. 靜態檔案資源訪問
預設情況下無法訪問 因為我們沒有提前開設靜態檔案資源的訪問介面
django提供配置,幫助你一鍵開設靜態檔案資源的訪問介面。
在settings.py下,新增程式碼:

配置的底層原理:

上面的STATIC_URL = '/static/'

規定了訪問靜態檔案資源的介面字首(可以理解成通行證)
也就是你寫html檔案的時候 必須要在連結裡修改成/static/,如下將兩個點去掉:

也可以自行修改這個'通行證'的名字STATIC_URL= /xxx/ ,但是你的html頁面也需要相應的修改(/xxx/)。
另一部分:STATICFILES_DIRS就是你本地真實存放靜態檔案的目錄名稱。

意味著可以訪問下面這個列表中的資源(獲得了許可權)。獲得了進入靜態檔案目錄的資格!
多目錄的情況:
介面字首對了之後, 會把紅框中的路徑,依次去到列表中的目錄,從上往下查詢(類似環境變數):

但是這樣還是有問題:
寫了100個html,產品經理讓你換介面字首的名字。
那要改100個html頁面的匯入連結:累死了!

所以我們能不能動態匹配介面字首(通行證):
使用模板語法:
請注意:模板語法是django提供的 並不是在所有地方都能用。

補充開發者工具設定:
當開發者工具開啟時,不使用快取。否則瀏覽器使用快取頁面,不利於我們實時修改並檢視。

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

1.介面字首
STATIC_URL = '/xxx/'  # 訪問靜態檔案資源的介面字首(通行證)
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),  # 儲存靜態檔案資源的目錄名稱
    os.path.join(BASE_DIR, 'static1'),  # 儲存靜態檔案資源的目錄名稱
    os.path.join(BASE_DIR, 'static2'),  # 儲存靜態檔案資源的目錄名稱
]
'''
介面字首正確之後 會拿著後面的路徑依次去到列表中自上而下查詢 一旦找到就返回
'''

2.介面字首動態匹配
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>

form表單屬性補充

action

action控制資料提交的地址

  1. action="" 資料預設提交給當前頁面所在的地址
  2. action="https://www.baidu.com/" 填寫完整地址
  3. action="/index/" 朝當前服務端的index地址提交 相當於127.0.0.1:8000/index/

method

method控制資料提交的方法(預設是get,可以改post)

請求方法

get請求

'''get請求'''
	朝服務端索要資料 也可以攜帶一些額外的要求
	
 		攜帶額外資料的方式:  URL?xxx=yyy&uuu=zzz
  		問號後面攜帶資料的大小是有限制(2KB)的並且不能攜帶敏感資料 資料會直接暴露
		
		?後面攜帶的資料的不屬於路由 不影響django對路由的匹配
		## ps:之前說的網站字尾就是>>>路由

get請求攜帶額外資料的示例:

不能攜帶敏感資料:

post請求

'''post請求'''
	朝服務端提交資料
    	攜帶額外資料的方式:  請求體
   		請求體攜帶資料安全性較高並且沒有大小限制
前期傳送post請求需要註釋掉配置檔案中的某一行
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

不這麼做會報錯:

示例:

成功接受post請求:

所以我們可以:
針對不同的請求可以做不同的處理!
如果是get請求就返回一個html頁面
如果是post請求就獲取傳送過來的資料

views層 request物件

request.method	獲取請求方式 結果是純大寫的字串資料
	GET\POST
request.POST	獲取post請求請求體裡面攜帶的資料
	request.POST.get()		獲取列表最後一個數據值
 	request.POST.getlist()	 獲取整個列表資料
request.GET		獲取網址問號後面攜帶的資料
	request.GET.get()		獲取列表最後一個數據值
 	request.GET.getlist()	 獲取整個列表資料
 
"""
在檢視函式中針對不同的請求程式碼編寫套路
	if request.method == 'POST':
		return HttpResponse()
	return HttpResponse()
"""

如何判斷瀏覽器請求??請允許我給你介紹你的物件=。= ---> request物件
每個檢視函式都會傳入一個request物件,這個物件就對應著之前學習過wsg模組中的大字典。
request經過二層封裝 :wsg模組將請求資訊封裝成大字典 ---> django將大字典封裝成物件
request物件內部有很多方法:

下面開始介紹request的常用方法。

request.method

method方法獲取請求方式,結果是純大寫的字串

request.POST

作用是獲取post請求體的資料:

request.POST是一個物件,可以當成字典進行操作,並不是所有字典的操作都支援!
request.POST.get()方法,獲取列表最後一個數據值,如下只拿到了name列表的最後一個值:

request.POST.getlist():

request.GET

示例:

獲取get請求網址後面攜帶的資料:

檢視結果:

pycharm連線資料庫

右上角或者左下角找到database按鈕:

第一次要下載驅動:

可能的問題:驅動有很多種,無法連線就切換mysql5.1驅動

測試連線 如果不行就換一個驅動:

簡單增刪:

django連線資料庫(記憶)

django自帶的sqlite3是一個小型的資料庫 功能比較少 主要用於本地測試
我們實際專案中都會替換掉它

預設配置sqlite3
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
  1. 修改配置檔案
    修改成如下:(NAME是數庫名、還有使用者名稱密碼根據你的mysql自定義)
DATABASES = {
    'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'db1',
            'HOST': '127.0.0.1',
            'PORT': 3306,
            'USER': 'root',
            'PASSWORD': '123',
            'CHARSET': 'utf8'
        }
}

修改完settings django服務直接寄了,並提示你:Did you install mysqlclient?這時候需要進行下一步:
2. 需要指定模組

django1.X版本需要在專案目錄下或者app目錄下的__init__.py編寫程式碼
    	import pymysql
    	pymysql.install_as_MySQLdb

django2.X及以上都可以直接通過下載mysqlclient模組解決
    	pip3.8 install mysqlclient
	ps:該模組windows下載問題不大 主要是mac電腦可能有問題

1.x版本:
在這兩個init寫如上程式碼

2.x版本:
下載mysqlclient模組 這個模組不同的作業系統 不一定能下載成功 mac電腦可能出問題

修改django原始碼可以解決:

物件關係對映()

ORM簡介

ORM:物件關係對映
	能夠讓不會SQL語句的python程式設計師 使用python面向物件的語法來操作資料庫
	
類					表
物件					一條條資料
物件點名字			 資料獲取欄位對應的值

ORM由於高度封裝了SQL 所以有時候效率較低 我們需要自己寫SQL

ORM基本操作

1.現在models.py中編寫模型類
	class GirlsInfo(models.Model):
        # 欄位名 = 欄位型別 + 約束條件
        id = models.AutoField(primary_key=True)  
        name = models.CharField(max_length=32)
        age = models.IntegerField()
2.執行資料庫遷移相關命令
	python38 manage.py makemigrations  將操作記錄到小本本上(migrations)
	python38 manage.py migrate		  將操作同步到資料庫上
 '''注意每次在models.py修改了與資料庫相關的程式碼 都需要再次執行上述命令'''

在models.py進行操作。
繼承:models元類控制model類產生的物件 我們的表繼承models

建立模型類:

執行資料庫遷移相關命令:
python38 manage.py makemigrations
遷移記錄會存放在migrations:

我們連結的資料庫中有可能出現一個記錄遷移相關資訊的小表。
第二條命令:
python38 manage.py migrate 資料庫遷移命令
真正的將models.py的操作同步到資料庫中 models中的一個類 對應資料庫中的一個表

會一下建立了很多表!有些是django執行需要的表,我們不要動他:

我們在model.py裡寫的類也會生成一個表,此時會出現在資料庫中:

多個應用中表的名字相同時,儲存表到資料庫不會衝突。
django會自動幫你給表取名。app01_user\app02_user不同的應用下有不同的字首。
只要修改models(如下多添加了一個欄位),就要遷移資料庫。

還可以反向遷移!用表生成類!

ORM基本語句

from app01 import models
models.類名.objects.create()
models.類名.objects.filter()
models.類名.objects.update()
models.類名.objects.delete()

插入資料 create

查詢資料 filter


拿到資料物件:

獲取資料: 底層還是用execute() 方法

修改資料 update

先篩再修 支援批量修改:

刪除資料 delete