項目構建和基礎知識--Django播客系統(三)

項目構建和基礎知識–Django播客系統(三)

概述

  • Django採用MVC架構設計的開源的WEB快速開發框架。
  • 優點:
    1. 能夠快速開發,自帶ORM、Template、Form、Auth核心組件
    2. MVC設計模式
    3. 實用的管理後臺Admin
    4. 簡潔的url設計
    5. 周邊插件豐富
  • 缺點:架構重、同步阻塞
  • 所有Django的設計目標就是一款大而全,便於企業快速開發項目的框架,因此企業應用較廣。

安裝Django

Django version Python版本
1.8 2.7,3.2 (until the end of 2016), 3.3, 3.4, 3.5
1.9,1.10 2.7,3.4,3.5
1.11(LTS) 2.7,3.4,3.5,3.6,3.7(added in 1.11.17)
2.0 3.4,3.5,3.6,3.7
2.1,2.2(LTS) 3.5,3.6,3.7
  • 目前Django長期支持版本有1.11和2.2,這是企業的選擇。
    1. $ pip install django==2.2
  • 本次使用Django2.2版本,它也是長期支持版本LTS,請在虛擬環境中安裝。
  • 在虛擬環境路徑中,Lib/site-packeges/django/bin下游一個django-admin.py,一起從它開始。
# django-admin --version #查看當前django版本
# django-admin --help #查看使用幫助
# django-admin startproject --help #查看startproject命令幫助
(venv) D:\MyPythonUse\DjangoWeb>django-admin

Type 'django-admin help <subcommand>' for help on a specific subcommand.

Available subcommands:

[django]
    check
    compilemessages
    createcachetable
    dbshell
    diffsettings
    dumpdata
    flush
    inspectdb
    loaddata
    makemessages
    makemigrations
    migrate
    runserver
    sendtestemail
    shell
    showmigrations
    sqlflush
    sqlmigrate
    sqlsequencereset
    squashmigrations
    startapp
    startproject
    test
    testserver
  • 注意:本文若未特殊聲明,所有的命令操作都在項目的根目錄下

創建Django項目

  • 創建名爲blog的django項目django-admin startproject djweb .

  • 上句命令就在當前項目根目錄中構建了Django項目的初始文件。.點代表項目根目錄。

F:\CLASSES\TPROJECTS\BLOG10 
├─ manage.py
 └─ djweb
     ├─  settings.py
     ├─  urls.py
     ├─  wsgi.py
     └─  __init__.py
  • 重要文件說明
    1. manage.py:本項目管理的命令行工具。應用創建、數據庫遷移等都使用它完成
    2. dgweb/settings.py:本項目的核心配置文件。數據庫、中間件、模板等
    3. dgweb/urls.py:URL路徑映射配置。項目初始,只配置了/admin的路由。
    4. dgweb/wsgi:定義WSGI接口信息。部署用,一般無需改動。

數據庫配置

使用數據庫,需要修改默認的數據庫配置。
在主項目的settings.py下DATABASES。默認使用的sqlite,修改爲mysql。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'gdy',
        'USER': 'gdy',
        'PASSWORD': 'gdy',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}
配置項 說明
HOST 數據庫主機。缺省是空字符串,代表localhost。如果是/開頭表示使用UnixSocket鏈接
POST 端口
USER 用戶名
PASSWORD 密碼
NAME 庫名
OPTIONS 選項、字典類型,參考MySQL文檔
  1. 數據庫引擎ENGINE
  2. 內建引擎有
    • django.db.backends.postgresql
    • django.db.backends.mysql
    • django.db.backends.sqlite3
    • django.db.backends.oracle

MySQL數據庫驅動

https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-db-api-drivers

Django支持MySQL5.5+
Django官方推薦使用本地驅動mysqlclient 1.3.7+

  • 安裝mysql驅動pip install mysqlclient
windows下可能發生安裝錯誤 error: Microsoft Visual C++ 14.0 is required.解決方法  
1、下載Visual C++ Redistributable Packages 2015、2017安裝,但是即使安裝後,確實看到了V14庫,也不保證 安裝mysqlclient就成功  
2、直接安裝編譯好的wheel文件  
mysqlclient-1.3.13-cp35-cp35m-win_amd64.whl ,python 3.5使用  
mysqlclient-1.3.13-cp36-cp36m-win_amd64.whl ,python 3.6使用  
mysqlclient-1.4.2-cp37-cp37m-win_amd64.whl,  python 3.7使用  

$ pip install mysqlclient-1.3.13-cp35-cp35m-win_amd64.whl 
參考 https://stackoverflow.com/questions/29846087/microsoft-visual-c-14-0-is-required-unable-tofind-vcvarsall-bat

下載地址 https://www.lfd.uci.edu/~gohlke/pythonlibs/
--------------------------------------------------------------------------------
Linux、Mac請參照官網安裝依賴庫  
https://pypi.org/project/mysqlclient/

