【Django】框架梳理

教程地址:
https://www.bilibili.com/video/BV1AE41117Up
http://www.python3.vip/
在這裏插入圖片描述

一、安裝django包

安裝命令:
>>>pip install django
使用鏡像速度更快:
>>>pip install Django==2.1.3 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
注意:django版本要與python版本相匹配(自行搜索),否則後面會出現進入admin服務就斷的情況
查看版本:
>>>python -m django --version

二、創建項目

cd到項目所在文件夾下,創建項目:
>>>cd/d G:\study\django\projects
>>>django-admin startproject mxsys
注意:在projects文件夾下就創建好了一個名爲mxsys的項目,該目錄下除了manage.py文件還有一個同名配置包。G:\study\django\projects\mxsys就是這個項目的根目錄,之後的命令需要在此目錄下運行
查看當前目錄結構:
>>>tree/F
根目錄下的文件作用:

文件 作用
manage.py 是一個工具腳本,用作項目管理的
mxsys/settings.py Django 項目的配置文件. 包含了非常重要的配置項
mxsys/urls.py 存放了 一張表, 聲明瞭前端發過來的各種http請求,分別由哪些函數處理
mxsys/wsgi.py 提供給wsgi web server調用 的接口文件,裏面的變量application對應對象實現了 wsgi入口,供wsgi web server調用 。

settings.py

BASE_DIR 一般是該項目的根目錄,被用於在其他地方創建路徑
SECRET_KEY
DEBUG
ALLOWED_HOSTS
INSTALLED_APPS
MIDDLEWARE 添加地區中間件可以改變內置操作平臺語言、臨時註銷csrf防護
ROOT_URLCONF
TEMPLATES
WSGI_APPLICATION
DATABASES 配置數據庫引擎和位置,默認是根目錄下的sqlite3數據庫
AUTH_PASSWORD_VALIDATORS
LANGUAGE_CODE
TIME_ZONE
USE_I18N
USE_L10N
USE_TZ
STATIC_URL

三、運行服務

進入項目根目錄下,運行服務:
>>>cd/d G:\study\django\projects\mxsys
>>>python manage.py runserver 0.0.0.0:80
0.0.0.0 表示綁定本機所有的IP地址,例如瀏覽器中輸入本機地址127.0.0.1,返回成功界面
如果其他域名不能成功,就把它添加到同名配置包下的setting.py下的ALLOWED_HOSTS列表中
瀏覽器輸入地址,顯示成功界面

四、創建app

一個項目包含多個app,一個app 通常就是一個相對獨立的模塊 ,實現相對獨立的功能
進入項目根目錄下,創建app
>>>cd/d G:\study\django\projects\mxsys
>>>python manage.py startapp sales
根目錄下就創建一個名爲sales的文件夾,它就是一個python package

文件 作用
migrations/ 每次更新時,生成該app下model.py的更新腳本
admin.py 將model|表註冊在這裏
apps.py 自動創建一個繼承AppConfig的應用配置類,如”CommonConfig“當創建數據庫表等情況時,需要將它添加到settings.pyINSTALLED_APPS
modes.py 創建繼承models.Model的類,一個類就是一個數據庫表
tests.py
wiews.py 創建用於處理各種請求的可調用方法

五、URL路由

一級路由:
在mxsys/url.py 直接配置指向sales.view中的可調用方法
二級路由:
在mxsys/url.py先指向sales.url.py(自己新建),在sales/url.py中再指向具體方法

六、數據庫和表

1.創建數據庫
使用setting.py下的DATABASES的默認配置,創建一個sqlite3數據庫,裏面有一些基礎表
>>>python manage.py migrate

2.ORM
ORM (object relational mapping):通過對象操作數據庫

數據庫中 Django中
創建一張數據庫表 定義一個繼承自 django.db.models.Model 的類
定義該表中的字段(列) 定義該類裏面的一些屬性
對數據進行增刪改查 定義類的方法處理數據

在app下的model.py創建繼承django.db.models.Model的子類就是在數據庫中創建表。
注意:如果model類(繼承models.Model)沒有objects屬性,就在該類下添加 objects = models.Manager()

3.配置到數據庫
定義好子類後,需要在項目的配置文件 settings.py 中, INSTALLED_APPS 配置項列表中添加該app的應用配置類’common.apps.CommonConfig’,這個應用配置類就在該app下的apps.py中定義
step1-讓django檢查更新這個app裏面的models.py:
>>>python manage.py makemigrations app名
有更新就會在該app下的migrations文件夾生成一次更新腳本
step2-將檢查的更新改變到數據庫:
>>>python manage.py migrate
每次models.py更新,都需重複這兩個步驟,新建的表也一定要應用到數據庫,否則後續無法對錶資源進行操作。

七、Admin管理數據

Django提供了一個管理員操作界面可以方便的 添加、修改、刪除你定義的 model 表數據。
創建超級管理員:
>>>python manage.py createsuperuser
訪問http://127.0.0.1/admin/可以進入內置操作界面(英文版,如果改成中文,需要在setting的MIDDLEWARE中添加’django.middleware.locale.LocaleMiddleware’)
進入界面可以操作的默認是auth_user、auth_user_groups表
想讓app下models.py定義的一個表model也在此係統中,需要將該表註冊到該app的admin.py下

