學習目標
知道MVT設計模式中MVT分別代表的含義
能夠使用命令創建Django工程和子應用
知道如何在Django中定義視圖及路由
理解Django路由的匹配流程
能夠區分命名參數和未命名參數的區別
知道如何使用request對象獲取查詢字符串參數
知道如何使用request對象獲取請求體數據
Django MVT
對項目進行分層的一種軟件設計模式;
核心思想:分層,解耦,分離了 數據處理 和 界面顯示 的代碼,使得一方代碼修改了不會影響到另外一方,提高程序的可擴展性和可維護性。
- M全拼爲
Model
,與MVC中的M功能相同,負責和數據庫交互,進行數據處理。 - V全拼爲
View
,與MVC中的C功能相同,接收請求,進行業務處理,返回應答。 - T全拼爲
Template
,與MVC中的V功能相同,負責封裝構造要返回的html。
項目搭建
-
項目和應用的創建 (兩種方式)
- pycharm
- 命令行
django-admin startproject 項目名 python manage.py startapp 應用名
-
運行服務器
python manage.py runserver # 使用默認ip和端口 python manage.py runserver 127.0.0.1:8000 # 手動指定ip和端口
-
視圖初步使用
- 定義視圖(函數)
def index(request): return HttpResponse("hello django")
- 在與全局的
url.py
中配置路由
urlpatterns = [ ... # 配置路由和視圖: http://127.0.0.1:8000/users/index # 參數1: 匹配url的正則表達式 # 參數2: 匹配成功後由Django框架調用的視圖函數 url(r'^users/index$', views.index), ]
-
模板初步使用
-
創建模板文件
-
指定模板文件所在的目錄(pycharm創建的項目默認已經指定)
# settings.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # 指定模板文件所在的目錄 'DIRS': [os.path.join(BASE_DIR, 'templates')], ... }, ]
-
在視圖中通過
render
函數使用模板def index(request): context = {'name': 'python'} return render(request, 'users/index.html', context)
-
配置
常用配置項
-
BASE_DIR 默認爲項目的根目錄 【理解,後面項目會用到】
-
DEBUG 是否開啓調試模式
- 開發階段設置爲True, 會輸出項目調試信息;(開發模式,調試模式)
- 項目上線後設置爲False,不會輸出項目調試信息;(生產模式,上線模式)
-
語言和時區配置
LANGUAGE_CODE = 'zh-hans' # 指定爲中文 TIME_ZONE = 'Asia/Shanghai' # 指定時區
-
INSTALLED_APPS:什麼情況下需要註冊應用?【理解,如果提示TemplateDoesNotExist知道是什麼原因】
- 要根據應用中的模型類生成表
- 要用到應用中的模板
class UsersConfig(AppConfig): name = 'users'
INSTALLED_APPS = [ ... 'users.apps.UsersConfig', # 方式一 # 'users' # 方式二 ]
靜態文件使用配置
靜態文件: css, js, images
配置:
- STATIC_URL:訪問靜態文件時使用的url前綴, (使用默認值即可,不需要配置)
- STATICFILES_DIRS:配置靜態文件保存在哪個目錄下(配置手動配置)
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static_files')]
-
在
index.html
模板中使用 圖片 或js靜態文件注意:django測試服務器僅在
調試模式
下支持靜態文件的使用
URL配置
針對 http://127.0.0.1:8000/user/index 進行路由配置,習慣分開兩部分來配置
項目的 urls.py:
urlpatterns = [
...
url(r'^users/', include('users.urls')),
]
應用的 urls.py:
urlpatterns = [
...
url(r'^index$', views.index),
]
捕獲URL中的參數【重要】
http://127.0.0.1:8000/news/1/2
-
未命名參數:按位置傳遞
url(r'^news/(\d+)/(\d+)$', users.views.news), def news(request, a, b): return HttpResponse("顯示新聞:%s %s" % (a, b))
-
命名參數:按名字傳遞
url(r'^news/(?P<category>\d+)/(?P<page>\d+)$', users.views.news), def news(request, category, page): return HttpResponse("顯示新聞:%s %s" % (category, page))
客戶端傳參的幾種方式
傳參方式 | 示例 | 如獲取參數 | 備註 |
---|---|---|---|
url路徑(path) | /news/1/2 | 正則 | |
查詢字符串 | /news2?category=1&page=2 | request.GET | QueryDict |
請求體:表單類型的數據 | category=1&page=2 | request.POST | QueryDict |
請求體:非表單類型的數據(json, xml) | {“category”:1,“page”:2} | request.body | bytes |
請求頭 | category=1 page=2 | request.META | 字典 |
QueryDict對象
類似字典,一鍵可以有多個值
get
方法: 獲取值
getlist
方法:獲取多個值,返回列表
request.GET,request.POST 都爲QueryDict類型的對象
request對象
request屬性 | 說明 | 備註 |
---|---|---|
GET | 獲取查詢字符串參數 (與請求方式無關) | QueryDict |
POST | 獲取請求體中的表單類型的數據(與請求方式有關,僅限post請求) | QueryDict |
body | 獲取請求體非表單類型的數據,比如:json | bytes |
META | 獲取請求頭中的數據 (獲取自定義屬性時,需要 加前綴HTTP_, 轉大寫) |
字典 |
user | 當前訪問的登錄用戶對象 |
問題1:當請求方式爲 post ,是否可以通過 reqeust.GET 獲取查詢查詢字符串參數?
可以
問題2:當請求方式爲 put , 是否可以通過 request.POST 獲取到請求體中的表單數據?
不可以,需要用request.body獲取