- 建立工程能夠使用命令:django-admin startproject 工程名稱
- 固然也能夠使用ide直接建立一個Django工程
- 新建的工程能夠直接運行python manage.py runserver來開啓
- Django一樣是MVT模式,須要模型、路由視圖和模板
- 建好工程後如要新建一個子模塊應用,能夠使用命令:python manage.py startapp 子應用名稱
- 一樣子應用的相關文件已經自動建好,可是須要手動添加一個urls.py文件用來寫入路由
- 建立好子應用後一樣應該和Flask同樣註冊到主模塊中去,這裏將子應用下的apps.py裏的UserConfig添加到主模塊的settings.py裏的INSTALLED_APPS列表裏
- 配置好後便可開始寫路由和視圖函數,這裏視圖函數在views.py內寫入,須要注意的是該框架視圖函數均需傳入request對象:
from django.http import HttpResponse
def index(request):
#這裏的request對象爲框架自動構造,可是response則需開發者構造
return HttpResponse("hello the world!")
- 而後在urls.py文件內寫入路由,路由文件內是一個名爲urlpatterns的列表,這裏和Flask不一樣,不使用裝飾器,而是將全部路由放入一個單獨的文件中:
from django.conf.urls import url
from . import views
#這裏一樣須要將視圖函數導入
urlpatterns = [
#這個匹配到的路徑對應該視圖函數
url(r'^index/$', views.index),
]
- 同時這裏的路由也要註冊到主模塊的路由中,在主模塊的urls.py文件的urlpatterns列表中寫入路由:
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls), # django默認包含的
# 添加子模塊的路由,這裏將包含子模塊中的全部路由,因此該user模塊的訪問路徑爲協議://域名:端口/user/子模塊下的具體地址,拿到url後首先匹配路徑user/(這裏自動忽略第一個/),匹配到後根據include找到子模塊的urls,再根據子模塊的路由去執行對應的視圖函數,這也決定了user模塊下的全部路由均以/user/開頭,因此這裏要訪問index的完整路徑爲/user/index
url(r'^user/', include('user.urls')),
]
- 配置文件settings.py
- BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(_file_))) 定位當前工程的根目錄
- DEBUG
- 語言:LANGUAGE_CODE = 'en-us' 這裏能夠改成中國中文:LANGUAGE_CODE = 'zh-hans'
- 時區:TIME_ZONE = 'UTC' 這裏一樣能夠更改:TIME_ZONE = 'Asia/Shanghai'
- 請求路徑及request攜帶參數提取:
- 請求路徑直接攜帶:如:http://xxxx:80/news/100 能夠在路由中使用正則提取:url(r'^news/(\d{3})/$', views.news),將表達式用括號括起,此時再定義視圖函數時則須要接收request對象和該匹配值,該值也能夠取個名字:url(r'^news/(?P<id>\d{3})/$', views.news) 將?P <名字> 放在前面便可
- 獲取請求路徑中的查詢字符串參數,如:http://xxxx:80/news/?id=100 這裏直接使用request.GET.get('id')獲取
- 獲取請求體中攜帶的表單參數,能夠使用request.POST.get('id')獲取
- 獲取請求體中非表單類型參數,如json,使用request.body獲取,可是返回值爲byte類型,須要轉換,如json: json.loads(request.body.decode()).get(id)
- 獲取請求頭的各類數據:如:request.META['CONTENT_TYPE']
- 類視圖
- Django中能夠以一個類來定義視圖函數,這就是類視圖
- 使用類視圖能夠將視圖對應的不一樣請求方式(如get,post)以類中的不一樣方法來區別定義
- 而且類是能夠繼承的,這就有了更好的複用性
- 類視圖中定義的函數名只能是請求的小寫,如get,post
from django.views.generic import View
class RegisterView(View):
#註冊類,這裏須要繼承View,以在配置路由時使用as_view()方法
def get(self, request):
"""處理GET請求,返回註冊頁面"""
return render(request, 'register.html')
def post(self, request):
"""處理POST請求,實現註冊邏輯"""
return HttpResponse('這裏實現註冊邏輯')
urlpatterns = [
# 視圖函數:註冊
# url(r'^register/$', views.register),
# 類視圖:註冊
url(r'^register/$', views.RegisterView.as_view()),
]
- 類視圖裝飾器
- 使用method_decorator將裝飾器直接定義在類上,傳入自定義裝飾器名和指明name(類視圖中的方法名)便可
- 在子模塊下新建一個decorator.py文件,寫入自定義裝飾器,並在視圖函數中導入
# 這裏指明將裝飾器dec_view給get函數使用,這裏也能夠將@method_decorator(dec_view)直接加到要裝飾的方法上,如要給全部請求加此方法,則用name='dispatch'
@method_decorator(dec_view, name='get')
class register(View):
def get(self,request):
return HttpResponse('getRequest')
def post(self,request):
return HttpResponse('postRequest')
urlpatterns = [
url(r'^register/$', dec_view(views.RegisterView.as_view())),
]
- 中間件
- 同Flask的鉤子函數,在響應前或響應後執行
- 定義中間件的形式同裝飾器
- 在子模塊下新建一個middleware.py文件,寫入中間件函數
def test_middleware(re_view):
def middleware(request):
print('響應前執行')
# 這裏時真正響應的視圖函數
response = re_view(request)
print('響應後執行')
return response
return middleware
- 將函數註冊到settings.py文件中的MIDDLEWARE列表中,這裏是'user.middleware.test_middleware'
- 若有多箇中間件執行順序和一個函數上面加多個裝飾器的順序相同