1. 程式人生 > >Django 系列部落格(二)

Django 系列部落格(二)

Django 系列部落格(二)

前言

今天部落格的內容為使用 Django 完成第一個 Django 頁面,並進行一些簡單頁面的搭建和轉跳。

命令列搭建 Django 專案

建立純淨虛擬環境

在上一篇部落格中已經安裝好了虛擬環境,所以用虛擬環境來安裝指定版本的 Django。為了可以從頭到尾的走一遍流程,我重新建立了一個虛擬環境。

啟用虛擬環境並安裝 Django

  1. 首先進入虛擬環境路徑下的 bin 目錄
  2. 使用命令啟用虛擬環境

  1. 安裝指定版本 Django

首先使用 pip3 list 命令檢視

可以看到都是建立虛擬環境時安裝的依賴包,現在使用 pip 命令安裝指定 django 版本,因為做專案需要穩定,所以安裝的版本不是最新的。

可以看到新安裝了2個包,pytz 是 python time zone 的縮寫,是用來轉換時區的包。

建立專案

前往目標路徑建立專案,在這裡我的 django 專案都在我的家目錄下面的 django_project裡面。

進入要建立專案的路徑下,使用下面的命令建立一個 django 專案。

django-admin startproject project_name

可以看到多了個資料夾。檢視專案結構

建立應用

進入專案根目錄使用下面命令建立一個 app。

python3 manage.py startapp app_name

建立成功並檢視專案結構。

啟動專案

使用下面命令

python3 manage.py runserver 127.0.0.1:8888

成功後會在本機上的8888埠開啟 django 服務

訪問8888埠會顯示下圖頁面

好了,到現在你已經開啟了第一個 django 服務,並且還是使用了命令列。

pycharm 建立 Django 專案

其實會使用命令列建立專案那麼使用 pycharm 應該是手到擒來,畢竟 pycharm 已經做了很多工作了。不過也有點麻煩。。。

在虛擬環境下使用 pycharm 安裝指定django 版本

建立專案

專案目錄結構及作用

專案目錄:包含專案最基本的一些配置
    -- __init__.py:模組的配置檔案,將blog_proj資料夾變成了模組
    -- settings.py:配置總檔案
    -- urls.py:url配置檔案,django專案中的所有頁面都需要對其配置url地址
    -- wsgi.py:(web server gateway interface),伺服器閘道器介面,python應用與web伺服器直接通訊的介面
templates:模板資料夾,存放html檔案的(頁面),支援使用Django模板語言(DTL),也可以使用第三方(jinja2)
manage.py:專案管理器,與專案互動的命令列工具集的入口,檢視支援的所有命令python3 manage.py

settings.py結構

import os
# 專案根目錄
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# 專案安全碼
SECRET_KEY = 'guwba1u$18=&*8kf44_u&[email protected]$0rs=(+f10yvz)p0'

# 除錯模式,上線專案要關閉debug模式,不然後臺出現異常會直接拋給前臺展現給使用者看了
DEBUG = True

# 在上線專案中,規定只能以什麼ip地址來訪問django專案
# DEBUG = FALSE
# ALLOWED_HOSTS = ['localhost']
ALLOWED_HOSTS = []

# 專案自帶的應用
# 我們建立了自己的應用就要將自定義應用新增到該配置
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

# 中介軟體
# django自帶的工具集
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# 配置url配件檔案的根檔案,執行urls.py
ROOT_URLCONF = '專案目錄.urls'

# 模板,一個個html檔案
TEMPLATES = [
    {
        # 如果使用第三方,可以在這個地方修改模板引擎
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# 伺服器閘道器介面應用
WSGI_APPLICATION = '專案目錄.wsgi.application'

# 資料庫配置
# 要配置自定義資料庫去下面連結去查詢詳細配置
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

# 密碼認證配置
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# 國際化相關配置
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True

# 靜態檔案地址 (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'

建立專案應用

使用 pycharm 自帶的命令列工具來建立應用

應用建立完後將應用名新增到 settings.py檔案中

INSTALLED_APPS = [
    'django.contrib.admin',
        ...
    'django.contrib.staticfiles',
    # 新增的自定義應用
    'app',
]

app目錄結構

建立後的 app 目錄結構和使用命令列建立的一樣,下面來看看具體都有什麼作用

migrations:資料遷移(移植)模組,內容都是由Django自動生成
    -- __init__.py
__init__.py
admin.py:應用的後臺管理系統配置
apps.py:django 1.9後,本應用的相關配置
models.py:資料模型模組,使用ORM框架,類似於MVC模式下的Model層
tests.py:自動化測試模組,可以寫自動化測試指令碼
views.py:執行相應的邏輯程式碼模組(相應什麼,如何相應),程式碼邏輯處理的主要地點,專案的大部分程式碼所在位置

頁面響應

第一個響應

通過配置路由和檢視檔案來響應第一次連線請求。

配置路由

from django.conf.urls import url
from django.contrib import admin

# 匯入應用檢視
import app.views as app_view # 取別名

# 配置路由
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 為指定函式配置 url
    url(r'^index/&', app_view.index)
]

配置檢視

# 匯入處理請求的 http 相應功能
from django.http import HttpResponse

# django中每一個請求都會設定相應函式來進行處理
# 函式的引數約定為 request
def index(request):
    return HttpResponse('index page!')

啟動服務

啟動服務後訪問 localhost:8000/index/,可以看到響應為 index 函式裡填寫的響應,說明服務成功啟動並且響應了自己想要的響應字串。

第一個模板頁面

專案目錄下有個 templates 資料夾是專門用於存放頁面資源的,比如index.html

from django.shortcuts import render

def index(request):
    # 引數:請求物件 request,模板 html 檔案,傳給前臺的資源
    return render(request, 'index.html')

index.html 檔案

 <!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>主頁</title>
</head>
<body>
    <h1>這是主頁</h1>
</body>
</html>

配置完成後,訪問127.0.0.1:8000/index/後顯示為:

在 views.py檔案中編寫對應響應功能函式時,會自動出現模板檔案

這是因為在 settings.py檔案中已經把模板路徑配置好了

TEMPLATES = [
    {
        # 如果使用第三方,可以在這個地方修改模板引擎
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 模板頁面預設路徑:專案根路徑下的templates資料夾
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        # 允許所有app均擁有自己的模板資料夾
        'APP_DIRS': True,
        ...
    },
]

第一個重定向

和上面的一樣,首先在 views.py檔案中配置響應函式

from django.shortcuts import render, redirect
# / 路徑渲染index.html頁面
def home(request):
    return render(request, 'index.html')
# /index/ 路徑重定向到 / 路徑,達到渲染index.html頁面
def index(request):
    return redirect('/')

響應的路由配置為

from django.conf.urls import url
from django.contrib import admin
# 匯入應用檢視
import app.views as app_view
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/$', app_view.index),
    url(r'^$', app_view.home),
]

