Django-TestOps網(wǎng)站
源碼地址:https://github.com/ellaann/TestOpsPlatform
項目實現(xiàn)功能
概述:前端通過Bootstrap框架阀圾,借助AdminLte模板實現(xiàn)交互樣式晨雳;后端通過Python+Django實現(xiàn)參數(shù)傳遞筐骇;數(shù)據(jù)庫通過sqlite3,實現(xiàn)數(shù)據(jù)讀取保存。
1、注冊
2逐工、登錄
3、登錄后的主頁顯示
4铝噩、網(wǎng)站歸納
1)公司網(wǎng)站
2)常用網(wǎng)站
3)新增網(wǎng)站
5衡蚂、項目部署&上線
1)測試環(huán)境部署
2)通過dwebsocket,實現(xiàn)與服務(wù)器連接,輸入查詢指令后骏庸,頁面的實時滾動
6毛甲、SQL同步
一、官方文檔
Django中文官網(wǎng): https://docs.djangoproject.com/zh-hans/3.0/
Django英文官網(wǎng): https://docs.djangoproject.com/en/3.0/
二具被、初始化
1玻募、創(chuàng)建項目
使用 startproject 來創(chuàng)建項目
django-admin startproject edrainsite
項目顯示:
test_ops/
manage.py
test_ops/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
這些目錄和文件的用處是:
- The outer
test_ops/
root directory is a container for your project. Its name doesn't matter to Django; you can rename it to anything you like. - manage.py: 一個讓你用各種方式管理 Django 項目的命令行工具。你可以閱讀 django-admin and manage.py 獲取所有 manage.py 的細節(jié)一姿。
- 里面一層的 test_ops/ 目錄包含你的項目七咧,它是一個純 Python 包。它的名字就是當(dāng)你引用它內(nèi)部任何東西時需要用到的 Python 包名叮叹。 (比如 test_ops.urls).
- test_ops/init.py:一個空文件艾栋,告訴 Python 這個目錄應(yīng)該被認為是一個 Python 包。如果你是 Python 初學(xué)者蛉顽,閱讀官方文檔中的 更多關(guān)于包的知識蝗砾。
- test_ops/settings.py:Django 項目的配置文件。如果你想知道這個文件是如何工作的携冤,請查看 Django 配置 了解細節(jié)悼粮。
- test_ops/urls.py:Django 項目的 URL 聲明,就像你網(wǎng)站的“目錄”曾棕。閱讀 URL調(diào)度器 文檔來獲取更多關(guān)于 URL 的內(nèi)容扣猫。
- test_ops/asgi.py: 兼容ASGI的Web服務(wù)器為您的項目提供服務(wù)的入口點。See How to deploy with ASGI for more details.
- test_ops/wsgi.py:作為你的項目的運行在 WSGI 兼容的Web服務(wù)器上的入口睁蕾。閱讀 如何使用 WSGI 進行部署 了解更多細節(jié)苞笨。
2债朵、運行項目
py manage.py runserver 127.0.0.1:8028
樣就可以運行起來啦 打開網(wǎng)址:http://127.0.0.1:8028/ 進行校驗
3、創(chuàng)建應(yīng)用
py manage.py startapp sign
這些目錄和文件的用處是:
- migrations/:用于記錄models中數(shù)據(jù)的變更瀑凝;
- admin.py:映射models中的數(shù)據(jù)到Django自帶的admin后臺序芦;
- apps.py:用于應(yīng)用程序的配置(在新的Django版本中新增文件);
- models.py: Django的模型文件粤咪,創(chuàng)建應(yīng)用程序數(shù)據(jù)表模型(對應(yīng)數(shù)據(jù)庫的相關(guān)操作)谚中;
- tests.py:創(chuàng)建Django測試用例;
- views.py: Django的視圖文件寥枝,控制向前段頁面顯示的內(nèi)容宪塔。
三、編寫第一個視圖
1囊拜、打開 sign/views.py
把下面這些 Python 代碼輸入進去:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the sign index.")
這是 Django 中最簡單的視圖某筐。如果想看見效果,我們需要將一個 URL 映射到它——這就是我們需要 URLconf 的原因了冠跷。
為了創(chuàng)建 URLconf南誊,請在 sign目錄里新建一個 urls.py
文件。
2蜜托、在 sign目錄里新建一個 urls.py
文件
輸入如下代碼:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
3抄囚、在根 URLconf 文件中指定創(chuàng)建的 sign.urls
模塊
在 test_ops/urls.py
文件的 urlpatterns
列表里插入一個 include()
, 如下:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('sign/', include('sign.urls')),
]
函數(shù) include()
允許引用其它 URLconfs橄务。每當(dāng) Django 遇到 include()
時幔托,它會截斷與此項匹配的 URL 的部分,并將剩余的字符串發(fā)送到 URLconf 以供進一步處理蜂挪。
include()
的理念是使其可以即插即用重挑。因為sign應(yīng)用有它自己的 URLconf( sign/urls.py
),他們能夠被放在 "/sign/" 锅劝, "/fun_sign/" 攒驰,"/content/sign/",或者其他任何路徑下故爵,這個應(yīng)用都能夠正常工作玻粪。
當(dāng)包括其它 URL 模式時你應(yīng)該總是使用
include()
,admin.site.urls
是唯一例外诬垂。
四劲室、通過templates來展示頁面
1、在sign文件夾下面结窘,創(chuàng)建templates
文件夾
2很洋、創(chuàng)建sign.html文件
<html>
<head>
<title>Sign</title>
</head>
<body>
<h1>Hello Web!</h1>
</body>
</html>
3、修改sign/urls.py
文件
from django.shortcuts import render
def sign(request):
# return HttpResponse("Hello, world. You're at the sign index.")
return render(request, 'sign.html')
4隧枫、修改settings.py
文件喉磁,新增'sign',
文字
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 你項目的 TEMPLATES 配置項描述了 Django 如何載入和渲染模板谓苟。
# 默認的設(shè)置文件設(shè)置了 DjangoTemplates 后端,并將 APP_DIRS 設(shè)置成了 True协怒。
# 這一選項將會讓 DjangoTemplates 在每個 INSTALLED_APPS 文件夾中尋找 "templates" 子目錄涝焙。
'sign',
]
你項目的 TEMPLATES
配置項描述了 Django 如何載入和渲染模板。默認的設(shè)置文件設(shè)置了 DjangoTemplates
后端孕暇,并將 APP_DIRS
設(shè)置成了 True仑撞。這一選項將會讓 DjangoTemplates
在每個 INSTALLED_APPS
文件夾中尋找 "templates" 子目錄。這就是為什么盡管我們沒有像在第二部分中那樣修改 DIRS 設(shè)置妖滔,Django 也能正確找到 polls 的模板位置的原因隧哮。
輸入網(wǎng)址:http://127.0.0.1:8028/sign/
五、數(shù)據(jù)庫配置
Django 提供完善的模型(model)層主要用來創(chuàng)建和存取數(shù)據(jù)座舍,不需要我們直接對數(shù)據(jù)庫操作沮翔。
Django模型的基礎(chǔ)知識:
- 每個模型是一個Python類,繼承django.db.models.Model類
- 該模型的每個屬性表示一個數(shù)據(jù)庫表字段
- 所有這一切曲秉,已經(jīng)給了你一個自動生成數(shù)據(jù)庫訪問的API
1鉴竭、打開 test_ops/settings.py
,配置Database
這是個包含了 Django 項目設(shè)置的 Python 模塊。通常岸浑,這個配置文件使用 SQLite 作為默認數(shù)據(jù)庫。如果你不熟悉數(shù)據(jù)庫瑰步,或者只是想嘗試下 Django矢洲,這是最簡單的選擇。Python 內(nèi)置 SQLite缩焦,所以你無需安裝額外東西來使用它读虏。當(dāng)你開始一個真正的項目時,你可能更傾向使用一個更具擴展性的數(shù)據(jù)庫袁滥,例如 PostgreSQL盖桥,避免中途切換數(shù)據(jù)庫這個令人頭疼的問題。
如果你想使用其他數(shù)據(jù)庫题翻,你需要安裝合適的 database bindings 揩徊,然后改變設(shè)置文件中 DATABASES
'default'
項目中的一些鍵值:
-
ENGINE
-- 可選值有'django.db.backends.sqlite3'
,'django.db.backends.postgresql'
嵌赠,'django.db.backends.mysql'
塑荒,或'django.db.backends.oracle'
。其它 可用后端姜挺。 -
NAME
- 數(shù)據(jù)庫的名稱齿税。如果使用的是 SQLite,數(shù)據(jù)庫將是你電腦上的一個文件炊豪,在這種情況下凌箕,NAME
應(yīng)該是此文件的絕對路徑,包括文件名。默認值os.path.join(BASE_DIR, 'db.sqlite3')
將會把數(shù)據(jù)庫文件儲存在項目的根目錄赏参。
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
2腰涧、打開 test_ops/settings.py
,配置INSTALLED_APPS
test_ops/settings.py
文件頭部的 INSTALLED_APPS
設(shè)置項。這里包括了會在你項目中啟用的所有 Django 應(yīng)用。應(yīng)用能在多個項目中使用雇卷,你也可以打包并且發(fā)布應(yīng)用翘瓮,讓別人使用它們调榄。
通常择份, INSTALLED_APPS
默認包括了以下 Django 的自帶應(yīng)用:
-
django.contrib.admin
-- 管理員站點鸽斟。 -
django.contrib.auth
-- 認證授權(quán)系統(tǒng)慢逾。 -
django.contrib.contenttypes
-- 內(nèi)容類型框架口注。 -
django.contrib.sessions
-- 會話框架。 -
django.contrib.messages
-- 消息框架材部。 -
django.contrib.staticfiles
-- 管理靜態(tài)文件的框架。
這些應(yīng)用被默認啟用是為了給常規(guī)項目提供方便。
默認開啟的某些應(yīng)用需要至少一個數(shù)據(jù)表账阻,所以,在使用他們之前需要在數(shù)據(jù)庫中創(chuàng)建一些表。請執(zhí)行以下命令:
...\> py manage.py migrate
就像之前說的,為了方便大多數(shù)項目巢音,我們默認激活了一些應(yīng)用似谁,但并不是每個人都需要它們蛀缝。如果你不需要某個或某些應(yīng)用在讶,你可以在運行
migrate
前毫無顧慮地從INSTALLED_APPS
里注釋或者刪除掉它們。migrate
命令只會為在INSTALLED_APPS
里聲明了的應(yīng)用進行數(shù)據(jù)庫遷移构哺。
3革答、創(chuàng)建模型
在sign/models.py文件中,新增
4曙强、當(dāng)模型創(chuàng)建好以后残拐,執(zhí)行數(shù)據(jù)庫遷移
使用如下命令進行數(shù)據(jù)庫表的初始化和創(chuàng)建(遷移):
運行 python manage.py makemigrations sign 為模型的改變生成遷移文件。
運行 python manage.py migrate 來應(yīng)用數(shù)據(jù)庫遷移碟嘴。
六溪食、認證登錄
1、創(chuàng)建admin系統(tǒng)用戶
...\> python manage.py createsuperuser
2娜扇、輸入用戶错沃、密碼信息
py manage.py createsuperuser
sername (leave blank to use 'edrain'): admin
mail address: admin@mail.com
Password:
assword (again):
his password is too short. It must contain at least 8 characters.
his password is too common.
ypass password validation and create user anyway? [y/N]: y
uperuser created successfully.
七、開發(fā)模式
這段話在Django官方文檔也曾出現(xiàn)過:鼓勵松耦合以及對應(yīng)用程序中不同部分的嚴格分割雀瓢。
1枢析、MVC開發(fā)模式
MVC:Model-View-Controller
- model:數(shù)據(jù)存取層。
- view:表現(xiàn)邏輯刃麸,代表的是系統(tǒng)中選擇顯示什么和怎么顯示的部分醒叁。
- controller:業(yè)務(wù)邏輯,代表系統(tǒng)中根據(jù)用戶輸入及需要訪問模型,使用哪個視圖的哪部分辐益。
對應(yīng)到Django后:
- Model:數(shù)據(jù)存取部分断傲,由Django數(shù)據(jù)庫層處理;
- View:表現(xiàn)邏輯智政,選擇顯示哪些數(shù)據(jù)要顯示以及怎樣顯示的部分认罩,由Django的視圖和模板處理;
- Controller:業(yè)務(wù)邏輯续捂,由Django根據(jù)URLconf設(shè)置垦垂,對給定URL調(diào)用適當(dāng)?shù)腜ython函數(shù)。
2牙瓢、MTV開發(fā)模式
由于Controller由框架自行處理劫拗,而Django里更關(guān)注的是模型(Model)、模板(Template)矾克、視圖(View)页慷,因此Django也被稱為MTV框架。
MTV:Model-Template-Views
- Model:模型胁附,數(shù)據(jù)存取層酒繁,該層處理與數(shù)據(jù)相關(guān)的所有事務(wù),即如何存取控妻、如果驗證有效等州袒;
- Template:模板,表現(xiàn)層弓候,該層處理與表現(xiàn)相關(guān)的所有事務(wù)郎哭,即如何在頁面或者其他類型文檔中進行顯示;
- View:視圖菇存,業(yè)務(wù)邏輯層夸研,該層包含存取模型及調(diào)取恰當(dāng)模板的相關(guān)邏輯,可以看作是模型和模板之間的橋梁依鸥。
八亥至、小技巧
1、去除模板中的硬編碼 URL
1)修改sign/templates/sign/sign_in.html
文件
當(dāng)發(fā)送登錄請求時毕籽,鏈接是硬編碼的:
<form action="/login_action/" method="post">
問題在于,硬編碼和強耦合的鏈接井辆,對于一個包含很多應(yīng)用的項目來說关筒,修改起來是十分困難的。然而杯缺,因為你在 sign.urls
的 url()
函數(shù)中通過 name 參數(shù)為 URL 定義了名字蒸播,你可以使用 {% url %}
標(biāo)簽代替它。
替代如下:
<form action="{% url 'login_action' %}" method="post">
這個標(biāo)簽的工作方式是在 sign.urls
模塊的 URL 定義中尋具有指定名字的條目。你可以回憶一下袍榆,具有名字 'login_action' 的 URL 是在如下語句中定義的胀屿。
2)修改sign/urls.py
文件,新增name='login_action'
path('login_action/', views.login_action, name='login_action'), # name的值可以在html中關(guān)聯(lián){% url 'xxx' %} template tag
如果你想改變登錄視圖的 URL包雀,比如想改成 sign/edrain/login_action/ 宿崭,你不用在模板里修改任何東西(包括其它模板),只要在sign/urls.py
里稍微修改一下就行才写。
修改如下:
# added the word 'edrain'
path('edrain/login_action/', views.login_action, name='login_action'),
2葡兑、為 URL 名稱添加命名空間
Django 如何知道 {% url %}
標(biāo)簽到底對應(yīng)哪一個應(yīng)用的 URL 呢?
1)在根 URLconf 中添加命名空間赞草。在 sign/urls.py
文件中稍作修改讹堤,加上 app_name
設(shè)置命名空間:
from django.urls import path
from . import views
app_name = 'sign' # 設(shè)置命名空間
urlpatterns = [
path('', views.sign, name='sign'),
path('login_action/', views.login_action, name='login_action'), # name的值可以在html中關(guān)聯(lián){% url 'xxx' %} template tag
]
2)修改sign/templates/sign/sign_in.html文件,
從<form action="{% url 'login_action' %}" method="post">
修改為指向具有命名空間的詳細視圖,變更為:
<form action="{% url 'sign:login_action' %}" method="post">
3厨疙、HttpReponseDirect使用軟編碼鏈接
硬編碼鏈接:可以通過使用HttpResponseRedirect('/index/?page=2')直接獲取第2頁的文章列表
HttpReponseDirect只支持hard coded urls(硬編碼鏈接), 不能直接使用命名的URL洲守,如使用HttpResponseDirect('blog:article_list‘)是錯誤的。
在使用URL命名時沾凄,我們需要先通過URL反向解析方法reverse先對命名URL(article_list)進行解析梗醇,然后再使用HttpReponseRedirect定向(如下面的代碼)。背后的邏輯是reverse('blog:article_list')='/index/'搭独。
def login_action(request):
"""執(zhí)行 登錄按鈕 操作后的界面"""
if request.method == 'POST':
username = request.POST.get('username', '') # 此處對應(yīng)表單的form中的input的 name屬性
password = request.POST.get('password', '')
if username == 'qwer' and password == 'qwer':
return HttpResponseRedirect(reverse('sign:home')) # 對路徑重定向婴削,成功登陸之后重新指向 /sign/home/ 頁面
鏈接:https://blog.csdn.net/weixin_42134789/article/details/81505963
九、疑問
Q1:db.sqlite3是什么牙肝?
A1:鏈接:https://www.runoob.com/sqlite/sqlite-intro.html
SQLite是一個進程內(nèi)的庫唉俗,實現(xiàn)了自給自足的、無服務(wù)器的配椭、零配置的虫溜、事務(wù)性的 SQL 數(shù)據(jù)庫引擎。它是一個零配置的數(shù)據(jù)庫股缸,這意味著與其他數(shù)據(jù)庫一樣衡楞,您不需要在系統(tǒng)中配置。就像其他數(shù)據(jù)庫敦姻,SQLite 引擎不是一個獨立的進程瘾境,可以按應(yīng)用程序需求進行靜態(tài)或動態(tài)連接。SQLite 直接訪問其存儲文件镰惦。
Q2:項目和應(yīng)用區(qū)別迷守?
A2:鏈接:https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial01/
應(yīng)用程序是執(zhí)行某項操作的Web應(yīng)用程序,例如Weblog系統(tǒng)旺入,公共記錄數(shù)據(jù)庫或小型民意調(diào)查應(yīng)用程序兑凿。
項目是特定網(wǎng)站的配置和應(yīng)用程序的集合凯力。一個項目可以包含多個應(yīng)用程序。一個應(yīng)用程序可以在多個項目中礼华。
Q3:Pycharm提示“Unresolved attribute reference 'objects' for class 'UserModel'”
A3:You need to enable Django support. Go to
PyCharm -> Preferences -> Languages & Frameworks -> Django
and then check Enable Django Support
Q4:USE_TZ時區(qū)問題
datetime.datetime.now()咐鹤、datetime.datetime.utcnow()與django.util.timezone.now()的區(qū)別
datetime.datetime.now():
輸出的永遠是本地時間(naive time)與配置無任任何關(guān)系。
datetime.datetime.utcnow():
如果setting中配置USE_TZ=True則輸出的是UTC時間(naive time);如果setting中配置USE_TZ=False圣絮,則該輸出時間與datetime.datetime.now()完全相同祈惶。
django.util.timezone.now():
如果setting中配置USE_TZ=True則輸出的是UTC時間(active time),如果配置USE_TZ=False晨雳,則與datetime.datetime.now()完全相同行瑞。