Django框架1

  • 建立工程能夠使用命令: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'
    • 若有多箇中間件執行順序和一個函數上面加多個裝飾器的順序相同
相關文章
相關標籤/搜索