狀態碼顯示為301說明發生了轉跳,檢視網路詳細資訊發現在index/中有個 location 欄位,

該欄位值為 /,說明轉跳到了根目錄下。

其他配置

url應用移植

專案目錄下的urls.py檔案

# 匯入include功能,將url配置轉移到指定應用內部的自身url配置檔案
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 將url配置操作交給app_test自身的urls.py來進行操作
    # app-test/為app_test應用的總路徑
    url(r'^app-test/', include('app_test.urls')),
]

app_test下的urls.py檔案

from django.conf.urls import url
from . import views
urlpatterns = [
    # 1.不要直接留空,直接留空 http://localhost:8000/app-test/* 均可以訪問
    # 2.如果要配置index,訪問的地址為 http://localhost:8000/app-test/index
    # 3.配置方式:r'^index/$',不要省略 / 符號
    # 4.正則是否以$標識結尾取決於該路徑是否會有下一級路徑
    url(r'^$', views.index),
]

多應用相同模板頁面衝突

如果在兩個應用中均有相同的模板頁面假如為index.html

# 1.在應用templates資料夾下建立與應用同名的資料夾,eg:app_text下就建立app_text
# 2.將模板建立在與應用同名的模板資料夾下
# 3.修改指定應用下views.py處理請求的render模板指向
def index(request):
    # 模板指向:blog_app應用的templates下的blog_app資料夾中的index.html
    return render(request, 'app_text/index.html')

靜態資源的配置

假如頁面需要一些靜態資源,比如需要 css 樣式、js 檔案等,那麼就需要在 settings 檔案中配置好靜態檔案的路徑。

配置 settings.py檔案

# 靜態檔案地址 (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
# 在專案根目錄下新建static資料夾,靜態資源均放在該資料夾中
# 增加STATICFILES_DIRS配置
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]
# 前端頁面載入靜態資源的路徑:/static/... (...為具體在static資料夾中的路徑)

拓展靜態資源配置

# 如果要將專案根目錄下source資料夾也作為靜態資源路徑
# STATICFILES_DIRS增加source配置
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
    os.path.join(BASE_DIR, 'source')
]
# 前端頁面載入靜態資源路徑依舊不變,Django會自動索引:/static/... (...為具體在source資料夾中的路徑)

url正則

原生字串

# urls.py配置路由
url(r'test', app_view.test)

# views.py設定響應函式
def test(request):
    return HttpResponse('test')

# 問題:請求地址包含test均可以訪問
# http://127.0.0.1:8000/test => /test | /atest | /testa | /atesta | /test/a | /test/

開頭

# urls.py配置路由
url(r'^test', app_view.test)

# views.py設定響應函式
def test(request):
    return HttpResponse('test')

# 問題:請求地址以test開頭均可以訪問
# http://127.0.0.1:8000/test => /test | /testa | /test/a | /test/

結尾

# urls.py配置路由
url(r'^test$', app_view.test)

# views.py設定響應函式
def test(request):
    return HttpResponse('test')

# 問題:只能一種方式訪問
# http://127.0.0.1:8000/test => /test
# 不能以 /test/ 訪問
# http://127.0.0.1:8000/test/

優化結尾

# urls.py配置路由
url(r'^test/$', app_view.test)

# views.py設定響應函式
def test(request):
    return HttpResponse('test')

# /test 和 /test/ 均可以訪問
# http://127.0.0.1:8000/test
# http://127.0.0.1:8000/test/

# 問題:不能作為應用總路由
# eg:app_test應用在專案urls.py
# url(r'^app-test/', include('app_test.urls')) 末尾不能加$,因為作為應用總目錄,是有下一級,如果用$標識結尾了,就代表不能有下一級路由

地址捕獲

# urls.py配置路由
url(r'^test/(\d+)/\d+/(\d+)/$', app_view.test)

# 對應請求路徑
# http://127.0.0.1:8000/test/1/22/333/

# 對應響應函式
def test(request, arg1, arg2):
    # arg1: str 1
    # arg2: str 333
    return HttpResponse('test')

小結

# 常規路由配置
# r'^index/$'
# r'^page/2/$'

# 應用路由配置
# r'^app/'

# 根路由配置
# r'^$'

# 路由配置均以 / 結尾
# ()中的欄位會被請求響應函式捕獲

# 限制響應函式捕獲的變數名
# (?P<num>[0-9]+) 響應函式引數(requset, num)