八、前端後端數據交互

1)非前後端分離
Django 框架在 url 路由匹配到函數後, 調用函數時,會傳入 一個 HttpRequest 對象給參數變量 request,該對象裏面 包含了請求的數據信息。
前端傳入一個request,後端在views.py裏面編寫可調用方法。
一是可以直接自己定義返回前端的格式。
二是利用html模板或者模板引擎。
但是都需要處理輸出格式。
2)前後端分離
定義好前端和後端交互數據的接口,後端根據接口,只負責提供數據。

九、對資源的增刪改查

1)方法小結
表.objects.values()返回QuerySet對象包含所有表記錄
表.objects.create(關鍵字參數)創建一條記錄
表.objects.bulk_create(列表)批量記錄
表記錄.屬性=值直接修改數據表記錄.save()修改後需要保存
表記錄.delete()刪除表記錄

注意:臨時取消掉CSRF的 校驗機制,settings.pyMIDDLEWARE 配置項 裏 註釋掉‘django.middleware.csrf.CsrfViewMiddleware’
2)測試代碼
方法一:與前端集成
開發環境下,使用前端資源測試後端代碼,臨時方案(正式部署Nginx)
在同名配置包下的url.py添加靜態文件指向路徑+ static("/", document_root="./z_dist")
方法二:使用requests庫,模擬前端,發送http請求

十、登入登出

from django.contrib.auth import authenticate, login, logout
登錄時獲取post請求體中的用戶名和密碼
authenticate:可以將獲取requests中的數據加密後與auth_user表裏的數據驗證。參數有效就返回一個User對象。
login:登入
logput:登出

十一、session和token

對於請求消息的合法性驗證, 通常有兩種方案: session 和 token。
使用session方案:
django_session會記錄每次的登錄狀態(session_key唯一標識)。登陸之後每次發出http請求,響應頭裏面帶有個set-cookie項,就是把django_session裏面的記錄內容返回給客戶端瀏覽器存儲,如果沒有登錄,那麼就沒有set-cookie這項。
在登錄時就往session加信息,這樣cookie就會帶有指定信息,處理請求時就可以添加驗證邏輯,驗證不過就可以指定跳轉。

十二、數據庫表的關聯

一對多:
外鍵需要指向關聯表的主鍵models.ForeignKey(to,on_delete)on_delete設置當主鍵記錄刪除,關聯外鍵的表記錄如何處理:models.CASCADE\PROTECT\SET_NULL
一對一:
外鍵需要指向關聯表的主鍵models.OneToOneField(),相當於外鍵加上unique=True 約束
多對多:
外鍵需要指向關聯表的主鍵models.ManyToManyField(to,through),through參數指向兩個表的中間模型表(該表將這兩個表的主鍵指定外鍵成新的字段),一般情況下不需要指定,當中間表有額外的字段時需要指定

十三、ORM關聯表

Country:id 、name
Student:id 、name、 grade 、country(外鍵指向Country)

1. 主表對象訪問外鍵表
s1 = Student.objects.get(name='白月')
s1.country.name

主表.objects.get(表字段=值).外表名.外表字段

2. 主表對象通過外鍵表字段篩選記錄
Student.objects.filter(country__name='中國').values('name','country__name')

主表.objects.filter(外表名__外表字段=值).values(表字段)
自動的雙下劃線命名方式使用不便,可以使用annotate方法進行重命名

from django.db.models import F
# annotate 可以將表字段進行別名處理
Student.objects.annotate(
    countryname=F('country__name'),
    studentname=F('name')
    ).filter(countryname='中國').values('studentname','countryname')

主表.objects.annotate( 別名1=F('外表名__外表字段'), 別名2=F('主表字段') ).filter(別名1='中國').values(別名)

3.反向訪問:外鍵表對象訪問主表(效果同2)

1.使用主表名_set

cn = Country.objects.get(name='中國')
cn.student_set.all()#cn.student_set.values('name','country__name')

外鍵表.objects.get(表字段=值).主表名_set.values()
2.定義反向訪問名
如果不想使用主表名_set,可以在定義表的時候定義反向訪問的別名

class Student(models.Model):
    name    = models.CharField(max_length=100)
    grade   = models.PositiveSmallIntegerField()
    country = models.ForeignKey(Country,
                on_delete = models.PROTECT,
                # 指定反向訪問的名字
                related_name='students')           
cn = Country.objects.get(name='中國')
cn.students.all()#cn.students.values('name','country__name')

4.反向過濾:外鍵表對象通過主表字段篩選記錄
Country.objects.filter(students__grade=1).values('name','country__name').distinct()#distinct()去重

外鍵表.objects.filter(反向訪問名__主表字段=值).values(表字段).distinct()
同樣,students__grade可以使用annotate方法定義別名

TIP:
python manage.py shell進入交互解釋器,可直接輸入代碼,類似jupyter notebook
寫py文件再運行一樣

十四、事務

添加一條訂單記錄,需要在2張表(Order 和 OrderMedicine )中添加記錄。事務機制可以解決髒數據。

with transaction.atomic():
	插入代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章