創建應用

  • 創建用戶應用python manage.py startapp user。創建應用後,項目根目錄下產生一個user目錄,有如下文件:

    1. admin.py:應用後臺管理聲明文件
    2. models.py:模型層Model類定義
    3. views.py:定義URL響應函數或類
    4. migrations包:數據遷移文件生成目錄
    5. apps.py:應用的信息定義文件

    django3_001

    1. user應用創建後應該完成以下功能:
      1. 用戶註冊
      2. 用戶登錄

註冊應用

settings.py中,增加user應用。目的是爲了後臺管理admin使用,或遷移migrate使用

#settings.py文件中
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'user'
]

模型Model

  • 字段類型
字段類 說明
AutoField 自增的整數字段。
如果不指定,django會爲模型類自動增加主鍵字段
BooleanField 布爾值字段,True和False
對應表單控件CheckboxInput
NullBooleanField 比BooleanField多一個null值
CharField 字符串,max_length設定字符長度
對應表單控件TextInput
TextField 大文本字段,一般超過4000個字符串使用
對應表單控件Textarea
IntegerField 整數字段
BigIntegerField 更大整數字段,8字節
DecimalField 使用Python的Decimal實例表示十進制浮點數。max_digits總位數。
decimal_piaces小數點後的位數
FloatField Python的Float實例表示的浮點數
DateFleld 使用Python的datetime.date實例表示的日期
auto_now=False每次修改對象自動設置爲當前時間。auto_now_add=False對象第一次創建時自動設置爲當前時間。auto_now_add、auto_now、default互斥對應控件爲TextInput,關聯了一個js編寫的日曆控件
TimeField 使用Python的datetime.time實例表示時間,參數同上
DateTimeField 使用Python的tetime.datetime實例表示的時間,參數同上
FileField 一個上傳文件的字段
ImageField 繼承了FileField的所有屬性和方法,但是對上傳文件進行校驗,確保是一個有效的圖片
EmailField 能Email檢驗,基於CharField,默認max_length=245
GenericlPAddressField 支持IPv4,IPv6檢驗,缺省對應文本框輸入
URLField 能做URL檢驗,基於基於CharField,默認max_length=200
  • 缺省主鍵

    1. 缺省情況下,Django的每一個Model都有一個名爲id的AutoField字段,如下
      • id = models.AutoField(primary_key=True)
    2. 如果顯示定義了主鍵,這種缺省主鍵就不會被創建了。Python之禪中說“顯示優於隱試”,所以,儘量使用自己定義的主鍵,哪怕該字段名就是id,也是一種不錯的選擇。
  • 字段選項

    1. 參考https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-options
    說明
    db_column 表中字段的名稱,如果未指定,則使用屬性名
    primary_key 是否主鍵
    unique 是否是唯一鍵
    default 缺省值,這個缺省值不是數據庫字段的缺省值,而新對象產生的時候被填入的缺省值
    null 表示字段是否可爲null,默認爲False
    blank Django表單驗證中,是否可以不填寫,默認爲False
    db_index 字段是否有索引
    1. 關係類型字段類
    說明
    ForeignKey 外鍵,表示一對多
    ForeignKey('production.Manufacturer')
    自聯ForeignKey('self')
    ManyToManyField 表示多對多
    OneToOneField 表示一對一
    1. 一對多,自動創建會增加_id後綴。
      • 從一訪問多,使用對象.小寫模型類_set
      • 從一訪問一,使用對象.小寫模型類
    2. 訪問id 對象.屬性_id

創建User的Model類

  • 基類models.Model
  • 表名不指定默認使用<appname>_<model_name>。使用Meta類修改表名
#/user/models.py文件
from django.db import models

# user表模型
class User(models.Model):
    class Meta:
        db_table = "user"
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=48,null=False)
    email = models.CharField(max_length=64,unique=True,null=False)
    password = models.CharField(max_length=128,null=False)

    def __repr__(self):
        return "<user {} {}>".format(self.id,self.name)

    __str__ = __repr__

