Django 系列博客(二) 前言 今天博客的內容為使用 Django 完成第一個 Django 頁面,併進行一些簡單頁面的搭建和轉跳。 命令行搭建 Django 項目 創建純凈虛擬環境 在上一篇博客中已經安裝好了虛擬環境,所以用虛擬環境來安裝指定版本的 Django。為了可以從頭到尾的走一遍流程, ...
Django 系列博客(二)
前言
今天博客的內容為使用 Django 完成第一個 Django 頁面,併進行一些簡單頁面的搭建和轉跳。
命令行搭建 Django 項目
創建純凈虛擬環境
在上一篇博客中已經安裝好了虛擬環境,所以用虛擬環境來安裝指定版本的 Django。為了可以從頭到尾的走一遍流程,我重新創建了一個虛擬環境。
激活虛擬環境並安裝 Django
- 首先進入虛擬環境路徑下的 bin 目錄
- 使用命令激活虛擬環境
- 安裝指定版本 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&swqb@xlwgel7n$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)