Django框架
【簡(jiǎn)介】:Python下有許多款不同的 Web 框架,Django是重量級(jí)的web框架中最有代表性的框架之一。
下面介紹使用Pycharm圖形化界面創(chuàng)建 Django項(xiàng)目 。
一、創(chuàng)建Django項(xiàng)目
點(diǎn)擊file => new project創(chuàng)建新項(xiàng)目。選擇Django欄目,輸入項(xiàng)目名稱,這里采用mysite。選擇Python解釋器版本,點(diǎn)擊create創(chuàng)建。如圖:

【第二種方式】項(xiàng)目創(chuàng)建過(guò)程也可以這樣做:
在 teminal命令窗格 中通過(guò)命令安裝Django庫(kù):
pip install django django-admin
python manage.py startproject mysite
以及開(kāi)始一個(gè)新的項(xiàng)目:
python manage.py startproject mysite
生成的目錄如下圖所示:

三、各文件和目錄的用途:
上圖為Django項(xiàng)目的根目錄。它包含了一系列自動(dòng)生成的目錄和文件,具備各自專(zhuān)有的用途。
外層的mysite目錄與Django無(wú)關(guān),只是你項(xiàng)目的容器,可以任意命名;
manage.py:一個(gè)命令行工具,用于與Django進(jìn)行不同方式的交互腳本,非常重要,也是 Django的管理主程序;
內(nèi)層的mysite/ 目錄是真正的項(xiàng)目文件包裹目錄,他的名字是你引用內(nèi)部文件的包明,例如: mysite.urls。 - mysite/init.py : 一個(gè)定義包的空文件;
mysite/settings.py: 項(xiàng)目的主配置文件
mysite/urls.py: 路由文件,所有的任務(wù)都是從這里開(kāi)始分配,相當(dāng)于Django驅(qū)動(dòng)站點(diǎn)的內(nèi)容 表格;
mysite.wsgi.py : 一個(gè)基于WSGI的web服務(wù)器進(jìn)入點(diǎn),提供底層的網(wǎng)絡(luò)通信功能(通常不用care...);
四、創(chuàng)建APP
在每個(gè)Django項(xiàng)目中可以包含多個(gè)APP,相當(dāng)于一個(gè)大型項(xiàng)目中的分系統(tǒng),子模塊,功能部件等等,相互之間比較獨(dú)立,但也有聯(lián)系。
APP應(yīng)用和project項(xiàng)目的區(qū)別:
- 一個(gè)APP實(shí)現(xiàn)某個(gè)功能,比如博客,公共檔案數(shù)據(jù)庫(kù)或者見(jiàn)到的投票系統(tǒng) ;
- 一個(gè)project是配置文件和多個(gè)APP的集合,這里APP組合成整個(gè)站點(diǎn) ;
- 一個(gè)project可以包含多個(gè)APP ;
- 一個(gè)APP可以屬于多個(gè)project;
【所有的APP能夠共享項(xiàng)目資源】
在 teminal 中通過(guò)命令創(chuàng)建APP:
python manage.py startapp 文件

五、編寫(xiě)路由
路由都在urls文件里面,它將瀏覽器輸入的url映射到相應(yīng)的業(yè)務(wù)處理邏輯。如下所示:
from django.urls import path,include
urlpatterns = [
path('user/', include("user.urls")),
path("",include("blog.urls"))
]
六、運(yùn)行web服務(wù)
在 teminal 中通過(guò)命令運(yùn)行web.
python manage.py runserver
七、使用靜態(tài)文件
前端三大塊 HTML,CSS,JS 還有各種插件在Django項(xiàng)目中存放,我們將這些文件統(tǒng)稱為“靜態(tài)文件”,因?yàn)?這些文件的內(nèi)容基本是固定不變的,不需要?jiǎng)討B(tài)生成,所以一般將靜態(tài)文件放在static目錄中(約定俗成的吧...)。
為了讓Django找到這個(gè)目錄,依然需要對(duì)settings進(jìn)行配置路徑。
例如:
// 配置靜態(tài)文件
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
)
然后在index.html文件中,引入js文件,項(xiàng)目寫(xiě)到現(xiàn)在,大概的項(xiàng)目文件目錄如下圖所示:

八、如何返回動(dòng)態(tài)頁(yè)面
在網(wǎng)頁(yè)中,當(dāng)我們收到用戶產(chǎn)生的數(shù)據(jù)之后,通??梢愿鶕?jù)數(shù)據(jù),進(jìn)行處理后返回動(dòng)態(tài)頁(yè)面。
所以,Django采用自己的模板語(yǔ)言,根據(jù)提供的數(shù)據(jù),替換掉HTML中的相應(yīng)部分。
【博客-用戶注冊(cè)界面】
在此html代碼中,采用Django模板語(yǔ)言進(jìn)行了替換。
{% extends 'base.html' %}
{% block title %} 微博客-用戶注冊(cè) {% endblock %}
{% block content %}
{% load widget_tweaks %}
<div class="container">
<div class="row">
<div class="panel panel-default">
<div class="panel-heading">
用戶注冊(cè)
</div>
<div class="panel-body">
<form id="register_form" action="{% url 'user:register' %}" method="POST">
{% csrf_token %}
{% for field in form %}
<div class="form-group">
{{ field.label_tag }}
{% render_field field class="form-control" %}
{% if field.html_name == 'valid_code' %}
<a href="#" id="send_code_to_email">給郵箱發(fā)送驗(yàn)證碼</a>
{% endif %}
{{ field.errors }}
</div>
{% endfor %}
<button type="submit" class="btn btn-primary pull-right">提交信息</button>
</form>
</div>
</div>
</div>
</div>
{% endblock %}
九、數(shù)據(jù)庫(kù)連接
(1)首先是注冊(cè)app(打開(kāi)mysite/settings.py配置文件,這是整個(gè)Django項(xiàng)目的設(shè)置中心):
INSTALLED_APPS = [
'user.apps.UserConfig',
'blog.apps.BlogConfig',
# django 自帶
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 第三方app
'widget_tweaks'
]
雖然這一塊兒的內(nèi)容不用深究,但是終究要明白這是什么意思;
【補(bǔ)充】:
django.contrib.admin:admin管理后臺(tái)站點(diǎn)
django.contrib.auth:身份認(rèn)證系統(tǒng)
django.contrib.contenttypes:內(nèi)容類(lèi)型框架
django.contrib.sessions:會(huì)話框架
django.contrib.messages:消息框架
django.contrib.staticfiles:靜態(tài)文件管理框架
(2)在settings中,配置數(shù)據(jù)庫(kù)相關(guān)的參數(shù)
# 數(shù)據(jù)庫(kù)連接
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'vblog',
'USER': 'root',
'PASSWORD': '',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
【注意】:確保你在settings文件中提供的數(shù)據(jù)庫(kù)用戶具有創(chuàng)建數(shù)據(jù)庫(kù)表的權(quán)限,因?yàn)樵诮酉聛?lái),我們需要自動(dòng)創(chuàng)建許多數(shù)據(jù)表。
(3)編輯 models.py
【解釋】:Django通過(guò)自定義Python類(lèi)的形式來(lái)定義具體的模型,每個(gè)模型的物理存在方式就是一個(gè) Python的類(lèi)Class,每個(gè)模型代表數(shù)據(jù)庫(kù)中的一張表,每個(gè)類(lèi)的實(shí)例代表數(shù)據(jù)表中的一行數(shù)據(jù),類(lèi) 中的每個(gè)變量代表數(shù)據(jù)表中的一列字段。
【重點(diǎn)】:Django通過(guò)模型,將Python代碼和數(shù)據(jù)庫(kù)操作結(jié)合起 來(lái),實(shí)現(xiàn)對(duì)SQL查詢語(yǔ)言的封裝。
如下代碼,實(shí)現(xiàn)了對(duì)User類(lèi)的封裝。
from django.db import models
from django.utils import timezone
import hashlib
# Create your models here.
class User(models.Model):
gender_choice = (
(1, "男"), (0, "女")
)
user_name = models.CharField(verbose_name="用戶名", unique=True, null= False, max_length=100)
password = models.CharField(verbose_name="密碼", null=False,max_length=200)
gender = models.CharField(choices=gender_choice, max_length=2)
email = models.EmailField(null=False, unique=True,max_length=100)
tel = models.CharField(null=True, unique=True, max_length=20)
create_time = models.DateTimeField(default=timezone.now)
class Meta:
db_table = 'tb_user'
verbose_name = '用戶'
verbose_name_plural = verbose_name
def __str__(self):
return self.user_name
def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
self.password = hashlib.md5(self.password.encode("utf-8")).hexdigest()
super().save()
Django通過(guò)ORM對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,奉行代碼優(yōu)先的理念,將Python程序員和數(shù)據(jù)庫(kù)管理員進(jìn)行分工解耦。
(4)在 teminal 中通過(guò)命令創(chuàng)建數(shù)據(jù)庫(kù)和數(shù)據(jù)表
python manage.py makemigrations
Python manage.py migrate
【總結(jié)】:修改模型時(shí)的操作分三步:
- 在models.py中修改模型;
- 運(yùn)行 python manage.py makemigrations 為改動(dòng)創(chuàng)建遷移記錄;
- 運(yùn)行 python manage.py migrate 將操作同步到數(shù)據(jù)庫(kù)。
(5)修改views.py中的業(yè)務(wù)邏輯
看圖,如何將數(shù)據(jù)存入數(shù)據(jù)庫(kù)中。

【最后】:重啟Web服務(wù)后,刷新頁(yè)面,之后和用戶交互的數(shù)據(jù)都能保存到數(shù)據(jù)庫(kù)中,任何時(shí)候都可以 從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù),展示到頁(yè)面上。
python manage.py runserver
【成果展示】


(留待更新...)