Django 入門(mén)筆記
官方網(wǎng)站:https://www.djangoproject.com/
Django makes it easier to build better Web apps more quickly and with less code.(Django可以方便地使用較少的代碼快速構(gòu)建web應(yīng)用。)
Django 最初被設(shè)計(jì)用于具有快速開(kāi)發(fā)需求的新聞?lì)愓军c(diǎn),目的是要實(shí)現(xiàn)簡(jiǎn)單快捷的網(wǎng)站開(kāi)發(fā)砾隅。
一、環(huán)境搭建
1.1. Python 3.7
略
1.2. PyCharm
略
1.3. Django 2.2+
- pip命令安裝
pip install Django==2.2.6
2.2.6是最新的一個(gè)官方長(zhǎng)期支持版本拣挪。(2019-10-31)
- 查看安裝好的django版本
python -m django –version
二、新建django工程
1. 新建一個(gè)命名為helloworld的Django工程
django-admin startproject helloworld # helloworld是工程的名字
2. 創(chuàng)建工程之后會(huì)幫助我們自動(dòng)生成一些文件
manage.py :使用django-admin命令行工具的快捷方式。它用于運(yùn)行與我們項(xiàng)目相關(guān)的管理命令。我們將使用它來(lái)運(yùn)行開(kāi)發(fā)服務(wù)器字逗,運(yùn)行測(cè)試,創(chuàng)建遷移等等宅广。
__init__.py:這個(gè)空文件告訴python這個(gè)文件夾是一個(gè)python包葫掉。
setting.py :這個(gè)文件包含了所有的項(xiàng)目配置。
urls.py:這個(gè)文件負(fù)責(zé)映射我們項(xiàng)目中的路由和路徑跟狱。例如俭厚,如果你想在訪問(wèn)URL /about/ 時(shí)顯示某些內(nèi)容,則必須先在這里做映射關(guān)系驶臊。
wsgi.py:該文件是用于部署的簡(jiǎn)單網(wǎng)關(guān)接口挪挤。
3. 直接啟動(dòng)工程
python manage.py runserver 8080 # 端口
4. 打開(kāi)瀏覽器進(jìn)入django的默認(rèn)頁(yè)面
看到上面的頁(yè)面前面的環(huán)境配置都是ok的。
到這里我們可以進(jìn)入下一步关翎,在這個(gè)工程中創(chuàng)建一個(gè)應(yīng)用扛门,這個(gè)應(yīng)用可以來(lái)實(shí)現(xiàn)一些功能。
三纵寝、創(chuàng)建一個(gè)webapp
在Django的哲學(xué)中论寨,我們有兩個(gè)重要的概念:app:是一個(gè)可以做完成某件事情的Web應(yīng)用程序。project:是配置和應(yīng)用程序的集合。一個(gè)項(xiàng)目可以由多個(gè)應(yīng)用程序或一個(gè)應(yīng)用程序組成葬凳。
1. 在上面helloworld工程目錄下執(zhí)行下面的命令
python manage.py startapp myapp # myapp是應(yīng)用的名字
同樣的, django會(huì)幫助我們創(chuàng)建一些必要的文件和目錄绰垂。
- migrations/: 在這個(gè)文件夾里,Django會(huì)存儲(chǔ)一些文件以跟蹤你在models.py文件中創(chuàng)建的變更火焰,用來(lái)保持?jǐn)?shù)據(jù)庫(kù)和models.py的同步劲装。
- admin.py: 這個(gè)文件為一個(gè)django內(nèi)置的應(yīng)用程序Django Admin的配置文件。
- apps.py:這是應(yīng)用程序本身的配置文件荐健。
- models.py:這里是我們定義Web應(yīng)用程序數(shù)據(jù)實(shí)例的地方酱畅。models會(huì)由Django自動(dòng)轉(zhuǎn)換為數(shù)據(jù)庫(kù)表。
- tests.py:這個(gè)文件用來(lái)寫(xiě)當(dāng)前應(yīng)用程序的單元測(cè)試江场。
- views.py:這是我們處理Web應(yīng)用程序請(qǐng)求(request)/響應(yīng)(response)的文件纺酸。
2. 設(shè)置一下全局的setting.py文件
在INSTALLED_APPS變量中添加我們創(chuàng)建的myapp應(yīng)用
INSTALLED_APPS = [
...
'myapp.apps.MyappConfig', #2.2.6這樣寫(xiě)
]
修改LANGUAGE_CODE變量,將默認(rèn)的改為如下址否,這會(huì)使得admin后臺(tái)界面展示中文餐蔬,也可以不修改。
LANGUAGE_CODE = 'zh-hans'#設(shè)置中文
3. 創(chuàng)建一個(gè)簡(jiǎn)單頁(yè)面
修改視圖代碼views.py, 添加以下代碼:
from django.http import HttpResponse
def index(request):
return HttpResponse('hello world!!!!!')# 將返回一個(gè)頁(yè)面佑附,并在頁(yè)面上繪制出“hello world7怠!R敉4逝馈!”
4. 在webapp內(nèi)創(chuàng)建路由
在myapp/下創(chuàng)建一個(gè)urls.py文件权均,然后添加以下代碼:
from django.urls import path
urlpatterns = [
path('index/',myapp.views.index),# 當(dāng)用戶訪問(wèn)index/時(shí)會(huì)將請(qǐng)求交給views中的index方法
]
5. 將webapp的路由添加到工程下的路由
修改工程目錄下的urls.py中的代碼如下:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('myapp/', include('myapp.urls')),# 當(dāng)用戶訪問(wèn)myapp時(shí)會(huì)將請(qǐng)求鏈接交給myapp中的urls.py處理
]
6. 訪問(wèn)并驗(yàn)證修改
至此顿膨,就完成了一個(gè)django項(xiàng)目helloworld工程的搭建。
四叽赊、django的基本原理
1. 架構(gòu)示意圖
2.django的MVT結(jié)構(gòu)
Django對(duì)傳統(tǒng)的MVC設(shè)計(jì)模式進(jìn)行了修改恋沃,將視圖分成View模塊和Template模塊兩部分,將動(dòng)態(tài)的邏輯處理與靜態(tài)的頁(yè)面展現(xiàn)分離開(kāi)必指。而Model采用了ORM技術(shù)囊咏,將關(guān)系型數(shù)據(jù)庫(kù)表抽象成面向?qū)ο蟮腜ython類(lèi),將表操作轉(zhuǎn)換成類(lèi)操作塔橡,避免了復(fù)雜的SQL語(yǔ)句編寫(xiě)梅割。MTV和MVC本質(zhì)上是一樣的。
M:模板(Model), 對(duì)應(yīng)models.py文件, 是數(shù)據(jù)交互層的封裝葛家。
V:視圖(View)炮捧,對(duì)應(yīng)views.py文件,負(fù)責(zé)業(yè)務(wù)邏輯惦银。
T:模板(Template):將數(shù)據(jù)與HTML語(yǔ)言結(jié)合起來(lái)的引擎咆课。
3. 簡(jiǎn)單的MVT示例
本節(jié)主要通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明Django的MVT具體是個(gè)什么末誓。
STEP01 配置數(shù)據(jù)庫(kù)
配置數(shù)據(jù)庫(kù), 默認(rèn)情況使用SQLite3,修改settings.py中的DATABASES字段书蚪。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
也可以根據(jù)需要修改喇澡,數(shù)據(jù)庫(kù)配置,如:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
'ENGINE'的內(nèi)建的值有:
'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'
STEP02 修改models.py, 定義數(shù)據(jù)模型
數(shù)據(jù)模型與數(shù)據(jù)庫(kù)對(duì)應(yīng)殊校∏缇粒基本原則如下:
- 每個(gè)模型在Django中的存在形式為一個(gè)Python類(lèi)。
- 每個(gè)模型都是django.db.models. Model的子類(lèi)为流。
- 模型的每個(gè)字段(屬性)代表數(shù)據(jù)表的某一列呕屎。
- Django將自動(dòng)為你生成數(shù)據(jù)庫(kù)訪問(wèn)API。
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=30)
sex = models.CharField(max_length=30)
age = models.CharField(max_length=30)
def __str__(self):
return self.name + ',' + self.sex + ',' + self.age
使用python manage.py makemigrations和python manage.py migrate命令將模型應(yīng)用到數(shù)據(jù)庫(kù)
>> helloworld>python manage.py makemigrations
Migrations for 'myapp':
myapp\migrations\0001_initial.py
- Create model Person
>> helloworld>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, myapp, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying myapp.0001_initial... OK
Applying sessions.0001_initial... OK
完成之后會(huì)在工程根目錄下生成db.sqlite3文件
>> helloworld>ls
db.sqlite3 helloworld manage.py myapp
并在數(shù)據(jù)庫(kù)中創(chuàng)建表和其中的字段
STEP03 將數(shù)據(jù)模型注冊(cè)到admin敬察,并添加測(cè)試數(shù)據(jù)
修改admin.py文件代碼如下:
from django.contrib import admin
from .models import Person
admin.site.register(Person)
創(chuàng)建admin后臺(tái)的超級(jí)管理員
python manage.py createsuperuser
打開(kāi)admin后臺(tái)http://127.0.0.1:8000/admin/秀睛,輸入超級(jí)管理員賬戶,登錄后臺(tái)莲祸□灏玻可以使用如下的頁(yè)面管理已注冊(cè)的數(shù)據(jù)。
添加幾條數(shù)據(jù)锐帜,后面我們將它展示在一個(gè)簡(jiǎn)單的頁(yè)面中
打開(kāi)數(shù)據(jù)庫(kù)查詢田盈,發(fā)現(xiàn)數(shù)據(jù)已經(jīng)寫(xiě)入。
SETP04 創(chuàng)建一個(gè)person_list視圖
修改views.py, 添加如下代碼:
from django.shortcuts import render
from .models import Person
from django.forms.models import model_to_dict
def person_list(request):
persons = Person.objects.all()
person_list=[]
for p in persons:
p_dict = model_to_dict(p)
person_list.append(p_dict)
return render(request, 'myapp/person_list.html',{"persons":person_list})
Person.objects.all():查詢所有的person數(shù)據(jù)缴阎。
render(request, 'myapp/person_list.html', {"persons":person_list}):將查詢結(jié)果拼接模板返回給用戶
STEP05 為person_list視圖創(chuàng)建對(duì)應(yīng)的路由
修改urls.py, 添加如下代碼:
urlpatterns = [
...
path('person_list/', views.person_list name='person_list'),
]
STEP06 補(bǔ)充模板文件person_list.html
在myapp子目錄下創(chuàng)建templates, 新建myapp/person_list.html模板文件允瞧,并添加如下代碼:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>person_list</title>
</head>
<body>
<ul>
{% for person in persons %}
<li> 姓名:{{ person.name}},性別:{{ person.sex }},年齡:{{ person.age }}</li>
{% endfor %}
</ul>
</body>
</html>
- {% for %}是django的模板語(yǔ)法蛮拔,可以根據(jù)傳參動(dòng)態(tài)生成html頁(yè)面述暂。上例就是講查詢到的person傳入,拼裝成具體的li標(biāo)簽语泽。
STEP07 啟動(dòng)django訪問(wèn)頁(yè)面
訪問(wèn)地址http://127.0.0.1:8000/myapp/person_list/
展示如下,可以看到從db查詢到數(shù)據(jù)并展示在前端视卢。
以上就完成了一個(gè)簡(jiǎn)單的django MVT的工程踱卵,Models負(fù)責(zé)數(shù)據(jù)層,通過(guò)集成Model類(lèi)可以使用django現(xiàn)成的API操作數(shù)據(jù)庫(kù)据过;Views負(fù)責(zé)業(yè)務(wù)層惋砂,溝通頁(yè)面請(qǐng)求和響應(yīng)請(qǐng)求,業(yè)務(wù)處理了查詢數(shù)據(jù)和生成頁(yè)面绳锅;Templates是視圖層西饵,可以使用模板語(yǔ)言創(chuàng)建某頁(yè)面的框架,有較好的通用性鳞芙。