Meta類的使用,參考https://docs.djangoproject.com/en/1.11/ref/models/options/#django.db.models.Options.db_table

  1. 遷移Migration
    • 遷移:從模型定義生成數據庫的表
    1. 生成遷移文件。執行python manage.py makemigrations

      (venv) D:\MyPythonUse\DjangoWeb>python manage.py makemigrations
      Migrations for 'user':
      user\migrations\0001_initial.py
          - Create model User
      
      生成如下文件
      user
      ├─ migrations
          ├─  0001_initial.py
          └─  __init__.py
      
      • 修改MOdel類,還需要調用python manage.py makemigrations,然後migrate,遷移文件的序號會增加。

      • 注意:

        1. 遷移的應用必須在settings.py的INSTALLED_APPS中註冊。
        2. 不要誰便刪除這些遷移文件,因爲後面的改動都是要依據這些遷移文件的。
      • 生成的遷移文件0001_initial.py內容如下:

      # Generated by Django 2.2 on 2019-09-06 00:09
      
      from django.db import migrations, models
      
      
      class Migration(migrations.Migration):
      
          initial = True
      
          dependencies = [
          ]
      
          operations = [
              migrations.CreateModel(
                  name='User',
                  fields=[
                      ('id', models.AutoField(primary_key=True, serialize=False)),
                      ('name', models.CharField(max_length=48)),
                      ('email', models.CharField(max_length=64, unique=True)),
                      ('password', models.CharField(max_length=128)),
                  ],
                  options={
                      'db_table': 'user',
                  },
              ),
          ]
      
    2. 執行遷移生成數據庫的表python manage.py migrate

      • 執行了遷移,還同時生成了admin管理用的表。
      • 查看數據庫,user表創建好了,字段設置完全正確。
        django3_002

Django後臺管理

  1. 創建管理員

    • 命令python manage.py createsuperuser
      • 管理會用戶名admin
      • 密碼adminadmin
    venv) D:\MyPythonUse\DjangoWeb>python manage.py createsuperuser
    Username (leave blank to use 'gdy'): admin
    Email address: admin@admin
    Error: Enter a valid email address.
    Email address: admin@admin.com
    Password:
    Password (again):
    The password is too similar to the email address.
    
  2. 本地化

    • settings.py中可以設置語言、時區。語言名稱可以查看django\contrib\admin\locale目錄
    # 修改djweb/settings.py文件中對應變量
    LANGUAGE_CODE = 'zh-Hans' #'en-us'
    
    TIME_ZONE = 'Asia/Shanghai' # 'UTC'
    
    USE_TZ = True
    
  3. 啓動WEB Server

    • 命令python manage.py runserver默認啓動端口在8000
    • 訪問http://127.0.0.1:8000/看到服務啓動正常
      django3_003
    • 訪問http://127.0.0.1:8000/admin/可以登錄後臺管理界面
      • 注意:用戶名密碼爲之前第一步創建管理員時設定的。
      • 用戶名:admin
      • 密碼:adminadmin
        django3_004
  4. 註冊應用模塊

    • 註冊後user可以被管理員用戶在web界面進行增刪改操作
    • 在user應用的admin.py添加
    #/user/admin.py文件
    from django.contrib import admin
    from .models import User
    # Register your models here.
    
    #註冊User應用模塊
    admin.site.register(User)
    
    • 登錄成功後,可以看到之前註冊的user表
      django3_005

路由

  • 路由功能就是實現URL模式匹配和處理函數之間的映射。
  • 路由配置要在項目的urls.py中配置,也可以多級配置,在每一個應用中,建立一個urls.py文件配置路由映射。
  1. url函數(1.1版本)
    • url(regex,view,kwargs=None,name=None)進行模式匹配
      1. regex:正則表達式,與之匹配的URL會執行對應的第二個參數view
      2. view:用於執行與正則表達式匹配的URL請求
      3. kwargs:視圖使用的字典類型的參數
      4. name:用來反向獲取URL
  2. 在2.2版本中,url函數被替換成re_path函數,用法一致。同時2.2版本還支持path函數做映射
  • 修改djweb/urls.py文件
from django.contrib import admin
from django.urls import path
from django.urls import re_path
from django.http import HttpResponse,HttpRequest

def index(request:HttpRequest):
    """視圖函數:請求進來返回響應"""
    res = HttpResponse(b"Hello word xdd")
    print(res.charset) #utf-8
    return res

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^$',index),
    re_path(r'^index$',index) #不同路徑可以指向同一個函數執行
]
  • 啓動web服務python manage.py runserver

    1. 訪問http://127.0.0.1:8000/indexhttp://127.0.0.1:8000/可以看到訪問界面
  • url的定義與訪問

    1. url(r'^index/$',index)
      • http://127.0.0.1:8000/index/可以訪問
      • http://127.0.0.1:8000/index可以訪問,但會自動補一個/
    2. url(r'^index$',index)
      • http://127.0.0.1:8000/index可以訪問
      • http://127.0.0.1:8000/index/不可以訪問
  • 請求信息測試和JSON響應,修改上面index函數

from django.http import HttpResponse,HttpRequest,JsonResponse

def index(request:HttpRequest):
    """視圖函數:請求進來返回響應"""
    d = {}
    d["method"] = request.method
    d["path"] = request.path
    d["path_info"] = request.path_info
    d["GETparams"] = request.GET

    return JsonResponse(d)
  • 在項目中首頁數使用HTML顯示,爲了加載速度快,一般多使用靜態頁面。如果首頁內容多,還有部分數據需要變化,將變化部分使用AJAX技術從後臺獲取數據。
  • 本次,爲了學習模板技術,只將首頁採用Django的模板技術實現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章