1. 內容回顧 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放數據 修改數據的惟一方式 異步操做 修改state中數據的步驟: 1. 頁面上交互 觸發數據的變化 2. 去後端獲取新的數據(異步操做 ajax請求) 3. dispatch('獲取新數據') --> 放在actions中 4. 拿到了新數據了 5. 去更新state中對應的數據(同步操做 state.noteList=[xx,xx,xx])--> 放在mutations中 添加新筆記 1. 把新的筆記數據發送到後端 dispatch('添加新筆記數據') --> dispatch('從新拉取筆記數據') --> commit('大倉庫添加筆記')
舉例:css
新建一個項目mysite,修改urls.py,增長路徑html
from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index), path('ajax_test/', views.ajax_test), ]
修改views.py,增長視圖函數前端
from django.shortcuts import render from django.http import JsonResponse # Create your views here. def index(request): return render(request,"index.html") def ajax_test(request): return JsonResponse({"code":0})
增長index.html,注意:ajax的路徑是故意寫錯的python
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <button id="b1">點我</button> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> <script> function sendAjax() { //發送ajax請求 $.ajax({ url: '/ajax_123/', type: 'get', success: function (res) { console.log('成功咯!'); console.log(res); }, error:function (err) { console.log('出錯啦!'); console.log(err); } }) }; $('#b1').click(function () { var ret = sendAjax(); //執行方法 console.log(ret); }); </script> </body> </html>
啓動django項目,訪問首頁,點擊按鈕jquery
發現ret的值爲undefined,執行sendAjax方法時,沒法知道異步請求的狀態是成功仍是失敗git
修改成正確的url,改成ajax_testgithub
刷新頁面,再次點擊面試
發現ret的值仍是爲undefined,爲何呢?由於ajax是異步請求。ret不會等待ajax請求完畢,就直接執行下面一行,因此輸出undefined。ajax
因此說,ajax不能向上面那樣封裝函數!若是不封裝函數,代碼有多是這樣的sql
$.ajax({ url: '/ajax_123/', type: 'get', success: function (res) { $.ajax({ url: '/ajax_456/', type: 'get', success: function (res) { ... }, error:function (err) { ... } }) }, error:function (err) { ... } })
代碼太冗長了,必需要封裝函數。
針對不能獲取值的問題,使用Promise,就能夠解決!
Promise,他是一個對象,是用來處理異步操做的,可讓咱們寫異步調用的時候寫起來更加優雅,更加美觀便於閱讀。顧名思義爲承諾、許諾的意思,意思是使用了Promise以後他確定會給咱們答覆,不管成功或者失敗都會給咱們一個答覆,因此咱們就不用擔憂他跑了哈哈。因此,Promise有三種狀態:pending(進行中),resolved(完成),rejected(失敗)。只有異步返回的結構能夠改變其狀態。因此,promise的過程通常只有兩種:pending->resolved或者pending->rejected。
promise對象還有一個比較經常使用的then方法,用來執行回調函數,then方法接受兩個參數,第一個是成功的resolved的回調,另外一個是失敗rejected的回調,第二個失敗的回調參數可選。而且then方法裏也能夠返回promise對象,這樣就能夠鏈式調用了。接下來上代碼:
修改index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <button id="b1">點我</button> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> <script> function sendAjax(arg) { return new Promise(function (resolve, reject) { $.ajax({ url: arg, type: 'get', success: function (res) { console.log("成功咯"); resolve(res) }, error:function (err) { console.log("出錯啦"); reject(err) } }) }) }; $('#b1').click(function () { //執行方法,指定url爲/ajax_test/ var ret = sendAjax('/ajax_test/'); ret.then(function (value) { //成功時,執行 console.log(value); }).catch(function (err) { //失敗時,執行 console.log(err) }); }) </script> </body> </html>
上邊代碼中,定義了一個ret變量,而後執行sendAjax函數,函數返回一個Promise對象,而後對象裏邊接收一個匿名函數,分別把resolve跟reject方法當參數傳進去,用ajax來模擬異步請求
當執行resolve方法後就會調用then方法的一個函數。結果以下:
這樣的話,就能夠指定ajax異步請求的狀態是成功仍是失敗。
在小程序應用中,會大量應用到Promise。
若是想往前端方向發展,有一個面試題,手寫一個promise。固然不是上面的代碼,而是寫底層原理!
箭頭函數就是個簡寫形式的函數表達式,而且它擁有詞法做用域的this值(即不會新產生本身做用域下的this,arguments,super和new.target等對象)。此外,箭頭函數老是匿名的。
基礎語法
(param1, param2, …, paramN) => { statements } (param1, param2, …, paramN) => expression // equivalent to: => { return expression; } // 若是隻有一個參數,圓括號是可選的: (singleParam) => { statements } singleParam => { statements } // 無參數的函數須要使用圓括號: () => { statements }
each() 方法爲每一個匹配元素規定要運行的函數。
提示:返回 false 可用於及早中止循環。
$(selector).each(function(index,element))
舉例:打印this
修改index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <button id="b1">點我</button><br/> <hr> <div>div1</div> <div>div2</div> <div>div3</div> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> <script> $('#b1').click(function () { console.log(this); //this指的是button $("div").each(function () { //循環遍歷div console.log(this); //this指的是div }) }) </script> </body> </html>
刷新網頁,點擊按鈕,查看console
注意:這2個this是不同的。上面的this是butthon,下面的this是div
通常請求下,若是想讓$("div").each(function () {...}這裏面的代碼獲取到button按鈕,
須要在上層定義個變量_this=$(this),而後下面調用_this就能夠了。
可是這樣作比較麻煩,使用箭頭函數,就能夠解決
將匿名函數改爲箭頭函數
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <button id="b1">點我</button><br/> <hr> <div>div1</div> <div>div2</div> <div>div3</div> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> <script> $('#b1').click(function () { console.log(this); //this指的是button $("div").each(()=> { //循環遍歷div console.log(this); }) }) </script> </body> </html>
刷新網頁,從新點擊,效果以下:
總結:
想要內層的this和外層的this同樣,使用箭頭函數,就能夠實現!將匿名函數換成箭頭函數
FBV(function base views) 就是在視圖裏使用函數處理請求。
看代碼:
views.py
def index(request): if request.method == "POST": print(request.POST) # 修改數據庫 return JsonResponse("OK") return render(request, "index.html") def index2(request): if request.method == "GET": return render(request, "index.html") print(request.POST) # 修改數據庫 return JsonResponse("OK")
上面就是FBV的使用。
這2個視圖函數,都是實現一樣的功能!
那麼問題來了,哪一個更好一點呢?
答案是第一種,爲何呢?在咱們的現有的理念裏面,只知道GET和POST。因此這2個視圖函數,是沒有任何區別的。
可是若是一旦上線,對於我的用戶,它能夠發送其餘類型的,好比PUT。那麼線上就會報錯!
因此:對於比較重大的操做,好比修改數據庫,使用if單獨判斷請求類型!
那麼咱們推薦使用第一種方式!
若是想使用第二種方式,則須要使用if分支判斷,這樣更嚴謹一點。
def index2(request): if request.method == "GET": return render(request, "index.html") elif request.method == "POST": print(request.POST) # 修改數據庫 return JsonResponse("OK")
CBV(class base views) 就是在視圖裏使用類處理請求。
將上述代碼中的views.py 修改成以下:
from django import views class index(views.View): def get(self,request): return render(request, "index.html") def post(self,request): print(request.POST) # 修改數據庫 return JsonResponse("OK")
注意事項:
1. CBV定義必定要繼承django.views.View
2. 註冊路由的時候要寫 類名.as_view()
3. 具體原理是:dispatch()方法 中 利用反射 找到 每一個請求要執行的方法
更多詳細介紹,請參考連接:
http://www.javashuo.com/article/p-wvtgwopo-bg.html
django-rest-framework是一個功能強大且靈活的工具包,用於構建Web API。
您可能但願使用REST框架的一些緣由:
http://www.django-rest-framework.org/
https://q1mi.github.io/Django-REST-framework-documentation/
上面說了那麼多的 RESTful API,實際上是爲了引出django-rest-framework。它就是專門用來寫API接口的!
通常應用是先後端分離的
前端:
APP、PC網站、手機網頁、手機APP、ipad平板
後端:提供API,返回 JSON格式的數據,就能支撐前端的5種業務!
官方定義以下,強調兩個關鍵點,便可以對接各類客戶端(瀏覽器,移動設備),構建http服務的框架。
Web API最重要的是能夠構建面向各類客戶端的服務。另外與WCF REST Service不一樣在於,Web API利用Http協議的各個方面來表達服務(例如 URI/request response header/caching/versioning/content format),所以就省掉不少配置。
pip install djangorestframework
提示如下信息,表示安裝成功
Installing collected packages: djangorestframework
Successfully installed djangorestframework-3.8.2
在公司開發,通常使用虛擬環境,虛擬環境的安裝,請參考連接:
http://www.javashuo.com/article/p-wvtgwopo-bg.html
安裝虛擬環境以後,安裝django,指定版本爲1.11.11
pip安裝包臨時指定 從國內的清華pip源下載:
pip install django==1.11.11 -i https://pypi.tuna.tsinghua.edu.cn/simple
將虛擬環境的依賴包關係導出到requirements.txt
pip freeze > requirements.txt
注意:約定成熟使用requirements.txt,一些開源的django項目,裏面通常使用這個名字!
查看requirements.txt文件,內容以下:
Django==1.11.11
pytz==2018.5
若是須要按照 requirements.txt 安裝項目依賴的第三方包,使用命令:
pip install -r requirements.txt
新建一個虛擬環境,測試一下,就能夠了!
新建項目時,指定虛擬環境,使用django 1.11.11
修改models.py,增長表
from django.db import models # Create your models here. # 文章表 class Article(models.Model): title = models.CharField(max_length=32) # 文章發佈時間 # auto_now每次更新的時候會把當前時間保存 create_time = models.DateField(auto_now_add=True) # auto_now_add 第一次建立的時候把當前時間保存 update_time = models.DateField(auto_now=True) # 文章的類型 type = models.SmallIntegerField( choices=((1, "原創"), (2, "轉載")), default=1 ) # 來源 school = models.ForeignKey(to='School', on_delete=models.CASCADE) # 標籤 tag = models.ManyToManyField(to='Tag') # 文章來源表 class School(models.Model): name = models.CharField(max_length=16) # 文章標籤表 class Tag(models.Model): name = models.CharField(max_length=16)
說明:
SmallIntegerField
小整數字段,相似於IntegerField,取值範圍依賴於數據庫特性,[-32768 ,32767]的取值範圍對Django所支持的數據庫都是安全的
SmallIntegerField長度是5位,IntegerField長度是10位
choices
用於頁面上的選擇框標籤,須要先提供一個二維的二元元組,第一個元素表示存在數據庫內真實的值,第二個表示頁面上顯示的具體內容。在瀏覽器頁面上將顯示第二個元素的值
auto_now_add和auto_now,對於一個字段而言,不能同時寫,只能有一個!
on_delete=models.CASCADE 表示級聯刪除。也就是說,有關係的記錄,會一併刪除!
ManyToManyField 表示多對多,它會自動建立關係表
使用2個命令,生成表
python manage.py makemigrations
python manage.py migrate
使用navicat打開sqlite3數據庫
執行如下sql語句
# 標籤表 INSERT INTO app01_tag ("id", "name") VALUES (1, 'Python'); INSERT INTO app01_tag ("id", "name") VALUES (2, 'Django'); INSERT INTO app01_tag ("id", "name") VALUES (3, 'Vue'); # 校區表 INSERT INTO app01_school ("id", "name") VALUES (1, '北京校區'); INSERT INTO app01_school ("id", "name") VALUES (2, '上海校區'); INSERT INTO app01_school ("id", "name") VALUES (3, '深圳校區'); # 文章表 INSERT INTO app01_article ("id", "title", "create_time", "type", "school_id", "update_time") VALUES (1, 'Python三年用不上', '2018-07-31', 1, 1, '2018-07-31'); INSERT INTO app01_article ("id", "title", "create_time", "type", "school_id", "update_time") VALUES (2, '你不可能知道Vue有多簡單!', '2018-07-31', 2, 2, '2018-07-31'); INSERT INTO app01_article ("id", "title", "create_time", "type", "school_id", "update_time") VALUES (3, 'MySQL一點都不難', '2018-07-31', 1, 3, '2018-07-31'); # 文章和標籤關係表 INSERT INTO app01_article_tag ("id", "article_id", "tag_id") VALUES (1, 1, 1); INSERT INTO app01_article_tag ("id", "article_id", "tag_id") VALUES (2, 1, 2);
python 原始類型向 json 類型的轉化對照表:
Python | JSON |
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
在項目根目錄下,建立文件date_trans.py
import datetime # 獲取當前時間 now = datetime.datetime.now() print(now, type(now)) #格式化時間,格式爲年-月-日 format_time = now.strftime('%Y-%m-%d') print(format_time, type(format_time))
執行輸出:
2018-07-31 19:07:47.346727 <class 'datetime.datetime'>
2018-07-31 <class 'str'>
能夠發現,格式化以後,數據類型爲字符串
修改urls.py,增長路徑
from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^article_list/', views.article_list), ]
修改views.py,增長視圖函數
from django.shortcuts import render,HttpResponse from django.http import JsonResponse from app01 import models import json # Create your views here. def article_list(request): # 去數據庫查詢全部的文章數據 query_set = models.Article.objects.all().values("id", "title", "create_time", "type", "school__name") # 序列化成json格式 # 1. 先把時間對象轉換成字符串格式 for i in query_set: i["create_time"] = i["create_time"].strftime('%Y-%m-%d') data = json.dumps(list(query_set), ensure_ascii=False) # 返回 return HttpResponse(data)
注意:json只支持7種數據類型,ORM查詢出來的結果爲QuerySet類型,它是不支持的。
日期對象也是不支持的,須要轉化爲字符串。
啓動django項目,訪問url: http://127.0.0.1:8000/article_list/
頁面輸出:
[{"create_time": "2018-07-31", "school__name": "北京校區", "id": 1, "type": 1, "title": "Python三年用不上"}, {"create_time": "2018-07-31", "school__name": "上海校區", "id": 2, "type": 2, "title": "你不可能知道Vue有多簡單!"}, {"create_time": "2018-07-31", "school__name": "深圳校區", "id": 3, "type": 1, "title": "MySQL一點都不難"}]
每個時間,都要轉換爲字符串,太麻煩了。
JsonResponse 對象:
class JsonResponse
(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)
這個類是HttpRespon的子類,它主要和父類的區別在於:
from django.shortcuts import render,HttpResponse from django.http import JsonResponse from app01 import models import json # Create your views here. def article_list(request): # 去數據庫查詢全部的文章數據,返回queryset,每個元素都是字典 query_set = models.Article.objects.all().values("id", "title", "create_time", "type", "school") print(query_set) for i in query_set: print(i) # 學校對象 school_obj = models.School.objects.filter(id=i['school']).first() # 學校id id = school_obj.id # 學校的名字 name = school_obj.name # 修改字典,key爲school的值 i["school"] = {"id": id, "name": name} # 返回json對象,safe=False表示填入任何能被轉換爲JSON格式的對象 return JsonResponse(list(query_set), safe=False)
刷新網頁,頁面輸出:
[{"title": "Python\u4e09\u5e74\u7528\u4e0d\u4e0a", "type": 1, "create_time": "2018-07-31", "school": {"name": "\u5317\u4eac\u6821\u533a", "id": 1}, "id": 1}, {"title": "\u4f60\u4e0d\u53ef\u80fd\u77e5\u9053Vue\u6709\u591a\u7b80\u5355\uff01", "type": 2, "create_time": "2018-07-31", "school": {"name": "\u4e0a\u6d77\u6821\u533a", "id": 2}, "id": 2}, {"title": "MySQL\u4e00\u70b9\u90fd\u4e0d\u96be", "type": 1, "create_time": "2018-07-31", "school": {"name": "\u6df1\u5733\u6821\u533a", "id": 3}, "id": 3}]
使用json格式化工具,效果以下:
它將每個數據類型作了自動轉換。
查看JsonResponse源代碼
def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs): if safe and not isinstance(data, dict): raise TypeError( 'In order to allow non-dict objects to be serialized set the ' 'safe parameter to False.' ) if json_dumps_params is None: json_dumps_params = {} kwargs.setdefault('content_type', 'application/json') data = json.dumps(data, cls=encoder, **json_dumps_params) super(JsonResponse, self).__init__(content=data, **kwargs)
看這一行,是它來處理的。注意:cls表示這個類自己
data = json.dumps(data, cls=encoder, **json_dumps_params)
從上面的代碼中,能夠看出。針對查詢對應的學校信息,使用了for循環。它是一個外鍵字段,
那若是再查詢一個外鍵字段呢?再來一個for循環?代碼太冗長了!
下面會詳細介紹
serializer 容許複雜數據(好比 querysets 和 model 實例)轉換成python數據類型,而後能夠更容易的轉換成 json 或 xml 等。同時,serializer也提供了反序列化功能,容許解析數據轉換成複雜數據類型。
中文文檔連接:
https://q1mi.github.io/Django-REST-framework-documentation/api-guide/serializers_zh/
class DBG(serializers.Serializer): # 聲明序列化器 id = serializers.IntegerField() title = serializers.CharField() create_time = serializers.DateField() type = serializers.IntegerField() school = serializers.CharField(source="school.name")
注意:source="school.name" 表示school表中的name字段
可使用它來序列化和反序列化與DBG對象相應的數據。
聲明一個序列化器看起來很是像聲明一個form。咱們以前學習form組件時,將須要的字段的類型都指定好了!
一般你會想要與Django模型相對應的序列化類。
ModelSerializer
類可以讓你自動建立一個具備模型中相應字段的Serializer
類。
這個ModelSerializer
類和常規的Serializer
類同樣,不一樣的是:
.create()
方法和.update()
方法。
聲明一個ModelSerializer
以下:
class CYM(serializers.ModelSerializer): type = serializers.CharField(source='get_type_display') class Meta: model = models.Article fields = "__all__" # ("id", "title", "type") depth = 1 # 官方推薦不超過10層
默認狀況下,全部的模型的字段都將映射到序列化器上相應的字段。
模型中任何關聯字段好比外鍵都將映射到PrimaryKeyRelatedField
字段。默認狀況下不包括反向關聯,除非像serializer relations文檔中規定的那樣顯示包含。
查看官方文檔
https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.get_FOO_display
對於具備選擇集的每一個字段,該對象將具備一個get_FOO_display()方法,其中FOO是該字段的名稱。 此方法返回字段的「可讀」值。
source='get_type_display' 表獲取type字段中選擇集的值。
不懂?看一下models.py中的Article表,看這一段
# 文章的類型 type = models.SmallIntegerField( choices=((1, "原創"), (2, "轉載")), default=1 )
ORM是查詢表的數據,那麼這個type在真正存儲時,是1或2。
可是我想要獲得"原創"和"轉載",怎麼辦?那就須要我上面提到的get_type_display。
注意:type的變量名和字段名必須保持一致,那麼使用serializers後,結果集中type的值爲"原創"和"轉載",而不是1和2
model = models.Article 表示Article表
fields = "__all__" 表示全部字段,若是須要指定字段。能夠寫成這樣fields = ("id", "title", "type")
depth = 1 表示深度爲1層。有外鍵關聯時,才須要設置depth參數!
由於Article表和School表,是一對多的關係,它們之間的關係只有一層。假設說:School表和另一個表(簡稱B表)有關係。Article表經過School表,要去查詢B表的數據,那麼層數就是2,以此類推!
def article_list(request): # 查詢全部 # 去數據庫查詢全部的文章數據 query_set = models.Article.objects.all() xbg = CYM(query_set, many=True) print(xbg.data) # 返回 return JsonResponse(xbg.data, safe=False)
參數解釋:
many=True 表示能序列化多個對象。
什麼意思?article表有多條數據,每一條數據,就是一個對象。咱們須要查詢表的全部記錄,因此必須指定many=True。返回一條數據時,不須要指定many=True
views.py完整代碼以下:
from django.shortcuts import render,HttpResponse from django.http import JsonResponse from app01 import models import json from rest_framework import serializers # Create your views here. class DBG(serializers.Serializer): # 聲明序列化器 id = serializers.IntegerField() title = serializers.CharField() create_time = serializers.DateField() type = serializers.IntegerField() school = serializers.CharField(source="school.name") class CYM(serializers.ModelSerializer): # 聲明ModelSerializer # type = serializers.CharField(source='get_type_display') class Meta: model = models.Article fields = "__all__" # ("id", "title", "type") depth = 1 # 官方推薦不超過10層 def article_list(request): # 查詢全部 # 去數據庫查詢全部的文章數據 query_set = models.Article.objects.all() xbg = CYM(query_set, many=True) print(xbg.data) # 返回 return JsonResponse(xbg.data, safe=False)
刷新頁面,將數據複製一下,使用json格式化工具,效果以下:
能夠看到type的值不是數字,而是選擇集中的值,它作了替換。是下面這一行,作了替換
type = serializers.CharField(source='get_type_display')
school的值,也能顯示相關聯的數據。
CYM是通用的,能夠多條,也能夠一條。
注意:多條的時候,須要加參數many=True。而一條,則不用!
修改urls.py,增長一個路徑
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^article_list/', views.article_list), url(r'article_detail/(\d+)', views.article_detail), ]
修改views.py,增長視圖函數
from django.shortcuts import render,HttpResponse from django.http import JsonResponse from app01 import models import json from rest_framework import serializers # Create your views here. class DBG(serializers.Serializer): # 聲明序列化器 id = serializers.IntegerField() title = serializers.CharField() create_time = serializers.DateField() type = serializers.IntegerField() school = serializers.CharField(source="school.name") class CYM(serializers.ModelSerializer): # 聲明ModelSerializer # type = serializers.CharField(source='get_type_display') class Meta: model = models.Article fields = "__all__" # ("id", "title", "type") depth = 1 # 官方推薦不超過10層 def article_list(request): # 查詢全部 # 去數據庫查詢全部的文章數據 query_set = models.Article.objects.all() xbg = CYM(query_set, many=True) print(xbg.data) # 返回 return JsonResponse(xbg.data, safe=False) def article_detail(request, id): # 查詢單條數據 article_obj = models.Article.objects.filter(id=id).first() xcym = CYM(article_obj) return JsonResponse(xcym.data)
注意:使用這一行代碼
from rest_framework import serializers
必需要用pip install djangorestframework 安裝!!!
刷新頁面,訪問url: http://127.0.0.1:8000/article_detail/1
使用格式化工具,效果以下:
總結:
使用ORM對象轉換爲json對象時,推薦使用serializers
Postman一款很是流行的API調試工具。不只能夠調試簡單的css、html、腳本等簡單的網頁基本信息,它還可以發送任何類型的HTTP 請求 (GET, HEAD, POST, PUT..),附帶任何數量的參數+ headers。對於開發過程當中去調試接口,Postman確實足夠的簡單方便,並且功能強大。
官網地址:
使用windows安裝以後,打開主程序,跳過登陸
訪問文章列表 http://127.0.0.1:8000/article_list/
訪問文章詳情 http://127.0.0.1:8000/article_detail/1
總結:
1. 使用Django 的視圖 本身序列化 1. HttpResponse 2. JsonResponse 3. serializers 2. 使用Django REST Framework 框架的序列化工具類 1. 安裝 pip install djangorestframework 2. 導入 from rest_framework import serializers 3. 使用 class ArticleSerializer(serializers.Serializer): ...
有些狀況下,咱們須要使用python腳原本調用django,從而方便使用django提供的一些指令!
在django項目根目錄下建立文件test_orm.py,它和manage.py是同級的
import os if __name__ == "__main__": # 設置django環境 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_drf.settings") import django django.setup() from app01 import models obj = models.Article.objects.filter(id=1).values() print(obj)
執行腳本,輸出以下:
<QuerySet [{'title': 'Python三年用不上', 'id': 1, 'school_id': 1, 'type': 1, 'update_time': datetime.date(2018, 7, 31), 'create_time': datetime.date(2018, 7, 31)}]>
若是用戶主動退出,session會自動清除,若是沒有退出就一直保留,記錄數愈來愈大,要定時清理沒用的session。
django中已經提供了這個方法,推薦把它加入到crontab中自動清理過時的session,防止session表記錄過大,影響訪問速度。
python E:\python_script\django框架\day15\about_drf\manage.py clearsessions