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&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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM