Django框架學習day01-初識
1. 簡介
Django 是用python語言寫的開源web開發框架,并遵循MVC設計。
Django的主要目的是簡便、快速的開發數據庫驅動的網站。它強調代碼復用,多個組件可以很方便的以"插件"形式服務于整個框架,Django有許多功能強大的第三方插件,你甚至可以很方便的開發出自己的工具包。這使得Django具有很強的可擴展性。它還強調快速開發和DRY(DoNotRepeatYourself)原則。
2. 特點
1) 重量級框架
對比Flask框架,Django原生提供了眾多的功能組件,讓開發更簡便快速。
- 提供項目工程管理的自動化腳本工具
- 數據庫ORM支持(對象關系映射,英語:Object Relational Mapping)
- 模板
- 表單
- Admin管理站點
- 文件管理
- 認證權限
- session機制
- 緩存
2)MVT模式
有一種程序設計模式叫MVC,其核心思想是分工、解耦,讓不同的代碼塊之間降低耦合,增強代碼的可擴展性和可移植性,實現向后兼容。Django 的設計模式叫做MVT
- M全拼為Model,與MVC中的M功能相同,負責和數據庫交互,進行數據處理。
- V全拼為View,與MVC中的C功能相同,接收請求,進行業務處理,返回應答。
- T全拼為Template,與MVC中的V功能相同,負責封裝構造要返回的html。
3. Django工程搭建
使用django 1.11.11版本,注意需要聯網
pip install django==1.11.11
創建工程的命令為:
django-admin startproject 工程名稱
創建的工程目錄結構:
- 與項目同名的目錄,此處為demo。
- settings.py 是項目的整體配置文件。
- urls.py 是項目的URL配置文件。
- wsgi.py 是項目與WSGI兼容的Web服務器入口。
- manage.py 是項目管理文件,通過它管理項目。
運行服務器命令如下:可以不寫IP和端口,默認IP是127.0.0.1,默認端口為8000。
python manage.py runserver ip:端口
或:
python manage.py runserver
注:django默認工作在調式Debug模式下,如果增加、修改、刪除文件,服務器會自動重啟。按ctrl+c停止服務器。
4. 創建子應用
在Web應用中,通常有一些業務功能模塊是在不同的項目中都可以復用的,故在開發中通常將工程項目拆分為不同的子功能模塊,各功能模塊間可以保持相對的獨立,在其他工程項目中需要用到某個特定功能模塊時,可以將該模塊代碼整體復制過去,達到復用。在Flask框架中也有類似子功能應用模塊的概念,即藍圖Blueprint。在Django框架中叫做子應用。
在django中,創建子應用模塊目錄仍然可以通過命令來操作,即:
python manage.py startapp 子應用名稱
子應用的目錄結構:
- admin.py 文件跟網站的后臺管理站點配置相關。
- apps.py 文件用于配置當前子應用的相關信息。
- migrations 目錄用于存放數據庫遷移歷史文件。
- models.py 文件用戶保存數據庫模型類。
- tests.py 文件用于開發測試用例,編寫單元測試。
- views.py 文件用于編寫Web應用視圖。
注冊安裝一個子應用的方法,即是將子應用的配置信息文件apps.py中的Config類添加到INSTALLED_APPS列表中。
'users.apps.UsersConfig'
創建視圖:打開剛創建的users模塊,在views.py中編寫視圖代碼。
from django.http import HttpResponse
def index(request):
"""
index視圖
:param request: 包含了請求信息的請求對象
:return: 響應對象
"""
return HttpResponse("hello the world!")
注:
- 視圖函數的第一個傳入參數必須定義,用于接收Django構造的包含了請求數據的HttpReqeust對象,通常名為request。
- 視圖函數的返回值必須為一個響應對象,不能像Flask一樣直接返回一個字符串,可以將要返回的字符串數據放到一個HTTPResponse對象中。
在子應用中新建一個urls.py文件用于保存該應用的路由;在users/urls.py文件中定義路由信息
from django.conf.urls import url
from . import views
# urlpatterns是被django自動識別的路由列表變量
urlpatterns = [
# 每個路由信息都需要使用url函數來構造
# url(路徑, 視圖)
url(r'^index/$', views.index),
]
在工程總路由demo/urls.py中添加子應用的路由數據
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls), # django默認包含的
# 添加
url(r'^users/', include('users.urls')),
]
5. 配置文件、靜態文件
5.1 BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
當前工程的根目錄,Django會依此來定位工程內的相關文件,我們也可以使用該參數來構造文件路徑。
注:abspath()# 這個表示絕對路徑; dirname()# 這個表示父路徑
5.2 DEBUG
調試模式,創建工程后初始值為True,即默認工作在調試模式下。
作用:
-
修改代碼文件,程序自動重啟
-
Django程序出現異常時,向前端顯示詳細的錯誤追蹤信息,而非調試模式下,僅返回Server Error (500)
注意:部署線上運行的Django不要運行在調式模式下,記得修改DEBUG=False。
5.3 本地語言與時區
初始化的工程默認語言和時區為英語和UTC標準時區:
LANGUAGE_CODE = 'en-us' # 語言
TIME_ZONE = 'UTC' # 時區
將語言和時區修改為中國大陸信息:
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
5.4 靜態文件
為了提供靜態文件,需要配置兩個參數:
- STATICFILES_DIRS 存放查找靜態文件的目錄
- STATIC_URL 訪問靜態文件的URL前綴
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static_files'),
]
注意:Django 僅在調試模式下(DEBUG=True)能對外提供靜態文件。當DEBUG=False工作在生產模式時,Django不再對外提供靜態文件,需要是用collectstatic命令來收集靜態文件并交由其他靜態文件服務器來提供。
6. 路由說明
6.1. 路由定義位置
Django的主要路由信息定義在工程同名目錄下的urls.py文件中,該文件是Django解析路由的入口。
每個子應用為了保持相對獨立,可以在各個子應用中定義屬于自己的urls.py來保存該應用的路由。然后用主路由文件包含各應用的子路由數據。
6.2. 路由解析順序
Django在接收到一個請求時,從主路由文件中的urlpatterns列表中以由上至下的順序查找對應路由規則,如果發現規則為include包含,則再進入被包含的urls中的urlpatterns列表由上至下進行查詢。
值得關注的 由上至下 的順序,有可能會使上面的路由屏蔽掉下面的路由,帶來非預期結果。
注: 需要注意定義路由的順序,避免出現屏蔽效應。
6.3 路由命名
在定義路由的時候,可以為路由命名,方便查找特定視圖的具體路徑信息。
1) 在使用include函數定義路由時,可以使用namespace參數定義路由的命名空間,如:
url(r'^users/', include('users.urls', namespace='users')),
命名空間表示,凡是users.urls中定義的路由,均屬于namespace指明的users名下。
命名空間的作用:避免不同應用中的路由使用了相同的名字發生沖突,使用命名空間區別開。
2) 在定義普通路由時,可以使用name參數指明路由的名字,如:
urlpatterns = [
url(r'^index/$', views.index, name='index'),
url(r'^say', views.say, name='say'),
]
6.4 reverse反解析
使用reverse函數,可以根據路由名稱,返回具體的路徑,如:
from django.urls import reverse # 注意導包路徑
def index(request):
return HttpResponse("hello the world!")
def say(request):
url = reverse('users:index') # 返回 /users/index/
print(url)
return HttpResponse('say')
- 對于未指明namespace的,reverse(路由name)
- 對于指明namespace的,reverse(命名空間namespace:路由name)
6.5 路徑結尾斜線/的說明
Django中定義路由時,通常以斜線/結尾,其好處是用戶訪問不以斜線/結尾的相同路徑時,Django會把用戶重定向到以斜線/結尾的路徑上,而不會返回404不存在。用戶訪問 index 或者 index/ 網址,均能訪問到index視圖。
注:雖然路由結尾帶/能帶來上述好處,但是卻違背了HTTP中URL表示資源位置路徑的設計理念。
7. 請求
HTTP協議向服務器傳參的四種形式:
-
URL地址傳參. Users/1/hello.
-
查詢字符串. www.meiduo.site/index.py?name=hosnoodles&name1=crayfish
-
請求體傳參. body
-
header頭.
7.1. URL路徑參數
在定義路由URL時,可以使用正則表達式提取參數的方法從URL中獲取請求參數,Django會將提取的參數直接傳遞到視圖的傳入參數中。
未命名參數按定義順序傳遞, 如
# 在urls.py:
url(r'^weather/([a-z]+)/(\d{4})/$', views.weather),
# 在view.py:
def weather(request, city, year):
print('city=%s' % city)
print('year=%s' % year)
return HttpResponse('OK')
命名參數按名字傳遞,如
# 在urls.py:
url(r'^weather/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.weather),
# 在views.py
def weather(request, year, city):
print('city=%s' % city)
print('year=%s' % year)
return HttpResponse('OK')
7.2. Django中的QueryDict對象
定義在django.http.QueryDict
HttpRequest對象的屬性GET、POST都是QueryDict類型的對象
與python字典不同,QueryDict類型的對象用來處理同一個鍵帶有多個值的情況
方法get():根據鍵獲取值
如果一個鍵同時擁有多個值將獲取最后一個值
如果鍵不存在則返回None值,可以設置默認值進行后續處理
方法getlist():根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值
如果鍵不存在則返回空列表[],可以設置默認值進行后續處理
# /weather/beijing/2018/?a=1&b=2&a=3
def weather(request, city, year):
print(year)
print(city)
# 查詢字符串參數
a = request.GET.get('a')
b = request.GET.get('b')
alist = request.GET.getlist('a')
print(a) # 3
print(b) # 2
print(alist) # [1, 3]
7.3. 查詢字符串Query String
獲取請求路徑中的查詢字符串參數(形如?k1=v1&k2=v2),可以通過request.GET屬性獲取,返回QueryDict對象。
注:查詢字符串不區分請求方式,即假使客戶端進行POST方式的請求,依然可以通過request.GET獲取請求中的查詢字符串數據。
7.4. 請求體
請求體數據格式不固定,可以是表單類型字符串,可以是JSON字符串,可以是XML字符串,應區別對待。
可以發送請求體數據的請求方式有POST、PUT、PATCH、DELETE。
7.4.1 表單類型 Form Data
前端發送的表單類型的請求體數據,可以通過request.POST屬性獲取,返回QueryDict對象。
def get_body(request):
a = request.POST.get('a')
b = request.POST.get('b')
alist = request.POST.getlist('a')
print(a)
print(b)
print(alist)
return HttpResponse('OK')
注:request.POST只能用來獲取POST方式的請求體表單數據。
7.4.2 非表單類型 Non-Form Data
非表單類型的請求體數據,Django無法自動解析,可以通過request.body屬性獲取最原始的請求體數據,自己按照請求體格式(JSON、XML等)進行解析。request.body返回bytes類型。
import json
def get_body_json(request):
json_str = request.body
json_str = json_str.decode() # python3.6 無需執行此步
req_data = json.loads(json_str)
print(req_data['a'])
print(req_data['b'])
return HttpResponse('OK')
7.5 請求頭
可以通過request.META屬性獲取請求頭headers中的數據,request.META為字典類型。
常見的請求頭如:
CONTENT_LENGTH – The length of the request body (as a string).
CONTENT_TYPE – The MIME type of the request body.
HTTP_ACCEPT – Acceptable content types for the response.
HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
HTTP_HOST – The HTTP Host header sent by the client.
HTTP_REFERER – The referring page, if any.
HTTP_USER_AGENT – The client’s user-agent string.
QUERY_STRING – The query string, as a single (unparsed) string.
REMOTE_ADDR – The IP address of the client.
REMOTE_HOST – The hostname of the client.
REMOTE_USER – The user authenticated by the Web server, if any.
REQUEST_METHOD – A string such as "GET" or "POST".
SERVER_NAME – The hostname of the server.
SERVER_PORT – The port of the server (as a string).
具體使用如:
def get_headers(request):
print(request.META['CONTENT_TYPE'])
return HttpResponse('OK')
7.6 其他常用HttpRequest對象屬性
- method:一個字符串,表示請求使用的HTTP方法,常用值包括:'GET'、'POST'。
- user:請求的用戶對象。
- path:一個字符串,表示請求的頁面的完整路徑,不包含域名和參數部分。
- encoding:一個字符串,表示提交的數據的編碼方式。
- 如果為None則表示使用瀏覽器的默認設置,一般為utf-8。
- 這個屬性是可寫的,可以通過修改它來修改訪問表單數據使用的編碼,接下來對屬性的任何訪問將使用新的encoding值。
- FILES:一個類似于字典的對象,包含所有的上傳文件
8. 響應
視圖在接收請求并處理后,必須返回HttpResponse對象或子對象。HttpRequest對象由Django創建,HttpResponse對象由開發人員創建。
8.1 HttpResponse
可以使用django.http.HttpResponse來構造響應對象。
HttpResponse(content=響應體, content_type=響應體數據類型, status=狀態碼)
也可通過HttpResponse對象屬性來設置響應體、狀態碼:
- content:表示返回的內容。
- status_code:返回的HTTP響應狀態碼。
響應頭可以直接將HttpResponse對象當做字典進行響應頭鍵值對的設置:
from django.http import HttpResponse
def demo_view(request):
# return HttpResponse('test python', status=400)
# 或者
response = HttpResponse('test python')
response.status_code = 400
response['Item'] = 'Python'
return response
8.2 HttpResponse子類
Django提供了一系列HttpResponse的子類,可以快速設置狀態碼
- HttpResponseRedirect 301
- HttpResponsePermanentRedirect 302
- HttpResponseNotModified 304
- HttpResponseBadRequest 400
- HttpResponseNotFound 404
- HttpResponseForbidden 403
- HttpResponseNotAllowed 405
- HttpResponseGone 410
- HttpResponseServerError 500
8.3 JsonResponse
若要返回json數據,可以使用JsonResponse來構造響應對象,作用:
- 幫助我們將數據轉換為json字符串
- 設置響應頭Content-Type為 application/json
from django.http import JsonResponse
def demo_view(request):
return JsonResponse({'city': 'beijing', 'subject': 'python'})
8.4 redirect重定向
from django.shortcuts import redirect
def demo_view(request):
return redirect('/index.html')
9. Cookie
9.1 設置Cookie
可以通過HttpResponse對象中的set_cookie方法來設置cookie。
def demo_view(request):
response = HttpResponse('ok')
response.set_cookie('itcast1', 'python1') # 臨時cookie
response.set_cookie('itcast2', 'python2', max_age=3600) # 有效期一小時
return response
9.2 讀取Cookie
可以通過HttpRequest對象的COOKIES屬性來讀取本次請求攜帶的cookie值。request.COOKIES為字典類型。
def demo_view(request):
cookie1 = request.COOKIES.get('itcast1')
print(cookie1)
return HttpResponse('OK')
10. Session
10.1 啟用Session
Django項目默認啟用Session。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', # 默認開啟session ,注釋可關閉
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
10.2 存儲方式
在settings.py文件中,可以設置session數據的存儲方式,可以保存在數據庫、本地緩存等
數據庫:存儲在數據庫中,如下設置可以寫,也可以不寫,這是默認存儲方式。
SESSION_ENGINE='django.contrib.sessions.backends.db'
本地緩存:存儲在本機內存中,如果丟失則不能找回,比數據庫的方式讀寫更快。
SESSION_ENGINE='django.contrib.sessions.backends.cache'
混合存儲:優先從本機內存中存取,如果沒有則從數據庫中存取。
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
10.3 Redis
在redis中保存session,需要引入第三方擴展,我們可以使用django-redis來解決。
1) 安裝擴展
pip install django-redis
2)配置
在settings.py文件中做如下設置:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
智能推薦
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
猜你喜歡
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...
styled-components —— React 中的 CSS 最佳實踐
https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...
19.vue中封裝echarts組件
19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...