pythondjango讲解_Django框架全面讲解
Python的WEB框架有Django、Tornado、Flask 等多種,Django相較與其他WEB框架其優勢為:大而全,框架本身集成了ORM、模型綁定、模板引擎、緩存、Session等諸多功能。
本文將以下方面帶大家全面了解Django框架,筆者使用的版本為1.10.
流程
基本配置
路由系統
視圖view
模板
Model
中間件
Form
認證系統
CSRF
分頁
Cookie
Seesion
緩存
序列化
信號
admin
一、 Django流程介紹
MVC是眾所周知的模式,即:將應用程序分解成三個組成部分:model(模型),view(視圖),和 controller(控制 器)。其中:
M——管理應用程序的狀態(通常存儲到數據庫中),并約束改變狀態的行為(或者叫做“業務規則”)。
C——接受外部用戶的操作,根據操作訪問模型獲取數據,并調用“視圖”顯示這些數據。控制器是將“模型”和“視圖”隔離,并成為二者之間的聯系紐帶。
V——負責把數據格式化后呈現給用戶。
Django也是一個MVC框架。但是在Django中,控制器接受用戶輸入的部分由框架自行處理,所以 Django 里更關注的是模型(Model)、模板(Template)和視圖(Views),稱為 MTV模式:
M 代表模型(Model),即數據存取層。 該層處理與數據相關的所有事務: 如何存取、如何驗證有效性、包含哪些行為以及數據之間的關系等。
T 代表模板(Template),即表現層。 該層處理與表現相關的決定: 如何在頁面或其他類型文檔中進行顯示。
V 代表視圖(View),即業務邏輯層。 該層包含存取模型及調取恰當模板的相關邏輯。 你可以把它看作模型與模板之間的橋梁。
二、 Django 基本配置
1. 創建django程序
終端命令:django-admin startproject sitename ?(在當前目錄下創建一個Django程序)
IDE創建Django程序時,本質上都是自動執行上述命令
其他常用命令:
python manage.py runserver ip:port ?(啟動服務器,默認ip和端口為http://127.0.0.1:8000/)
python manage.py startapp appname ?(新建 app)
python manage.py syncdb ?(同步數據庫命令,Django 1.7及以上版本需要用以下的命令)
python manage.py makemigrations ?(顯示并記錄所有數據的改動)
python manage.py migrate ?(將改動更新到數據庫)
python manage.py createsuperuser ?(創建超級管理員)
python manage.py dbshell ?(數據庫命令行)
python manage.py ?(查看命令列表)
2. 程序目錄
3. 配置文件
a、數據庫
支持SQLite 3(默認)、PostgreSQL 、MySQL、Oracle數據庫的操作
具體配置
Django框架對于開發者而言高度透明化,對于不同數據庫的具體使用方法是一致的,改變數據庫類型只需要變動上述配置即可。
想要了解更多請戳這里
b、靜態文件添加
#首先在項目根目錄下創建static目錄
#接著在settings.py 文件下添加
STATIC_URL = '/static/' #默認已添加,使用靜態文件時的前綴
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'), #行末的逗號不能漏
)
#這樣在template中就可以導入static目錄下的靜態文件啦
#例:
三、 Django 路由系統
URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL模式以及要為該URL模式調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對于這個URL調用這段代碼,對于那個URL調用那段代碼。URL的加載是從配置文件中開始。
參數說明:
一個正則表達式字符串
一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字符串
可選的要傳遞給視圖函數的默認參數(字典形式)
一個可選的name參數
1. 示例
1
2
3
4
5
6
7
8
9
10from django.conf.urlsimport url
from .import views
urlpatterns= [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
說明:
要捕獲從URL中的值,用括號括起來,會當參數傳入 views 視圖。
沒有必要添加一個斜線,因為每個URL都有。例如,它^articles不是^/articles。
在'r'前面的每個正則表達式字符串中是可選的,但建議。它告訴Python字符串是“原始” -沒有什么字符串中應該進行轉義。
請求示例:
一個請求?/articles/2005/03/?會匹配上面列表中的第三條. Django 會調用函數?views.month_archive(request,?'2005',?'03').
/articles/2005/3/?不會匹配上面列表中的任何條目, 因為第三條的月份需要二位數字.
/articles/2003/?會匹配上第一條而不是第二條,因為匹配是按照從上到下順序而進行的, Django 會調用函數?views.special_case_2003(request)
/articles/2003?不會匹配上面列表中的任何條目, 因為每個URL應該以 / 結尾.
/articles/2003/03/03/?會匹配上最后一條. Django 會調用函數?views.article_detail(request,?'2003',?'03',?'03').
2. 命名組(Named groups)
在上面的簡單例子中,并沒有使用正則表達式分組,在更高級的用法中,很有可能使用正則分組來匹配URL并且將分組值通過參數傳遞給view函數。
在Python的正則表達式中,分組的語法是?(?Ppattern), name表示分組名,pattern表示一些匹配正則.
這里是一個簡單的小例子:
1
2
3
4
5
6
7
8
9
10
11
12# 正則知識
import re
ret=re.search('(?P\d{3})/(?P\w{3})','weeew34ttt123/ooo')
print(ret.group())
print(ret.group('id'))
print(ret.group('name'))
-------------------------------------
123/ooo
123
ooo
1
2
3
4
5
6
7
8
9
10from django.conf.urlsimport url
from .import views
urlpatterns= [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$', views.month_archive),
url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', views.article_detail),
]
For example:
A request to?/articles/2005/03/?會調用函數?views.month_archive(request,?year='2005',month='03'), 而不是?views.month_archive(request,?'2005',?'03').
A request to?/articles/2003/03/03/?會調用函數?views.article_detail(request,?year='2003',month='03',?day='03').
常見寫法實例:
3. 二級路由(Including)
那如果映射 url 太多怎么辦,全寫一個在 ?urlpatterns 顯得繁瑣,so 二級路由應用而生
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16from django.conf.urlsimport include, url
from apps.mainimport views as main_views
from creditimport views as credit_views
extra_patterns= [
url(r'^reports/$', credit_views.report),
url(r'^reports/(?P[0-9]+)/$', credit_views.report),
url(r'^charge/$', credit_views.charge),
]
urlpatterns= [
url(r'^$', main_views.homepage),
url(r'^help/', include('apps.help.urls')),
url(r'^credit/', include(extra_patterns)),
]
在上面這個例子中,如果請求url為?/credit/reports/?則會調用函數?credit_views.report().
使用二級路由也可以減少代碼冗余,使代碼更加簡潔易懂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24# 原始版本
from django.conf.urlsimport url
from .import views
urlpatterns= [
url(r'^(?P[\w-]+)-(?P\w+)/history/$', views.history),
url(r'^(?P[\w-]+)-(?P\w+)/edit/$', views.edit),
url(r'^(?P[\w-]+)-(?P\w+)/discuss/$', views.discuss),
url(r'^(?P[\w-]+)-(?P\w+)/permissions/$', views.permissions),
]
# 改進版本
from django.conf.urlsimport include, url
from .import views
urlpatterns= [
url(r'^(?P[\w-]+)-(?P\w+)/', include([
url(r'^history/$', views.history),
url(r'^edit/$', views.edit),
url(r'^discuss/$', views.discuss),
url(r'^permissions/$', views.permissions),
])),
]
4. 添加額外的參數
URLconfs 有一個鉤子可以讓你加入一些額外的參數到view函數中.
1
2
3
4
5
6from django.conf.urlsimport url
from .import views
urlpatterns= [
url(r'^blog/(?P[0-9]{4})/$', views.year_archive, {'foo':'bar'}),
]
在上面的例子中,如果一個請求為?/blog/2005/, Django 將會調用函數l?views.year_archive(request,?year='2005',foo='bar').
需要注意的是,當你加上參數時,對應函數views.year_archive必須加上一個參數,參數名也必須命名為 foo,如下:
1
2
3def year_archive(request, foo):
print(foo)
return render(request,'index.html')
5. 別名的使用
1url(r'^index',views.index,name='bieming')
url中還支持name參數的配置,如果配置了name屬性,在模板的文件中就可以使用name值來代替相應的url值.
我們來看一個例子:
name的應用
6. 指定view的默認配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14# URLconf
from django.conf.urlsimport url
from .import views
urlpatterns= [
url(r'^blog/$', views.page),
url(r'^blog/page(?P[0-9]+)/$', views.page),
]
# View (in blog/views.py)
def page(request, num="1"):
# Output the appropriate page of blog entries, according to num.
...
在上述的例子中,兩個 URL 模式指向同一個視圖?views.page但第一圖案不捕獲從 URL 任何東西。如果第一個模式匹配,該?page()函數將使用它的默認參數?num,"1"。如果第二圖案相匹配時,?page()將使用任何?num值由正則表達式捕獲。
四、 Django Views(視圖函數)
http請求中產生兩個核心對象:
http請求:HttpRequest對象
http響應:HttpResponse對象
1. HttpRequest對象
當請求一個頁面時,Django 創建一個?HttpRequest對象包含原數據的請求。然后 Django 加載適當的視圖,通過?HttpRequest作為視圖函數的第一個參數。每個視圖負責返回一個HttpResponse目標。
HttpRequest對象屬性
2. HttpResponse對象
對于HttpRequest對象來說,是由django自動創建的,但是,HttpResponse對象就必須我們自己創建。每個view請求處理方法必須返回一個HttpResponse對象。
在HttpResponse對象上擴展的常用方法:
頁面渲染:render(推薦),render_to_response,
頁面跳轉:redirect
locals: ? 可以直接將對應視圖函數中所有的變量傳給模板
值得注意的是對于頁面渲染的方法中,render和render_to_response使用方法和功能類似,但是render功能更為強大,推薦使用
3. render()
render(request,?template_name,?context=None,?content_type=None,?status=None,?using=None)[source]結合給定的模板與一個給定的上下文,返回一個字典HttpResponse在渲染文本對象
所需的參數
template_name?一個模板的使用或模板序列名稱全稱。如果序列是給定的,存在于第一個模板將被使用。
可選參數
context ? ?一組字典的值添加到模板中。默認情況下,這是一個空的字典。
content_type ? ?MIME類型用于生成文檔。
status ? ?為響應狀態代碼。默認值為200
using ? ?這個名字一個模板引擎的使用將模板。
render示例
五、 模板
1. 模板的執行
模版的創建過程,對于模版,其實就是讀取模版(其中嵌套著模版標簽),然后將 Model 中獲取的數據插入到模版中,最后將信息返回給用戶。
示例
2. ?模板語言
模板中也有自己的語言,該語言可以實現數據展示
{{ item }}
{% for item in item_list %} ?{{ item }} ?{% endfor %}
forloop.counter
forloop.first
forloop.last
{% if ordered_warranty %} ?{% else %} {% endif %}
母板:{% block title %}{% endblock %}
子板:{% extends "base.html" %}
{% block title %}{% endblock %}
幫助方法:
{{ item.event_start|date:"Y-m-d H:i:s"}}
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }}
{{ name|lower }}
小知識點:在模板語言中字典數據類型的取值是通過dict.xxx而不是dict[xxx]
3. 自定義標簽
因為在模板語言中不能夠做運算等一些稍顯復雜的操作,所以在Django中提供了兩種自定制標簽,一種是simple_tag,一種是filter。
simple_tag: 任意傳遞參數,但是不能用作布爾判斷
filter: 最多只能傳遞二個參數,可以用作布爾判斷
在這里著重介紹simple_tag類型,filter的實現類似
a、在app中創建templatetags模塊
b、創建任意 .py 文件,如:xx.py
示例
c、在使用自定義simple_tag的html文件中導入之前創建的 xx.py 文件名
{% load xx %}
d、使用simple_tag
{% my_simple_time 1 2 3%}
{% my_input 'id_username' 'hide'%}
e、在settings中配置當前app,不然django無法找到自定義的simple_tag
示例
六、 Model
Django提供了一個抽象層(“Model”)來構建和管理Web應用程序的數據。
django中遵循Code Frist 的原則,即:根據代碼中定義的類來自動生成數據庫表。
關系對象映射(Object Relational Mapping,簡稱ORM)。
1. 創建表
a、基本結構
1
2
3
4
5
6from django.dbimport models
class userinfo(models.Model):
name= models.CharField(max_length=30)
email= models.EmailField()
memo= models.TextField()
更多參數
更多字段
元信息
拓展知識
b、連表結構
一對多:models.ForeignKey(其他表)
多對多:models.ManyToManyField(其他表)
一對一:models.OneToOneField(其他表)
應用場景:
一對多:當一張表中創建一行數據時,有一個單選的下拉框(可以被重復選擇)
例如:創建用戶信息時候,需要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。
多對多:在某表中創建一行數據是,有一個可以多選的下拉框
例如:創建用戶信息,需要為用戶指定多個愛好
一對一:在某表中創建一行數據時,有一個單選的下拉框(下拉框中的內容被用過一次就消失了
例如:原有含10列數據的一張表保存相關信息,經過一段時間之后,10列無法滿足需求,需要為原來的表再添加5列數據
字段以及參數
2. 操作表
a、基本操作
基本操作
b、進階操作(了不起的雙下劃線)
利用雙下劃線將字段和對應的操作連接起來
進階操作
c、其他操作
其他操作
d、連表操作(了不起的雙下劃線)
利用雙下劃線和 _set 將表之間的操作連接起來
表結構實例
一對一操作
一對多
多對多操作
擴展:
a、自定義上傳
示例
b、Form上傳文件實例
View Code
c、ajax上傳文件實例
HTML
Form
Models
View
七、中間件(MiddleWare)
django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束后,django會根據自己的規則在合適的時機執行中間件中相應的方法。
在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES?變量,其中每一個元素就是一個中間件,如下圖。
與mange.py在同一目錄下的文件夾 wupeiqi/middleware下的auth.py文件中的Authentication類
中間件中可以定義五個方法,分別是:
process_request(self,request)
process_view(self, request, callback, callback_args, callback_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)
分析源碼得知前二個方法是從前往后執行的,后三個方法是從后往前執行的
所以前兩個方法是請求進來時要穿越的,而后三個方法是請求出去時要穿越的
一張圖告訴你中間件的運行流程
自定義中間件
1、創建中間件類
1
2
3
4
5
6
7
8
9
10
11
12class Middle_Test(object):
def process_request(self,request):
pass
def process_view(self, request, callback, callback_args, callback_kwargs):
i=1
pass
def process_exception(self, request, exception):
pass
def process_response(self, request, response):
return response
2、注冊中間件
1
2
3
4
5
6
7
8
9
10MIDDLEWARE_CLASSES= (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'sparks.middleware.auth.Middle_Test',
)
八、 Form
django中的Form一般有兩種功能:
輸入html
驗證用戶輸入
Form
示例
利用Form還可以自動生成前端的input標簽:
form.py
views.py
form1.html
擴展:ModelForm
在使用Model和Form時,都需要對字段進行定義并指定類型,通過ModelForm則可以省去From中字段的定義
ModelForm
九、 認證系統(auth)
auth模塊是Django提供的標準權限管理系統,可以提供用戶身份認證, 用戶組管理,并且可以和admin模塊配合使用.
在INSTALLED_APPS中添加'django.contrib.auth'使用該APP, auth模塊默認啟用.
model
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15from django.contrib.auth.modelsimport User
# 數據庫中該表名為auth_user.
CREATE TABLE"auth_user" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"password" varchar(128) NOT NULL,"last_login" datetime NULL,
"is_superuser" bool NOT NULL,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL,
"email" varchar(254) NOT NULL,
"is_staff" bool NOT NULL,
"is_active" bool NOT NULL,
"date_joined" datetime NOT NULL,
"username" varchar(30) NOT NULL UNIQUE
)
新建用戶
user = User.objects.create_user(username, email, password)
user.save()
# 不存儲用戶密碼明文而是存儲一個Hash值
認證用戶
from django.contrib.auth import authenticate
user = authenticate(username=username, password=password)
# 認證用戶的密碼是否有效, 若有效則返回代表該用戶的user對象, 若無效則返回None.
# 該方法不檢查is_active標志位.
修改密碼
user.set_password(new_password)
# 以下實例為先認證通過后才可以修改密碼
user = auth.authenticate(username=username, password=old_password)
if user is not None:
user.set_password(new_password)
user.save()
登錄
from django.contrib.auth import login
# login向session中添加SESSION_KEY, 便于對用戶進行跟蹤:
'login(request, user)'
# login不進行認證,也不檢查is_active標志位
# 實例
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
退出登錄
# logout會移除request中的user信息, 并刷新session
from django.contrib.auth import logout
def logout_view(request):
logout(request)
只允許登錄的用戶訪問
@login_required修飾器修飾的view函數會先通過session key檢查是否登錄, 已登錄用戶可以正常的執行操作, 未登錄用戶將被重定向到login_url指定的位置.
若未指定login_url參數, 則重定向到settings.LOGIN_URL
from django.contrib.auth.decorators import login_required
@login_required(login_url='/accounts/login/')
def userinfo(request):
...
# settings 配置
LOGIN_URL = '/index/'
# views
@login_required
def userinfo(request):
...
十、 跨站請求偽造(csrf)
django為用戶實現防止跨站請求偽造的功能,通過中間件?django.middleware.csrf.CsrfViewMiddleware 來完成。而對于django中設置防跨站請求偽造功能有分為全局和局部。
全局:
中間件?django.middleware.csrf.CsrfViewMiddleware
局部:
@csrf_protect,為當前函數強制設置防跨站請求偽造功能,即便settings中沒有設置全局中間件。
@csrf_exempt,取消當前函數防跨站請求偽造功能,即便settings中設置了全局中間件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
在Django1.10中,為了防止BREACH攻擊,對cookie-form類型的csrf做了一點改進,即在cookie和form中的token值是不相同的
應用
1、普通表單
1
2
3
4
5veiw中設置返回值:
return render(request,'xxx.html', data)
html中設置Token:
{% csrf_token%}
2、Ajax
對于傳統的form,可以通過表單的方式將token再次發送到服務端,而對于ajax的話,使用如下方式。
view.py
text.html
十一、 分頁
1. Django內置分頁
views.py
Html
擴展內置分頁:views.py
擴展內置分頁:Html
2. 自定義分頁
分頁功能在每個網站都是必要的,對于分頁來說,其實就是根據用戶的輸入計算出應該在數據庫表中的起始位置。
1、設定每頁顯示數據條數
2、用戶輸入頁碼(第一頁、第二頁...)
3、根據設定的每頁顯示條數和當前頁碼,計算出需要取數據表的起始位置
4、在數據表中根據起始位置取值,頁面上輸出數據
需求又來了,需要在頁面上顯示分頁的頁面。如:[上一頁][1][2][3][4][5][下一頁]
1、設定每頁顯示數據條數
2、用戶輸入頁碼(第一頁、第二頁...)
3、設定顯示多少頁號
4、獲取當前數據總條數
5、根據設定顯示多少頁號和數據總條數計算出,總頁數
6、根據設定的每頁顯示條數和當前頁碼,計算出需要取數據表的起始位置
7、在數據表中根據起始位置取值,頁面上輸出數據
8、輸出分頁html,如:[上一頁][1][2][3][4][5][下一頁]
分頁實例
總結,分頁時需要做三件事:
創建處理分頁數據的類
根據分頁數據獲取數據
輸出分頁HTML,即:[上一頁][1][2][3][4][5][下一頁]
十二、 Cookie
1. 獲取Cookie:
1
2
3
4
5
6
request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
參數:
default: 默認值
salt: 加密鹽
max_age: 后臺控制過期時間
2. 設置Cookie:
1
2
3
4
5
6
7
8
9
10
11
12
13
rep=?HttpResponse(...) 或 rep = render(request, ...)
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密鹽',...)
參數:
key,????????????? 鍵
value='',???????? 值
max_age=None,???? 超時時間
expires=None,???? 超時時間(IE requires expires, soset?itif?hasn't been already.)
path='/',???????? Cookie生效的路徑,/?表示根路徑,特殊的:跟路徑的cookie可以被任何url的頁面訪問
domain=None,????? Cookie生效的域名
secure=False,???? https傳輸
httponly=False????只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)
由于cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。
1
2
$.cookie("list_pager_num",30,{ path:'/'?});
十三、 Session
Django中默認支持Session,其內部提供了5種類型的Session供開發者使用:
數據庫(默認)
緩存
文件
緩存+數據庫
加密cookie
1、數據庫Session
View Code
2、緩存Session
View Code
3、文件Session
View Code
4、緩存+數據庫Session
View Code
5、加密cookie Session
View Code
跟數據庫的操作一樣,在Django中不同緩存方式的使用方法是一致的,想要改變緩存的類型只需要改變上述相應配置即可。
擴展:Session用戶驗證(裝飾器)
1
2
3
4
5
6
7def login(func):
def wrap(request,*args,**kwargs):
# 如果未登陸,跳轉到指定頁面
if request.path== '/test/':
return redirect('http://www.baidu.com')
return func(request,*args,**kwargs)
return wrap
十四、 緩存
由于Django是動態網站,所有每次請求均會去數據進行相應的操作,當程序訪問量大時,耗時必然會更加明顯,最簡單解決方式是使用:緩存,緩存將一個某個views的返回值保存至內存或者memcache中,5分鐘內再有人來訪問時,則不再去執行view中的操作,而是直接從內存或者Redis中之前緩存的內容拿到,并返回。
Django中提供了6種緩存方式:
開發調試
內存
文件
數據庫
Memcache緩存(python-memcached模塊)
Memcache緩存(pylibmc模塊)
和數據庫類似,緩存的具體操作都是一樣的,使用不同的方式只需要將配置改掉即可
1、配置
a、開發調試
View Code
b、內存
View Code
c、文件
View Code
d、數據庫
View Code
e、Memcache緩存(python-memcached模塊)
View Code
f、Memcache緩存(pylibmc模塊)
View Code
2、應用
a. 全站使用
View Code
b.?單獨視圖緩存
View Code
c、局部視圖使用
View Code
注:如果出現多個url匹配同一個view函數的情況,緩存機制會根據每一個不同的url做單獨的緩存
十五、 序列化
關于Django中的序列化主要應用在將數據庫中檢索的數據返回給客戶端用戶,特別的Ajax請求一般返回的為Json格式。
1. serializers
1
2
3
4
5
from?django.coreimport?serializers
ret=?models.BookType.objects.all()
data=?serializers.serialize("json", ret)
2. json.dumps
1
2
3
4
5
6
7
8
import?json
#ret = models.BookType.objects.all().values('caption')
ret=?models.BookType.objects.all().values_list('caption')
ret=list(ret)
result=?json.dumps(ret)
由于json.dumps時無法處理datetime日期,所以可以通過自定義處理器來做擴展,如:
自定義示例
十六、 信號
Django中提供了“信號調度”,用于在框架執行操作時解耦。通俗來講,就是一些動作發生的時候,信號允許特定的發送者去提醒一些接受者。
1、Django內置信號
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Model signals
pre_init# django的modal執行其構造方法前,自動觸發
post_init# django的modal執行其構造方法后,自動觸發
pre_save# django的modal對象保存前,自動觸發
post_save# django的modal對象保存后,自動觸發
pre_delete# django的modal對象刪除前,自動觸發
post_delete# django的modal對象刪除后,自動觸發
m2m_changed# django的modal中使用m2m字段操作第三張表(add,remove,clear)前后,自動觸發
class_prepared# 程序啟動時,檢測已注冊的app中modal類,對于每一個類,自動觸發
Management signals
pre_migrate# 執行migrate命令前,自動觸發
post_migrate# 執行migrate命令后,自動觸發
Request/response signals
request_started# 請求到來前,自動觸發
request_finished# 請求結束后,自動觸發
got_request_exception# 請求異常后,自動觸發
Test signals
setting_changed# 使用test測試修改配置文件時,自動觸發
template_rendered# 使用test測試渲染模板時,自動觸發
Database Wrappers
connection_created# 創建數據庫連接時,自動觸發
對于Django內置的信號,僅需注冊指定信號,當程序執行相應操作時,自動觸發注冊函數:
View Code
2、自定義信號
a. 定義并注冊信號
1
2
3
4
5
6
7
8
9# 自定制信號
import django.dispatch
pizza_done= django.dispatch.Signal(providing_args=["toppings","size"])
def callback(sender,**kwargs):
print("self-define")
print(sender, kwargs)
pizza_done.connect(callback)
b. 觸發信號
1
2
3from 路徑import pizza_done
pizza_done.send(sender='seven',toppings=123, size=456)
由于內置信號的觸發者已經集成到Django中,所以其會自動調用,而對于自定義信號則需要開發者在任意位置觸發。
十七、admin
django amdin是django提供的一個后臺管理頁面,改管理頁面提供完善的html和css,使得你在通過Model創建完數據庫表之后,就可以對數據進行增刪改查,而使用django admin 則需要以下步驟:
創建后臺管理員
配置url
注冊和配置django admin后臺管理頁面
注:不建議新手經常使用admin,會形成依賴,核心的是model模塊的操作!
1、創建后臺管理員
python manage.py createsuperuser
2、配置后臺管理url(默認已配)
url(r'^admin/', include(admin.site.urls))
3、注冊和配置django admin 后臺管理頁面
a、在admin中執行如下配置
View Code
b、設置數據表名稱
View Code
c、打開表之后,設定默認顯示,需要在model中作如下配置
View Code
d、為數據表添加搜索功能
View Code
e、添加快速過濾
View Code
總結
以上是生活随笔為你收集整理的pythondjango讲解_Django框架全面讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue打印props的值_vue中pro
- 下一篇: python安装依赖失败_python