項目構建和基礎知識–Django播客系統(三)
文章目錄
概述
- Django採用MVC架構設計的開源的WEB快速開發框架。
- 優點:
- 能夠快速開發,自帶ORM、Template、Form、Auth核心組件
- MVC設計模式
- 實用的管理後臺Admin
- 簡潔的url設計
- 周邊插件豐富
- 缺點:架構重、同步阻塞
- 所有Django的設計目標就是一款大而全,便於企業快速開發項目的框架,因此企業應用較廣。
安裝Django
- Python實用3.6.x
- Django的下載地址https://www.djangoproject.com/download/
- Python版本依賴,參看https://docs.djangoproject.com/en/1.11/faq/install/#faq-python-version-support
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,這是企業的選擇。
$ 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
- 重要文件說明
- manage.py:本項目管理的命令行工具。應用創建、數據庫遷移等都使用它完成
- dgweb/settings.py:本項目的核心配置文件。數據庫、中間件、模板等
- dgweb/urls.py:URL路徑映射配置。項目初始,只配置了/admin的路由。
- 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文檔 |
- 數據庫引擎ENGINE
- 內建引擎有
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目錄,有如下文件:admin.py
:應用後臺管理聲明文件models.py
:模型層Model類定義views.py
:定義URL響應函數或類migrations包
:數據遷移文件生成目錄apps.py
:應用的信息定義文件
- user應用創建後應該完成以下功能:
- 用戶註冊
- 用戶登錄
註冊應用
在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 |
-
缺省主鍵
- 缺省情況下,Django的每一個Model都有一個名爲id的AutoField字段,如下
id = models.AutoField(primary_key=True)
- 如果顯示定義了主鍵,這種缺省主鍵就不會被創建了。Python之禪中說“顯示優於隱試”,所以,儘量使用自己定義的主鍵,哪怕該字段名就是id,也是一種不錯的選擇。
- 缺省情況下,Django的每一個Model都有一個名爲id的AutoField字段,如下
-
字段選項
值 說明 db_column 表中字段的名稱,如果未指定,則使用屬性名 primary_key 是否主鍵 unique 是否是唯一鍵 default 缺省值,這個缺省值不是數據庫字段的缺省值,而新對象產生的時候被填入的缺省值 null 表示字段是否可爲null,默認爲False blank Django表單驗證中,是否可以不填寫,默認爲False db_index 字段是否有索引 - 關係類型字段類
類 說明 ForeignKey 外鍵,表示一對多 ForeignKey('production.Manufacturer')
自聯ForeignKey('self')
ManyToManyField 表示多對多 OneToOneField 表示一對一 - 一對多,自動創建會增加
_id
後綴。- 從一訪問多,使用
對象.小寫模型類_set
- 從一訪問一,使用
對象.小寫模型類
- 從一訪問多,使用
- 訪問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
- 遷移Migration
- 遷移:從模型定義生成數據庫的表
-
生成遷移文件。執行
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,遷移文件的序號會增加。 -
注意:
- 遷移的應用必須在settings.py的INSTALLED_APPS中註冊。
- 不要誰便刪除這些遷移文件,因爲後面的改動都是要依據這些遷移文件的。
-
生成的遷移文件
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', }, ), ]
-
-
執行遷移生成數據庫的表
python manage.py migrate
- 執行了遷移,還同時生成了admin管理用的表。
- 查看數據庫,user表創建好了,字段設置完全正確。
Django後臺管理
-
創建管理員
- 命令
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.
- 命令
-
本地化
- settings.py中可以設置語言、時區。語言名稱可以查看
django\contrib\admin\locale
目錄
# 修改djweb/settings.py文件中對應變量 LANGUAGE_CODE = 'zh-Hans' #'en-us' TIME_ZONE = 'Asia/Shanghai' # 'UTC' USE_TZ = True
- settings.py中可以設置語言、時區。語言名稱可以查看
-
啓動WEB Server
- 命令
python manage.py runserver
默認啓動端口在8000 - 訪問
http://127.0.0.1:8000/
看到服務啓動正常
- 訪問
http://127.0.0.1:8000/admin/
可以登錄後臺管理界面- 注意:用戶名密碼爲之前第一步創建管理員時設定的。
- 用戶名:admin
- 密碼:adminadmin
- 命令
-
註冊應用模塊
- 註冊後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表
路由
- 路由功能就是實現URL模式匹配和處理函數之間的映射。
- 路由配置要在項目的urls.py中配置,也可以多級配置,在每一個應用中,建立一個urls.py文件配置路由映射。
- url函數(1.1版本)
url(regex,view,kwargs=None,name=None)
進行模式匹配regex
:正則表達式,與之匹配的URL會執行對應的第二個參數viewview
:用於執行與正則表達式匹配的URL請求kwargs
:視圖使用的字典類型的參數name
:用來反向獲取URL
- 在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
- 訪問
http://127.0.0.1:8000/index
和http://127.0.0.1:8000/
可以看到訪問界面
- 訪問
-
url的定義與訪問
url(r'^index/$',index)
http://127.0.0.1:8000/index/
可以訪問http://127.0.0.1:8000/index
可以訪問,但會自動補一個/
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的模板技術實現。