天天看點

Django項目的建立及初始化

參考資料:

官方手冊

設定mysql

一個部落客的資料庫配置過程

資料庫遷移介紹

  首先我們要差別項目和應用的差別

  應用是一個專門做某件事的網絡應用程式——比如部落格系統,或者公共記錄的資料庫,或者簡單的投票程式。項目則是一個網站使用的配置和應用的集合。項目可以包含很多個應用。應用可以被很多個項目使用。

  也就是說,我們首先建立一個頂級項目,然後我們的子功能都是裡面的應用

1 建立一個項目

django-admin startproject project_name
           

  注意命名項目時候不能用和python或django起沖突的項目名稱。

  項目結構及解釋如下:

# 項目容器名稱,可以修改
project_name/
    # 管理項目的指令行工具
    manage.py
    project_name/
        # 空檔案,告訴 Python 這個目錄應該被認為是一個 Python 包。
        __init__.py
        # django項目配置檔案
        settings.py
        urls.py
        # web伺服器入口
        wsgi.py
           

  通過下面的指令啟動項目

py manage.py runserver
           

2 建立編輯應用

2.1 建立應用

通過下面指令行可以編輯應用,一般在項目根目錄下建立頂級子產品。

py manage.py startapp app_name
           

生成的目錄内容結果如下:

app_name/
    # 資料移植子產品,内容自動生成 
    migrations/   
    # 該應用的背景配置檔案
    admin.py
    # 應用配置檔案,1.9以後自動生成
    apps.py
    # 資料子產品
    models.py 
    # 自動測試子產品
    tests.py  
    # 邏輯代碼區域
    view.py 
           

3 路由定向

  在初始化項目完成後,一般我們還需要在該應用根目錄下建立urls.py檔案,用于路由定向,并将這個檔案添加到項目urls檔案的urlpatterns 清單中。這樣我們就可以在對傳入路由進行截取,并傳入到相應的app中進行進一步路由比對。

  我們一般需要将app内的url名稱添加命名空間。因為在項目存在多個應用時候,我們在html中如果通過path的name選擇路由時,django可能會分不清楚重複路由,故加上 app_name:設定命名空間 。

# app_name/urls.py
from django.urls import path
from . import views

# 添加命名空間
app_name = 'polls'

urlpatterns = [
    path('', views.index, name='index'),
    path('<int:question_id>/', views.detail, name='detail'),
    path('<int:question_id>/results/', views.results, name='results'),
    path('<int:question_id>/vote/', views.vote, name='vote'),]

# app_name/templates/polls/name.html
# 通過 命名空間:name形式選擇路由
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
           

4 初始化資料庫

4.1 配置資料庫

  打開project_name/setting.py,可以在DATABASES中進行資料庫設定。因為我們要連結mysql,是以在第一次使用的時候,需要安裝資料庫API Drever,官網推薦的是mysqlclient,安裝見另一個筆記。下面是設定代碼:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'text_django',
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '3306',
}
}

           

  需要注意的一點是,字典裡所有的關鍵詞都必須大寫。

  我們可以在檔案頭部的

INSTALLED_APPS

設定項。這裡包括了會在你項目中啟用的所有 Django 應用。應用能在多個項目中使用,你也可以打包并且釋出應用,讓别人使用它們。

  當開啟了這些應用後,我們就需要通過下面這個指令生成一些初始表,通過可以測試mysql伺服器是否連結成功。

py manage.py migrate
           
這個 migrate 指令檢查 INSTALLED_APPS 設定,為其中的每個應用建立需要的資料表

4.2 建立并激活模型

(1)建立模型

  首先我們需要定義模型,也就是對應用資料庫結構的設計,寫在app_name/models.py檔案下。通過這些資訊,django可以為這個應用建立資料庫 schema(生成 CREATE TABLE 語句)。建立可以與 Question 和 Choice 對象進行互動的 Python 資料庫 API。

(2)激活模型

  激活之前,我們需要将應用安裝到項目裡,需要在項目的配置類 INSTALLED_APPS 中添加設定。app_name/apps.py 中,是以路徑一般為’app_name.apps.PollsConfig’,如下:

# project_name/settng.py
INSTALLED_APPS = [
    'app_name.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',]
           

  激活涉及到django資料庫遷移的兩大指令

# 為model改變生成遷移檔案migration
# 可在 app_name/migrations/ 檔案夾下檢視
python manage.py makemigrations 
# 對遷移檔案執行,應用資料庫遷移
python manage.py migrate
           

  第二條執行資料庫操作語句隻會執行還沒執行過或未更新的遷移檔案。 Django 通過在資料庫中建立一個特殊的表 django_migrations 來跟蹤執行過哪些遷移

  這兩種遷移方式屬于全局調用所有的,若在後面加上app_name則是對相應的app進行更改。(注意語句執行前一定要先安裝應用到項目)

   通過建立以上模型,就可以直接通過模型進行資料庫操作了。

5 建立管理者賬戶

通過如下語句建立管理者賬戶:

python manage.py createsuperuser

6 添加檔案路徑

6.1 os.path

首先需要引入os子產品

(1) path.dirname

   在setting.py檔案中,我們可以看到這樣的設定

   這其中包含兩個用法含義:

  • os.path.abspath(__file__)

    : 為擷取目前檔案的絕對路徑
  • os.path.dirname()

    : 為擷取目前路徑上一級的路徑

   是以這個語句表示擷取目前檔案(setting.py)上一級的上一級的絕對路徑為根路徑BASE_DIR。(也就是一般項目的根目錄)

(2)path.join

  

os.path.join(path1[, path2[, ...]])

将多個路徑組合在一起,第一個絕對路徑之前的參數将被忽略。

6.2 sys.path

首先需要引入sys子產品

   sys.path是python的搜尋子產品的路徑集,是一個list。有兩種使用方法:

  • sys.path.append(‘你的子產品的名稱’)

    *

    sys.path.insert(0,’子產品的名稱’)

   該語句經常用和path子產品組合使用來為項目添加某個apps路徑,這樣就可以直接impot apps檔案夾下的檔案。

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, BASE_DIR)
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
sys.path.insert(0, os.path.join(BASE_DIR, 'extra_apps'))

# apps/material
PERSONAL_APPS = [
'material.apps.MaterialConfig',
]