【Django】項(xiàng)目實(shí)例

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)目文件目錄如下圖所示:


插入js文件

八、如何返回動(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ù)中。


修改業(yè)務(wù)邏輯

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

python manage.py runserver

【成果展示】


大概就做到醬紫
Django-留言板作品

(留待更新...)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容