Django
1. 特點(diǎn)
- 快速開(kāi)發(fā):Django的宗旨在于幫助開(kāi)發(fā)人員快速?gòu)母拍畹酵瓿蓱?yīng)用程序。
- 安全可靠:Django認(rèn)真對(duì)待安全性,幫助開(kāi)發(fā)人員避免許多常見(jiàn)的安全錯(cuò)誤。
- 超可伸縮性: Web上的一些最繁忙的網(wǎng)站利用了Django快速靈活擴(kuò)展的能力。
2. 入門
MVC 設(shè)計(jì)模式
目標(biāo):程序的解耦
在行業(yè)內(nèi)普遍存在的設(shè)計(jì)模式
M ==> Model 模型 ==> 數(shù)據(jù)層 ==> 針對(duì)數(shù)據(jù)的操作 ===>轉(zhuǎn)化成對(duì)數(shù)據(jù)庫(kù)的操作 (sql) 映射關(guān)系
V ==> view 視圖 ==> 展示層 ==> 展示頁(yè)面(頁(yè)面中會(huì)有數(shù)據(jù)) 里面加載的是 模板(html文件)
C ==> Controller 控制器 ==> 邏輯層 ==> 業(yè)務(wù)邏輯 根據(jù)用戶的請(qǐng)求去調(diào)用模型,獲取數(shù)據(jù)后交給視圖去展示數(shù)據(jù)
MVT 設(shè)計(jì)模式
目標(biāo):程序的解耦
僅限于Django中的設(shè)計(jì)模式
M ==> Model 模型(對(duì)數(shù)據(jù)的操作)
V ==> view 視圖(業(yè)務(wù)邏輯)
T ==> Template 模板(頁(yè)面的展示)
路由
負(fù)責(zé)請(qǐng)求地址的匹配,并交給指定的視圖函數(shù)進(jìn)行處理
如:www.pyweb.com/yichuan/p/123457/
前面到com都為域名,后面的yichuan/p/123457/這是就是url地址
在路由的url函數(shù)中可以寫正則表達(dá)式進(jìn)行匹配,例如:
url(r'^address/2003/$', views.year)
3. 項(xiàng)目的搭建
- 執(zhí)行命令:
django-admin startproject 項(xiàng)目名 - 系統(tǒng)會(huì)創(chuàng)建一系列文件和文件夾,其中項(xiàng)目名下有一個(gè)文件夾與項(xiàng)目同名
- 項(xiàng)目的總目錄可以重命名,但是其中的文件盡量不要重命名,否則需要修改配置
創(chuàng)建應(yīng)用
- 命令行:
python3 manage.py startapp 應(yīng)用名 - 我們需要操作的文件
views.py和models.py
啟動(dòng)項(xiàng)目 ???
- 在終端中輸入命令行:
python3 manage.py runserver - 之后終端中會(huì)返回地址,一般都為本地地址:
http://127.0.0.1:8000
輸出一個(gè) Hello World 的過(guò)程
- 創(chuàng)建應(yīng)用:
python3 manage.py startapp myhome - 在應(yīng)用文件夾中找到視圖函數(shù)
views.py - 定義視圖函數(shù)
def hello(request):
return HttpResponse('hello world')
注意:需要導(dǎo)入 HttpResponse:
from django.http import HttpResponse-
定義路由規(guī)則
- 先到根路由urls.py文件中定義規(guī)則,交給自定義應(yīng)用的子路由
url(r'^', include('myhome.urls')) - 定義子路由器,在自定義應(yīng)用中創(chuàng)建一個(gè)urls.py文件,并添加路由規(guī)則
url(r'^', views.hello),其中url函數(shù)三個(gè)參數(shù),第一個(gè)為路由規(guī)則,第二個(gè)為指定的視圖函數(shù)
- 先到根路由urls.py文件中定義規(guī)則,交給自定義應(yīng)用的子路由
啟動(dòng)服務(wù),開(kāi)始訪問(wèn)
請(qǐng)求、訪問(wèn)過(guò)程
1. 當(dāng)用戶在瀏覽器中訪問(wèn)url地址時(shí),服務(wù)器接收請(qǐng)求
2. --> 交給根路由進(jìn)行匹配
3. --> 交給子路由進(jìn)行url地址匹配
4. --> 子路由調(diào)用相應(yīng)的視圖函數(shù)
5. --> 視圖函數(shù)進(jìn)行執(zhí)行,開(kāi)始響應(yīng)
4. 使用模板
-
配置模板引擎
- 找到項(xiàng)目配置文件 settings.py
- 修改templates的配置項(xiàng)中的DIRS為:
'DIRS':[os.path.join(BASE_DIR,'templates')]
在manage.py文件的同級(jí)目錄下創(chuàng)建一個(gè)templates的文件夾,里面放置模板文件,即html文件
在視圖函數(shù)中使用render函數(shù)加載模板
def tmp(request):
return render(request,'t.html')
# 其中render函數(shù)有三個(gè)參數(shù),1-請(qǐng)求對(duì)象,為固定寫法;2-模板路徑;3-傳入模板的數(shù)據(jù)(字典類型)
5. 路由規(guī)則 ???
基本規(guī)則
- 路由按照從上至下的順序執(zhí)行
- 路由中可以使用()來(lái)捕獲 url 請(qǐng)求中的一部分作為參數(shù)來(lái)使用,例如
# 請(qǐng)求路徑:http://127.0.0.1:9000/articles/2014/
# 路由規(guī)則
url(r'^articles/([0-9]{4})/$', views.year_archive),
# 視圖函數(shù)
def year_archive(request,y):
print(y)
return HttpResponse('year_archive')
注意:在有()的正則路由規(guī)則中,對(duì)應(yīng)的視圖函數(shù)中必須用形參來(lái)接收()中的傳入的參數(shù)
正則表達(dá)式命名組
以上的路由規(guī)則中,對(duì)視圖函數(shù)的接收沒(méi)有命名要求,形參的名字可以隨意更改,但是命名組規(guī)則要求視圖函數(shù)中接收參數(shù)的形參必須為規(guī)定的名稱,例如
# 路由規(guī)則
url(r'^abc/(?P<year>[0-9]{4})/$', views.abc_2003),
# 視圖函數(shù)
def abc_2003(request,year):
print(year)
return HttpResponse('abc_2003')
默認(rèn)值參數(shù)
使用兩個(gè)路由規(guī)則,指向同一個(gè)視圖函數(shù)
# 路由規(guī)則
url(r'^user/list/$', views.userlist),
url(r'^user/list/(?P<page>[0-9]+)/$', views.userlist),
# 視圖函數(shù)
def userlist(request,page=1):
print(page)
return HttpResponse('userlist')
url的反向解析 ?????
通過(guò)路由規(guī)則的名(name),動(dòng)態(tài)解析路由的地址
如果在視圖、模板中使用硬編碼(直接寫死請(qǐng)求地址)的鏈接,在你url發(fā)生改變時(shí),維護(hù)是意見(jiàn)非常麻煩的事情
# 為了能夠動(dòng)態(tài)的解析url的規(guī)則,可以在定義路由規(guī)則時(shí),給路由器起一個(gè)名字(name)
# 路由規(guī)則
url(r'^goods/list/$', views.goodslist,name='glist'),
# 然后可以在視圖和模板中通過(guò)反向解析動(dòng)態(tài)的獲取路由解析地址
# 視圖函數(shù)
def hello(request):
# 視圖函數(shù)中進(jìn)行反向解析,獲取url地址,需要提前導(dǎo)入reverse
# from django.core.urlresolvers import reverse
r1 = reverse('goods')
r2 = reverse('order')
print(r1,r2)
return render(request, 't.html')
# 模板
<a href="{% url 'glist' %}">商品列表:反向解析格式</a>
注意:路由規(guī)則中如果有參數(shù)要求,那么模板中在使用url進(jìn)行反向解析時(shí),必須給參數(shù)
<a href="{% url 'olist' 100 %}">訂單列表:反向解析格式</a>
反向解析是路由中的重中之重,必須要搞清楚!
6. 模型關(guān)系 ????
一對(duì)一(人對(duì)應(yīng)身份證)
定義
一對(duì)一關(guān)系指模型的關(guān)系時(shí)一一對(duì)應(yīng)的,例如:
- 一個(gè)用戶對(duì)應(yīng)一條用戶詳細(xì)信息
- 一個(gè)身份證對(duì)應(yīng)一個(gè)人
- 一個(gè)微信號(hào)對(duì)應(yīng)一個(gè)用戶
二者一一對(duì)應(yīng),如果有一個(gè)用戶的詳細(xì)信息,必對(duì)應(yīng)一個(gè)用戶
創(chuàng)建模型
- 在建立模型時(shí)建立兩個(gè)模型,在其中一個(gè)模型中加入外鍵
- 在模型中使用
models.OneToOneField(關(guān)聯(lián)的模型名,是否關(guān)聯(lián)刪除)來(lái)建立外鍵,沒(méi)有外鍵的為主數(shù)據(jù),有外鍵的為副數(shù)據(jù)
# 模型關(guān)系 一對(duì)一
# 用戶模型
class User(models.Model):
username = models.CharField(max_length=50)
age = models.IntegerField()
# 用戶詳情
class UserInfo(models.Model):
# 此語(yǔ)句為創(chuàng)建外鍵
uid = models.OneToOneField(User,on_delete=models.CASCADE)
xueli = models.CharField(max_length=50)
yuanxiao = models.CharField(max_length=5)
增刪查
-
增加
一對(duì)一模型進(jìn)行增加時(shí)不需要特殊注意,直接進(jìn)行增加,Django框架會(huì)自動(dòng)將兩個(gè)模型創(chuàng)建的數(shù)據(jù)進(jìn)行關(guān)聯(lián) -
刪除
一對(duì)一模型在進(jìn)行數(shù)據(jù)刪除時(shí),如果刪除的是主數(shù)據(jù),則副數(shù)據(jù)也會(huì)被刪除;如果副數(shù)據(jù)被刪除,主數(shù)據(jù)則不會(huì)被刪除 -
查詢
一對(duì)一模型在進(jìn)行數(shù)據(jù)查詢時(shí)有兩種方法:- 通過(guò)主數(shù)據(jù)查找副數(shù)據(jù):
主數(shù)據(jù)對(duì)象.副數(shù)據(jù)類名(小寫).查詢的屬性名 - 通過(guò)副數(shù)據(jù)查找主數(shù)據(jù):
副數(shù)據(jù)對(duì)象.外鍵名.查詢的屬性名
- 通過(guò)主數(shù)據(jù)查找副數(shù)據(jù):
# 模型關(guān)系:一對(duì)一
def one(request):
# 添加
# # 創(chuàng)建用戶
data = {'username':'燕小六','age':20}
user = User.objects.create(**data)
# 創(chuàng)建詳情
infodata = {'uid':user,'xueli':'本科','yuanxiao':'家里蹲'}
info = UserInfo.objects.create(**infodata)
# 刪除
# 刪除用戶時(shí)會(huì)關(guān)聯(lián)刪除對(duì)應(yīng)的詳情數(shù)據(jù)
user = User.objects.first()
user.delete()
# 刪除詳細(xì)信息,用戶不會(huì)被刪除
ui = UserInfo.objects.first()
ui.delete()
# 查詢
# 根據(jù)用戶獲取詳細(xì)信息
user = User.objects.first()
print(user.username)
print(user.userinfo.xueli)
# # 根據(jù)詳細(xì)信息獲取用戶信息
ui = UserInfo.objects.first()
print(ui.xueli)
print(ui.uid.username)
return HttpResponse('<h1>模型關(guān)系:一對(duì)一<h1>')
一對(duì)多(商品分類對(duì)應(yīng)分類下的商品) ????
定義
- 一個(gè)商品分類對(duì)應(yīng)多個(gè)商品
- 一個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)生
- 一個(gè)國(guó)家對(duì)應(yīng)多個(gè)城市
創(chuàng)建模型
- 在建立模型時(shí)建立兩個(gè)模型,在商品中加入外鍵
- 在模型中使用
models.ForeignKey(關(guān)聯(lián)的模型名)來(lái)建立外鍵
# 模型關(guān)系:一對(duì)多
# 商品類別
class Classify(models.Model):
name = models.CharField(max_length=50)
# 商品
class Goods(models.Model):
# 設(shè)置外鍵,第二個(gè)參數(shù)為可選
cid = models.ForeignKey(to="Classify", to_field="id")
title = models.CharField(max_length=50)
price = models.IntegerField()
def __str__(self):
return self.title
增刪查
-
增加
增加時(shí)不需要特殊注意,直接進(jìn)行增加,Django框架會(huì)自動(dòng)將兩個(gè)模型創(chuàng)建的數(shù)據(jù)進(jìn)行關(guān)聯(lián) -
刪除
如果刪除的是商品分類,則分類下的商品也會(huì)被刪除;如果分類下的商品被刪除,商品分類則不會(huì)被刪除 -
查詢
一對(duì)一模型在進(jìn)行數(shù)據(jù)查詢時(shí)有兩種方法:- 獲取商品分類下所有商品:
商品分類.商品類名(小寫)_set.all() - 獲取商品所屬分類:
商品對(duì)象.外鍵名.查找的屬性
- 獲取商品分類下所有商品:
# 模型關(guān)系:一對(duì)多
def two(request):
# 添加
# 創(chuàng)建商品分類
c = Classify.objects.create(**{'name':'手機(jī)'})
# 創(chuàng)建商品
g1 = Goods.objects.create(**{'cid':c,'title':'小米8','price':'2399'})
g1 = Goods.objects.create(**{'cid':c,'title':'華為P20','price':'4399'})
g1 = Goods.objects.create(**{'cid':c,'title':'OPPO Find X','price':'4999'})
# 刪除
c = Classify.objects.last()
c.delete()
# 查詢
# 根據(jù)分類獲取下面所有的商品
c = Classify.objects.first()
print(c.name)
print(c.goods_set.all())
# 根據(jù)商品獲取其分類
g = Goods.objects.first()
print(g.title)
print(g.cid.name)
return HttpResponse('模型關(guān)系:一對(duì)多')
多對(duì)多(一本書對(duì)應(yīng)多個(gè)標(biāo)簽,一個(gè)標(biāo)簽對(duì)應(yīng)多本書) ????
定義
- 一本書對(duì)應(yīng)多個(gè)標(biāo)簽,一個(gè)標(biāo)簽對(duì)應(yīng)多本書
- 一個(gè)老師對(duì)應(yīng)多個(gè)班級(jí),一個(gè)班級(jí)對(duì)應(yīng)多個(gè)老師
創(chuàng)建模型
- 需要用到第三張表,而不是單單在表中添加外鍵
- 第三張表用來(lái)記錄書和標(biāo)簽互相的關(guān)系
- 在模型中使用
models.ManyToManyField(關(guān)聯(lián)的模型名)來(lái)建立對(duì)多對(duì)關(guān)系,且定義在任意模型中即可
# 模型關(guān)系:多對(duì)多
# 書
class Books(models.Model):
title = models.CharField(max_length=50)
def __str__(self):
return self.title
class Tags(models.Model):
name = models.CharField(max_length=50)
# 設(shè)置關(guān)系語(yǔ)句
bid = models.ManyToManyField(to="Books")
def __str__(self):
return self.name
增刪查
-
增加
增加時(shí)需要進(jìn)行關(guān)系聲明,且方式取決于關(guān)系語(yǔ)句設(shè)置在哪個(gè)模板中,以上面代碼為例- 給書添加標(biāo)簽:
書對(duì)象.tags_set.set([標(biāo)簽對(duì)象1,標(biāo)簽對(duì)象2,...]) - 給標(biāo)簽添加書:
標(biāo)簽對(duì)象.bid.add(書對(duì)象1,書對(duì)象2,...) - 多對(duì)多關(guān)系設(shè)置方法:
- .set([對(duì)象1,對(duì)象2,...]) 添加關(guān)系
- .add(對(duì)象1,對(duì)象2,...) 添加關(guān)系
- .clear() 清空關(guān)系
- 給書添加標(biāo)簽:
-
刪除
- 無(wú)論刪除書或標(biāo)簽,表3中相應(yīng)的關(guān)系記錄都會(huì)關(guān)聯(lián)刪除
- .clear() 清空指定對(duì)象的所有關(guān)系
-
查詢
- 獲取一本書的所有標(biāo)簽:
書對(duì)象.tags_set.all() - 獲取一個(gè)標(biāo)簽下的所有書:
標(biāo)簽對(duì)象.bid.all()
- 獲取一本書的所有標(biāo)簽:
7. 模型查詢
1. 查詢集
- 在管理器上調(diào)用過(guò)濾器方法會(huì)返回查詢集,查詢集表示從數(shù)據(jù)庫(kù)中獲取的對(duì)象集合
- 查詢集經(jīng)過(guò)過(guò)濾器篩選后返回新的查詢集,因此可以寫成鏈?zhǔn)竭^(guò)濾
- 惰性執(zhí)行:創(chuàng)建查詢集不會(huì)帶來(lái)任何數(shù)據(jù)庫(kù)的訪問(wèn),直到調(diào)用數(shù)據(jù)時(shí),才會(huì)訪問(wèn)數(shù)據(jù)庫(kù)
- 何時(shí)對(duì)查詢集求值:迭代,序列化,與if合用
- 返回查詢集的方法,稱為過(guò)濾器
- all(): 獲取所有的返回值
- filter(): 過(guò)濾掉不符合條件的值
filter(鍵1=值1,鍵2=值2)==filter(鍵1=值1).filter(鍵2=值2) - exclude(): 獲取除了滿足條件之外的值
- order_by(): 分組返回值根據(jù)條件進(jìn)行排序
- values(): 一個(gè)對(duì)象構(gòu)成一個(gè)字典,然后構(gòu)成一個(gè)列表返回
返回單個(gè)值
- get(): 返回單個(gè)滿足條件的對(duì)象
- 如果未找到則引發(fā)
模型類.DoesNotExist異常 - 如果返回多條,會(huì)引發(fā)"模型類.MultipleObjectsReturned"異常
- 如果未找到則引發(fā)
- count(): 返回當(dāng)前查詢的總條數(shù)
- first(): 返回第一個(gè)對(duì)象
- last(): 返回最后一個(gè)對(duì)象
- exists(): 判斷查詢集中是否有數(shù)據(jù),如果有返回True,反之返回False
限制查詢集
- 查詢集返回列表,可以使用下標(biāo)的方式進(jìn)行限制,等同于sql中的limit和offset子句
- 注意:不支持負(fù)數(shù)索引
- 使用下標(biāo)后返回一個(gè)新的查詢集,不會(huì)立即執(zhí)行查詢
- 如果獲取一個(gè)對(duì)象,直接使用[0],等同于[0:1].get(),但是如果沒(méi)有數(shù)據(jù),[0]引發(fā)IndexError異常,[0:1].get()引發(fā)DoesNotExist異常
#這會(huì)返回前5個(gè)對(duì)象 LIMIT 5
Entry.objects.all()[:5]
#這將返回第六個(gè)到第十個(gè)對(duì)象 OFFSET 5 LIMIT 5
Entry.objects.all()[5:10]
2. 字段查詢
- 實(shí)現(xiàn)where子名,作為方法filter()、exclude()、get()的參數(shù)
- 語(yǔ)法:屬性名稱__比較運(yùn)算符=值
- 表示兩個(gè)下劃線,左側(cè)是屬性名稱,右側(cè)是比較類型
- 對(duì)于外鍵,使用“屬性名_id”表示外鍵的原始值
- 轉(zhuǎn)義:like語(yǔ)句中使用了%與,匹配數(shù)據(jù)中的%與,在過(guò)濾器中直接寫,例如:filter(title__contains="%")=>where title like '%%%',表示查找標(biāo)題中包含%的
比較運(yùn)算符
- exact:判斷等,區(qū)分大小寫;如果沒(méi)有寫'比較運(yùn)算符',表示判斷等
filter(isDelete=False)
- contains:是否包含,區(qū)分大小寫
exclude(btitle__contains='傳')
- startwith\endswith:以value開(kāi)頭或結(jié)尾,區(qū)分大小寫
exclude(btitle__endswith='傳')
- isnull\isnotnull:判斷是否為null
filter(btitle__isnull=False)
在前面加個(gè)i表示不區(qū)分大小寫,如iexact、icontains、istarswith、iendswith
in:是否包含在范圍內(nèi)
filter(pk__in=[1, 2, 3, 4, 5])
- gt、gte、lt、lte:大于、大于等于、小于、小于等于
filter(id__gt=3)
- year、month、day、week_day、hour、minute、second:對(duì)日期間類型的屬性進(jìn)行運(yùn)算
filter(bpub_date__year=1980)
filter(bpub_date__gt=date(1980, 12, 31))
8.View視圖
1. GET\POST
一鍵一值
# 這種方式當(dāng)鍵不存在或多個(gè)鍵時(shí)會(huì)報(bào)錯(cuò)
request.GET['name']
# 這種方式None為默認(rèn)值,如果數(shù)據(jù)不存在則返回默認(rèn)值
request.GET.get('name',None)
request.POST['name']
request.POST.get('name',None)
一鍵多值
# 返回值為一個(gè)列表
request.GET.getlist('name',None)
request.POST.getlist('name',None)
2. HttpResponse對(duì)象
- 在django.http模塊中定義了HttpResponse對(duì)象的API
- HttpRequest對(duì)象由Django自動(dòng)創(chuàng)建,HttpResponse對(duì)象由程序員創(chuàng)建
- 在每一個(gè)視圖函數(shù)中必須返回一個(gè)HttpResponse對(duì)象,當(dāng)然也可以是HttpResponse子對(duì)象
3. HttpResponse
- 不使用模板,直接返回?cái)?shù)據(jù)
- 返回?cái)?shù)據(jù)類型為字符串
- 如果字符串中是標(biāo)簽,瀏覽器可以進(jìn)行解析
return HttoResponse('你好')
4. render
- 調(diào)用模板返回?cái)?shù)據(jù)
- 參數(shù)1:request,固定形式
- 參數(shù)2:'模板路徑',即html文件的路徑
- 參數(shù)3:字典類型的數(shù)據(jù),用于傳入模板中
return render(request,'user/edit.html',{'info':'你好'})
5. 子類 HttpResponseRedirect
- 重定向,服務(wù)器端跳轉(zhuǎn)
- 構(gòu)造函數(shù)的第一個(gè)參數(shù)用來(lái)指定重定向的地址
- 可以簡(jiǎn)寫為 redirect
return redirect(reverse('myindex')
6. 子類 JsonResponse
- 返回json書,一般用于異步請(qǐng)求
- 幫助用戶創(chuàng)建JSON編碼的響應(yīng)
- JsonResponse的默認(rèn)類型為application/json
- 參數(shù)1:字典類型數(shù)據(jù)
- 參數(shù)2:safe=True/False,默認(rèn)為True,False表示關(guān)閉數(shù)據(jù)安全,參數(shù)1可以傳入非字典類型
return JsonResponse([{'list': 'abc'},{'d': 'ac'}],safe=False)
7. set_cookie 方法
- Cookie 是由 Web 服務(wù)器保存在用戶瀏覽器(客戶端)上的小文本文件,它可以包含有關(guān)用戶的信息。
- 服務(wù)器可以利用Cookies包含信息的任意性來(lái)篩選并經(jīng)常性維護(hù)這些信息,以判斷在HTTP傳輸中的狀態(tài)。
- Cookies最典型的應(yīng)用是判定注冊(cè)用戶是否已經(jīng)登錄網(wǎng)站
- 設(shè)置cookie
# 設(shè)置cookie
def setcok(request):
# 獲取當(dāng)前的 響應(yīng)對(duì)象
res = HttpResponse('設(shè)置cookie')
# 使用響應(yīng)對(duì)象進(jìn)行cookie的設(shè)置
res.set_cookie('a', 'abcd')
# 返回響應(yīng)對(duì)象
res.set_cookie('c', 'cdef')
return res
- 獲取cookie
# 獲取cookie
def getcok(request):
cok = request.COOKIES.get('a', None)
return HttpResponse(cok)
8. set_session 方法
- sesison方式所有數(shù)據(jù)存儲(chǔ)在服務(wù)器端,在客戶端cookie中存儲(chǔ)唯一的身份標(biāo)識(shí)
- 當(dāng)用戶進(jìn)行請(qǐng)求時(shí),判斷cookie中的唯一標(biāo)識(shí)符是否與用戶請(qǐng)求中攜帶的唯一標(biāo)識(shí)符相同
- 認(rèn)證成功后頁(yè)面可以調(diào)用session中的所有內(nèi)容
- 向?qū)τ赾ookie更加安全,信息不容易被截獲
- 存儲(chǔ)的內(nèi)容比cookie更加豐富
- 開(kāi)啟session
- 使用django-admin startproject創(chuàng)建的項(xiàng)目默認(rèn)啟用
- 禁用會(huì)話:刪除下面指定的兩個(gè)值,禁用會(huì)話將節(jié)省一些性能消耗
- Django 中session需要依賴數(shù)據(jù)庫(kù),因此需要確認(rèn)數(shù)據(jù)庫(kù)中是否存在 與session相關(guān)的 表
- 在settings.py文件中
* 向INSTALLED_APPS列表中添加:
* 'django.contrib.sessions',
* 項(xiàng)MIDDLEWARE_CLASSES列表中添加:
* 'django.contrib.sessions.middleware.SessionMiddleware',
- 設(shè)置session
# 設(shè)置session
def setsess(request):
# 設(shè)置session
request.session['user'] = {'username':'李四','userid':'12314','age':20}
request.session['vip'] = {'username':'王五','userid':'12314','age':20}
return HttpResponse('設(shè)置session')
- 獲取session
# 獲取session
def getsess(request):
res = request.session.get('user',None)
if res:
return HttpResponse('歡迎'+res['username'])
else:
return HttpResponse('請(qǐng)登錄')
- 刪除session
# 刪除session
def outsess(request):
# 刪除會(huì)話中的一個(gè)key;注意:刪除時(shí),如果不存在,則報(bào)錯(cuò)
# del request.session['user']
# 清除所有會(huì)話信息,但不會(huì)刪除會(huì)話記錄,會(huì)話依然存在
# request.session.clear()
# 刪除當(dāng)前的會(huì)話所有的數(shù)據(jù)及記錄
# request.session.flush()
return HttpResponse('退出')
- session配置
在 settings.py 文件中進(jìn)行設(shè)置:
# session 設(shè)置
SESSION_COOKIE_AGE = 60 * 30 # 30分鐘
SESSION_SAVE_EVERY_REQUEST = True #如果SESSION_SAVE_EVERY_REQUEST是True,會(huì)話cookie將在每個(gè)請(qǐng)求中發(fā)送
SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 關(guān)閉瀏覽器,則COOKIE失效
#來(lái)自 <https://docs.djangoproject.com/en/1.11/topics/http/sessions/>
以下設(shè)置為:10秒后過(guò)期
# request.session['abc'] = 'abcdef'
# request.session.set_expiry(10)
Ajax 實(shí)例
四級(jí)城市聯(lián)動(dòng) - 思路
前提:
創(chuàng)建模型
填充數(shù)據(jù)
配置靜態(tài)文件
1. 定義路由,獲取一級(jí)城市數(shù)據(jù),返回城市聯(lián)動(dòng)的html頁(yè)面
2. 在html頁(yè)面中循環(huán)并顯示一級(jí)城市數(shù)據(jù)
3. 定義一個(gè)路由,接收ajax請(qǐng)求
4. 在視圖函數(shù)中接收頁(yè)面?zhèn)骰氐倪x項(xiàng)id,回去下一級(jí)數(shù)據(jù),并返回json格式
5. 在html的頁(yè)面中動(dòng)態(tài)綁定change事件,獲取id,發(fā)送ajax請(qǐng)求
6. 在ajax中判斷是否有返回?cái)?shù)據(jù):如果有,返回?cái)?shù)據(jù),并動(dòng)態(tài)創(chuàng)建下拉框,添加數(shù)據(jù)
注意:
最后一級(jí)沒(méi)有數(shù)據(jù),但是創(chuàng)建選框;解決:在返回?cái)?shù)據(jù)時(shí)進(jìn)行判斷
每次選擇元素都創(chuàng)建新的選項(xiàng)框,不會(huì)刪除原來(lái)的選項(xiàng)框
解決:當(dāng)選中元素時(shí),移除當(dāng)前元素之后的所有元素