01-Django學(xué)習(xí)筆記

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.pymodels.py

啟動(dòng)項(xiàng)目 ???

  • 在終端中輸入命令行:python3 manage.py runserver
  • 之后終端中會(huì)返回地址,一般都為本地地址:http://127.0.0.1:8000

輸出一個(gè) Hello World 的過(guò)程

  1. 創(chuàng)建應(yīng)用:python3 manage.py startapp myhome
  2. 在應(yīng)用文件夾中找到視圖函數(shù) views.py
  3. 定義視圖函數(shù)
def hello(request):
    return HttpResponse('hello world')
  1. 注意:需要導(dǎo)入 HttpResponse:from django.http import HttpResponse

  2. 定義路由規(guī)則

    1. 先到根路由urls.py文件中定義規(guī)則,交給自定義應(yīng)用的子路由url(r'^', include('myhome.urls'))
    2. 定義子路由器,在自定義應(yīng)用中創(chuàng)建一個(gè)urls.py文件,并添加路由規(guī)則url(r'^', views.hello),其中url函數(shù)三個(gè)參數(shù),第一個(gè)為路由規(guī)則,第二個(gè)為指定的視圖函數(shù)
  3. 啟動(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. 使用模板

  1. 配置模板引擎

    1. 找到項(xiàng)目配置文件 settings.py
    2. 修改templates的配置項(xiàng)中的DIRS為:'DIRS':[os.path.join(BASE_DIR,'templates')]
  2. 在manage.py文件的同級(jí)目錄下創(chuàng)建一個(gè)templates的文件夾,里面放置模板文件,即html文件

  3. 在視圖函數(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ī)則

  1. 路由按照從上至下的順序執(zhí)行
  2. 路由中可以使用()來(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)

增刪查

  1. 增加
    一對(duì)一模型進(jìn)行增加時(shí)不需要特殊注意,直接進(jìn)行增加,Django框架會(huì)自動(dòng)將兩個(gè)模型創(chuàng)建的數(shù)據(jù)進(jìn)行關(guān)聯(lián)
  2. 刪除
    一對(duì)一模型在進(jìn)行數(shù)據(jù)刪除時(shí),如果刪除的是主數(shù)據(jù),則副數(shù)據(jù)也會(huì)被刪除;如果副數(shù)據(jù)被刪除,主數(shù)據(jù)則不會(huì)被刪除
  3. 查詢
    一對(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ā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

增刪查

  1. 增加
    增加時(shí)不需要特殊注意,直接進(jìn)行增加,Django框架會(huì)自動(dòng)將兩個(gè)模型創(chuàng)建的數(shù)據(jù)進(jìn)行關(guān)聯(lián)
  2. 刪除
    如果刪除的是商品分類,則分類下的商品也會(huì)被刪除;如果分類下的商品被刪除,商品分類則不會(huì)被刪除
  3. 查詢
    一對(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

增刪查

  1. 增加
    增加時(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)系
  2. 刪除
    • 無(wú)論刪除書或標(biāo)簽,表3中相應(yīng)的關(guān)系記錄都會(huì)關(guān)聯(lián)刪除
    • .clear() 清空指定對(duì)象的所有關(guān)系
  3. 查詢
    • 獲取一本書的所有標(biāo)簽:書對(duì)象.tags_set.all()
    • 獲取一個(gè)標(biāo)簽下的所有書:標(biāo)簽對(duì)象.bid.all()

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"異常
  • 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)算符

  1. exact:判斷等,區(qū)分大小寫;如果沒(méi)有寫'比較運(yùn)算符',表示判斷等
filter(isDelete=False)
  1. contains:是否包含,區(qū)分大小寫
exclude(btitle__contains='傳')
  1. startwith\endswith:以value開(kāi)頭或結(jié)尾,區(qū)分大小寫
exclude(btitle__endswith='傳')
  1. isnull\isnotnull:判斷是否為null
filter(btitle__isnull=False)
  1. 在前面加個(gè)i表示不區(qū)分大小寫,如iexact、icontains、istarswith、iendswith

  2. in:是否包含在范圍內(nèi)

filter(pk__in=[1, 2, 3, 4, 5])
  1. gt、gte、lt、lte:大于、大于等于、小于、小于等于
filter(id__gt=3)
  1. 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ì)象

  1. 在django.http模塊中定義了HttpResponse對(duì)象的API
  2. HttpRequest對(duì)象由Django自動(dòng)創(chuàng)建,HttpResponse對(duì)象由程序員創(chuàng)建
  3. 在每一個(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)站
  1. 設(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
  1. 獲取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更加豐富
  1. 開(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',
  1. 設(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')
  1. 獲取session
# 獲取session
def getsess(request):
    res = request.session.get('user',None)
    if res:
        return HttpResponse('歡迎'+res['username'])
    else:
        return HttpResponse('請(qǐng)登錄')
  1. 刪除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('退出')
  1. 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)前元素之后的所有元素
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容