Django框架的基本操作
day01:
5.框架
1.什麼是框架?
框架是一個為了解決某些開放性問題二存在的一種結構。
2.框架的優點
1.快速開發
2.解決大部分通過問題
3.bug少,穩定性高
3.框架的分類
1.前端框架
處理(html,css,js)
2.後端框架
ssh, ssm -----java
3.全棧框架
包含web整體的解決方案,如:開發框架,執行環境,處理方案
spring,
rails(Ruby),
django(python)
4.python web
1.Django: 重量級的python web 框架
2.Tornado: python web非同步處理框架
3.Flask: 輕量級
4.webpy: 輕量級
5.web2py: 全棧框架,webpy 的加強版
在虛擬環境中安裝
pip install Django
Pillow
PyMySQL
day02:
1.框架模式
常用的框架模式:MVC、ORM、MVVM、MTV
1.MVC
M: models 模型 對資料庫操作
V: Views 檢視 對HTML操作
C: Controller 控制器 互動
2.MTV
M: Models 模型 對資料庫操作CRUD
T: Templates 模板 對HTML操作
V: Views 檢視 互動
2.Django框架
1.什麼是Django框架
是一個開源框架,在2005年釋出,早起用來開發新聞類網站;
2.Django優點
1.開源,有完美的文件支援
2.解決方案多,內部功能強大
3.提供了完整的路由系統
4.自助式後臺管理
3.Django的安裝
1.Linux中的安裝
1.檢視已安裝的Django
1.進入虛擬環境
2.進入python互動模式下
3.在互動模式中資料
1.import Django
無反應,已經安裝好
報錯:環境中沒有Django
2.Django.VERSION 檢視版本
2.安裝Django
1.線上安裝 ----pip
1.pip install Django==1.11.8
2.離線安裝
1.下載所需要的Django包
http://www.djangoproject.com
download
2.在Linux中解壓Django包
tar -xvf Django-1.11.8.tar.gz
3.進入到Django-1.11.8中
python setup.py install
2.在Windows中安裝
1.線上安裝
pip install Django
4.Django使用
1.建立Django專案
django-admin.py startproject 專案名
點選建立Django專案按鈕
2.通過manage.py 啟動
python manage.py runserver
3.python manage.py runserver 0.0.0.0:8000
5.Django 的結果介紹
1.manage.py 檔案
負責執行Django中的各專案操作的檔案
如:
啟動服務
建立應用
建立管理員,建立使用者
2.主資料夾中的內容
1.init.py
專案初始化檔案,每當啟動專案時,自動執行
有初始化檔案,放在此處
2.setting.py(重要檔案)
專案的主配置檔案
1.BASE_DIR:專案所在地絕對路徑
2.DEBUG:除錯模式
開發過程中,推薦使用True
上線執行時,推薦使用False
3.ALLOWED_HOSTS
如果不設定,只有本季能訪問
通常推薦為“*”
4.INSTALLED_APPS
指定安裝的應用
5.MIDDLEWARE:指定中間
6.ROOT-URLCONF:指定專案的基礎路由配置檔案
7.TEMPLATES:指定模板資訊
8.DATABASES:制定資料庫資訊
9.LANGUGE_CODE:指定語言
3.urls.py
專案路由配置檔案
路由:去哪找執行檔案
4.wsgi.py
應用伺服器配置,暫時不用
5.URL使用
1.urls.py
預設自主檔案下,包含所有請求地址到檢視的對映
2.測試URL和檢視
1.在專案主資料夾建立views.py
作用:包含所有定義好的檢視
views.py
from django.urls import path
from django.http import HttpResponse
2.在urls.py裡面追加
from .views import *
3.url 函式
url 函式語法
url(regex,views,kwargs=None,name=None)
1.regex
正則表示式,匹配請求的url
2.views
URL 處理的檢視函式,自定義
3.kwargs
字典,向views傳參時使用
4.name
字串,給url起一個別名,在模板中使用
4.通過url向views傳參
from django.conf.urls import url
url(r'^index/(\d{4})/(\d{2})/(\d{2})/$',index_views)
http://localhost:8000/index/2018/07/11
聯絡訪問:
1.訪問地址:
localhost:8000/zs/1989
localhost:8000/ls/1999
2.訪問地址:
localhost:8000
返回:歡迎訪問主頁
5.用字典傳參
{'name':'sss','age':'20'}
3.Django 應用
1.什麼是應用?
應用就是網站中的獨立模組
2.建立應用
1.命令
./manage.py startapp 應用名稱
2.在setting.py 中註冊應用
INSTALLED_APPS=[
...........
'應用名稱',
]
3.應用的結構
1.migrations 目錄
存放在資料庫日誌,是一個Django與資料庫互動的中介軟體
2.init.py
應用的後臺管理檔案
3.admin.py
應用的後臺管理配置檔案
4.app.py
應用的屬性配置檔案,不需要改動
5.models.py
Models模型檔案
6.tests.py
測試模組,不需要改動
7.views.py
定義檢視的檔案
練習:
1.建立應用並註冊
1.index
2.news
3.music
2.配置路由
1.localhost:8000/index/index
交給index應用中的login_views 處理
2.localhost:8000/index/news
交給news應用中的index_views 處理
localhost:8000/index/news
交給news應用中的login_views 處理
3.localhost:8000/index/music
交給music應用中的index_views 處理
localhost:8000/index/music
交給news應用中的login_views 處理
4.Django應用
5.Django中的模板
1.什麼是模板?
就是一個網頁,可被檢視相應給使用者
2.模板設定
在setting中的TEPLATES變數
1.BACKEND:指定模板的搜尋引擎,不用改
2.DIRS:指定模板所存在的目錄們
DIRS:['index.temp','news.temp']
推薦:DIRS為空
2.在每個應用下建立貼膜拉特色資料夾,存放所有網頁
3.APP_DIRS
True:先從DIRS中指定的資料夾中查詢模板,如果沒有找到,在搜尋名為templates的資料夾
3.模板的載入方式
1.使用loader獲取模板,通過Httpresponse進行響應
from django.template import loader
def XXX_views(request):
t = loader.get_template('xxx.html')
html = t.reader({})
return HttpResponse(html)
2.使用render或者render_to_response直接載入
1.render
return render(request,‘網頁’,{})
2.render_to_response
可能被放棄
4.url()中的第四個引數
name:定義url的別名,允許在template中使用別名來訪問url
在模板中,使用 name 載入
<a href="{% url 'name別名'%}"></a>通過別名訪問路徑
作業:
1.建立專案名字叫 fruitday
2.建立應用 index
3.配置 主路由配置 和 index 應用路由配置
1.訪問 localhost:8000
交給index應用中 index_views 處理
2.訪問localhost:8000:login
交給index應用中 login_views 處理
3.訪問 localhost:8000/register 處理
交給index應用中register 處理
day03:
5.模板的語法
作用:允許將後端的資料傳遞給模板,在模板中顯示實際變數的值
在Django中允許傳遞給模板作為變數的型別
數字,字元,列表,元組,字典,函式,物件
如何將變數傳到模板中:
1.使用render載入模板
dic = {
‘變數’:‘值’,
}
return render(request,'',dic)
2.使用loader載入模板
t = loader.get_template('xx.html')
html = t.render(dic)
return HttpResponse(html)
如何在模板中獲取變數的值:
{{變數名}}
2.標籤
1.什麼是標籤,
允許巢狀一些伺服器基本邏輯運算到模板中
2.語法
{%%}
3.常用標籤
1.{% if %}...{% endif %}
2.{% if %}...{% else%}...{% endif %}
3.{% ifequal %}...{% endifequal %}
4.{% for 變數 in 列表|元組 %}
{{變數}}
{% endfor %}
允許使用內建變數(免宣告)
變數:forloop
屬性:
1.forloop:counter: 記錄當前迴圈的次數
2.forloop:counter0: 同上從0開始
3.forloop:revcounter: 記錄未被遍歷的數量
4.forloop:first: 布林值標記是否第一個專案
5.forloop:last: 布林值,標記為最後一個專案
3.過濾器
1.作用:
在顯示變數中,允許對資料進行篩選或改變
2.語法
{{ var | 過濾器}}
3.常用過濾器
1.{{var | upper}}
將var的資料變為全大寫
2.{{var | lower}}
將var的資料變為全小寫
3.{{var | floatformat:n}}
將var四捨五入到n為小數
5.模板繼承
1.模板的繼承
當多個模板具備相同的內容時,就可以使用繼承的方式來簡化程式碼的開發
當子模板繼承父模板後,子模板會具備模板中所有的內容,並且可以修改或增加屬於自己的內容
2.模板繼承的語法
1.在父模板中
增加{%block 名稱%}....{%endblock%}
在block中定義的是正常顯示在父模板中但允許被子模板修改的內容
在父模板中{%block 名稱%}...{%endblock%}允許出現若干個
2.在 子模板 中
1.在最頂層的第一句話增加
{%extends '父模板的名稱'%}
2.增加block標記, 編寫屬於自己的內容
{%block 名稱%}
...
{%endblock%}
day04:
1.模型-models
1.什麼是模型?
按照資料庫表結果來抽象出來的class在資料庫中,可以完成對資料的CRUD
C: create
R: retrieve
U: update
D: delete
2.建立 和 使用模型 - ORM
1.什麼是ORM?
中文:物件關係對映
三大特徵:
1.資料表 到 類 對映
允許將表自動生成一個class,也允許將類對應的自動生成表
2.資料型別的對映
允許將表中的欄位自動生成到程式語言中 的屬性,並能夠將表中的欄位的資料
型別,也對應生成到程式語言中對應資料型別
3.關係對映
資料庫的關聯關係:
一對一
一對多
多對多
將表中的關聯關係也對映到程式語言的class,通過建立物件的關係來完成對映
2.ORM的優點
1.提高了開發效率,能夠自動完成class到table的對映或者table到class的對映,可以在程
序中省略龐大的資料訪問層
2.不用編寫SQL,也能完成歲資料的CRUD操作
3.建立 和 配置 資料庫
1.資料庫建立
create database webdb default charset utf8
2.Django中資料庫配置
在setting中配置資料庫資訊
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'webdb',
'USER':'root',
'PASSWORD':'mysql',
'HOST':'localhost',
'PORT':'3306'
}
}
1.ENGINE:引擎
連線MySQL的引擎django.db.backends.mysql
2.NAME:要連線的 資料庫名
3.USER:使用者名稱名稱,通常都是root
4.PASSWORD:使用者名稱密碼:mysql
5.HOST:主機名
6.POST:埠號:3306
4.資料庫的同步操作
1. manage.py makemigrations
作用將每個應用下的models先對映成資料庫的日誌檔案,並存放在每個應用下的migrations
檔案中
若報錯:
在主目錄下的init.py
import pymysql
pymysql.install_as_MySQLdb()
2.manage.py migrate
作用:將每個應用下的migrations 資料夾中的日誌檔案同步到資料庫
5.編寫models
1.注意
1.models中的每個class都成為模型類或者實體類
2.models中的每個實體類,必須繼承自models。Model
2.建立模型類
models.py
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length= 30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=30)
country = models.CharField(max_length=30)
website = models.URLField()
6.Django提供的資料欄位 和 欄位選項
1.資料欄位
1.BooleanField()
2.CharField()
3.DateField()
4.DecimalField()
5.EmailField()
6.FloatField()
7.fileField()
8.IntegerField()
9.ImageField()
10,URLField()
2.欄位選項
1.null:是否允許為空
name=models.CharField(max_length=30,null=True)
2.default:為列設定預設值
name=models.CHarField(max_length=30,default='匿名')
3.verbose_name:在後臺管理中,該列顯示的名稱
name=models.CHarField(max_length=30,verbose_name=‘使用者名稱稱’)
練習:
models.py 追加兩個class
1.Auther -作者
1.name
2.age:IntegerField()
3.email:允許為空
2.Book -書籍
1.title:書名
2.publication——date: 出版日期
7.資料的匯入和匯出以及版本切換
1.版本切換
1. ./manage.py migrate
執行最新的日誌檔案,同步到資料庫
2. ./manage.py migrate 應用名 版本號
./manage.py migrate index 0001
2.資料庫的匯入和匯出
1.資料的匯出
1.匯出所有的表結構和資料
mysqldump -u root -p 資料庫名 > xx.sql
2.只匯出表結構,不匯出資料
mysqldump -u root -p 資料庫名 > xxx.sql
2.匯入資料
mysql -u root -p 資料庫名 < xxx.sql
3.通過資料庫自動匯出models
(將table對映成Models)
./manage.py inspectdb > xx.sql
2.模型的資料庫操作方法(CRUD)
1.通過檢視向DB中增加資料
1.Entry.object.create(屬性=值,屬性=值)
ex:
Auther.object.create(
name="老舍",age="50",email="[email protected]"
)
2.建立Models 類的物件,通過save()增加
obj = Entry(屬性=值,屬性=值)
obj .save()
3.通過字典建立Models類的物件,save()增加
dic={
'屬性':‘值’
}
obj = Entry(**dic)
obj .save()
2.通過檢視查詢資料
所有的查詢都要基於Entry.objects的基礎上完成
1.查詢介面
1.all()
語法:entry.objects.all()
返回:QuerySet - 查詢結果
sql :select * from Entry
2.values()
語法:entry.objects.all().value()
作用:Query Set
ex:
Author.objects.all().value('name','age')
3.order_by()
語法:Entry.objects.all().order_by('id')
作用:對查詢結果集中的資料進行排序
返回:QuerySet
ex:
Author.objects.all().order_by('id')
所有資料按照id列的值升序排序
Author.objects.all().order_by('-id')
所有資料按照id列的值降序排序
4.exclude()
語法:Entry.objects.exclude(屬性=值)
作用:對指定條件取反
返回:QuerySet
ex:
1.Author.objects.exclude(id=3)
2.Author.objects.exclude(id=3,age=50)
5.filter()
語法:Entry.objects.filter(條件)
作用:將滿足條件的資料篩選出來
返回:QuerySet
6.get()
語法:Entry.objects.get(條件)
返回:一個models物件
注意:該函式只能返回一個物件,返回多個或沒有查詢到資料的話都丟擲異常
作業:
根據fruitday 中的login和register,分析天天果園中使用者表的資訊
1.建立資料庫 FuritDay
2.建立模型類 - Models
...
增加一個欄位,是否為活躍使用者
day05:
2.查詢謂詞
每個查詢謂詞都是一個條件,真正查詢時會將謂詞翻譯成對應的條件語句
常用查詢謂詞
常用查詢謂詞:
1.__exact
作用:等值判斷,等同於 =
Author.objects.get(id_exact = 1)
= Author.objects.get(id = 1)
2.lt、gt、gte、lte(前置雙下滑線)
作用:數值比較
Author.objects.filter(age__gt = 35) = age > 35
3.__contains
作用:查詢包含指令字元的
Author.objects.filter(name__contains='元')
select * from author where name like ‘%元%’
4.startwith,endwith
作用:查詢指定字元作為開始/結束
Auhtor .objects.filter(name__startwith=’霍‘)
Author.objects.filter(name__endwith="真")
3.通過檢視修改操作
1.修改單個物件
1.通過get()得到要修改的models物件
2.通過models物件直接修改資料即可
3.通過models物件的save()函式直接儲存
author = Author.objects.get(id=1)
auhtor.name = '愛新覺羅·康熙'
author.age = 200
author.save()
2.批量修改
呼叫QuerySet的update()即可完成
Author.objects.all().update(屬性=值,屬性=值)
4.通過檢視刪除資料
1.delete()
Author.objects.get(id=2).delete()
Author.objects.filter(age__gt=50).delete()
5.F()操作和Q()操作
1.F()
update author ser age = age + 10
Author .objects.all().update(age = age+ 10)
作用:用於執行過程中獲取某列的值
語法:F('列名')
from Django.db.models import F
Author .objects.all().update(age = F('age') + 10)
2.Q()
from django.db.models import Q
Author.objects.filter(Q(id=1) | Q(age=60))
6.原生的資料庫操作
1.查詢
介面:raw()
語法:Entry.objects.raw(sql)
引數sql:要執行的查詢SQL語句
2.增刪改
def cud(request):
with connection.cursor() as cursor:
sql = '...'
cursor.execute(sql)
return render(......)
1.使用後臺管理models
1.建立管理員
manage.py createsuperuser
username:admin 指定使用者
email:[email protected] 指定郵箱
password:adminadmin 密碼8位
2.基本管理
1.在應用中admin.py 中註冊要管理的models
1.admin.py
作用:註冊需要管理的models,只有在此註冊的models才允許被後臺管理
2.註冊Models
from .models import *
admin.site.register(Entry)
ex:
admin.site.register(Author)
3.修改models.py 處理顯示的內容
在models 中的各個class中追加
def ——str--(self):
return self.name
4.通過Meta內部類實現 展開屬性
每個models 類中都可以宣告 內部類Meta
class Author(models,Models):
...
class Meta:
1.db_table:指定實體類對應的表的名字
2.verbose_name:定義類在admin中顯示的名稱(單數形式)
3.verbose_name_plural:效果同上,複數形式
4.ordering:指定資料們的排序方式,取值為一個列表,預設是升序排序,降序
的話加減號’-'
2.高階管理
1.在admin.py中建立管理類,實現高階管理功能
1.定義EntryAdmin,繼承自admin.ModelsAdmin
class AuthorAdmin(admin.ModelsAdmin):
pass
2.註冊 高階管理類
admin.site.register(Entry,EntryAdmin)
admin.site.register(Author,AuthorAdmin)
2.允許在EntryAdmin中增加的屬性
1.list_display()
作用:指定顯示在實體資訊頁上的欄位
取值:有屬性名組成的元組或列表
ex:
list_display = [
'name','age','email'
]
2.list_display_links
作用:定義能夠連結到詳細頁面的連結
取值:有屬性名組成的元組或列表
注意:取值必須出現在list_display中
3.list_editable
作用:指定在是資訊頁上允許被修改的欄位
取值:由屬性名組成的元組或列表
注意:取值不能出現在list_display_links中的值
4.search_fields
作用:新增允許被搜尋的欄位
取值:由屬性組成的元組
5.過濾器list_filter
作用:在實體資訊頁右側增加一個過濾器
一遍實現快速篩選
取值:由屬性名組成的
day06:
6.date_hierarchy
作用:在實體資訊頁面的頂部增加時間選擇器
取值:必須是DateField 或DateTimeField的列名
7.fields
作用:在實體的詳細頁中,定義顯示那些欄位,按照什麼樣的順序
取值:由屬性名組成的元組或列表
8.fieldsets
作用:在實體詳細頁面中,對屬性進行分組
注意:fieldsets 和 fields不能同時出現
語法:
fieldsets = (
('分組名稱1',{
'fields':('欄位1','欄位2'),
'classes':('collapse')}),
('分組名稱2',{
'fields':('欄位1','欄位2'),
'classes':('collapse')}),
)
2.Django的連線查詢(關係對映)
1.一對一對映(1:1)
1.什麼是一對一
A表中的一條資料對應B表中的一條資料
典型代表:一夫一妻
資料庫中的實現:
A表:設定主鍵
B表:增加一列,並引用自A表中的主鍵,並增加唯一約束
2.語法
一對一涉及到兩個類中的任何一個類
屬性 = models.OneToOneField(Entry)
class Author(models.Model):
name = models.CharField(max_length=30)
class Wife(models.Model):
name = models.CharField(max_length=30)
author = models.OneToOneField(Author,on_delete=models.CASCADE)
正向查詢:通過wife找Author
wife = Wife.objects.get(id=1)
author = wife.author
反向查詢:通過Author找wife
author = Author.objects.get(name='霍元甲')
wife = author.wife
2.一對多
1.什麼是一對多
A表中的一條資料對應B表中的任意條資料
如:出版社 和 書籍
在資料庫中的體現
A表:設定主鍵
B表:引用A表的主鍵
2.語法
使用外來鍵(Foreign Key)
屬性 = models.ForeignKey(Entry)
ex:
Book(m)和Publisher(1)
class Book():
publisher = models.ForeignKey(Publisher,null=True,on_delete=models.CASCADE)
3.查詢
1.正向查詢 通過book找publisher
title = '通過book找publisher'
book = Book.objects.get(id=1)
publisher = book.publisher
2.反向查詢 通過publisher找book
publisher = Publisher.objects.get(name='交大出版社')
listbook= publisher.Book
day07:
3.多對多
1.什麼是多對多
A表中一條資料對應B表中任意條資料匹配,
同時B表中的一條資料也可以與A表中的任意條資料對應
2.語法
在多對多的任何一個Models類中均可實現
entry = models.ManyToManyField(Entry)
class Book(models.Model):
......
class Author(models.Model):
book = models.ManyToManyField(Book)
3.自定義查詢物件(objects)
1.宣告類 EntryManager,繼承自models,Manager,在EntryManager中增加自定義的函式
class AuthorManager(models.Model):
def 函式名(self,自定義引數):
....
return ...
def .........
3.HttpRequest
1.什麼是HTTPRequest
HttpRequest,請求物件,封裝了請求物件過程中所有在Django中的資料,HttpRequest被化成了request封裝到了檢視處理函式中作為引數,該引數在試圖處理函式被動呼叫時,自動傳入。
2.HttpRequest中的主要內容
1.request.scheme: 請求協議
2.request.body: 請求主體
3.request.path: 請求路徑
4.request.method: 請求方式
5.request.get_host(): 請求主機地址或者域名
6.request.GET: 封裝了GET方式的請求資料
7.request.POST: 封裝了POST方式的請求資料
8.request.COOKIES: 封裝了cookies的資料
9.request.META: 封裝了請求的元資料
3.有關HTTP協議
1.每一個請求會有method
請求的method預設為get
method:get、post、put、delete
get:請求資料在位址列後
Query String
post:請求資料在請求主體中
FormData
2.請求主體
只有post、put才能產生請求主體
4.csrf 跨站點攻擊
目的:解決跨站點發送POST請求的問題
解決方案:
1.刪除Django.middleware.csrf.CsrfViewMiddleware
2.在處理的檢視上加上標記@csrf_protect
3.在模板中<form>的底下第一行增加一個
{%scrf_token%}
5.獲取請求提交資料
1.GET請求
request.GET['名稱']
2.POST請求
request.POST['名稱']
建議:request.POST.get('名稱')
request.POST.get(name)