教程地址:
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.py 中 INSTALLED_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.py 中 MIDDLEWARE 配置項 裏 註釋掉‘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():
插入代碼