[TOC]
接著第一部分,本節將講述如何配置數據庫,編寫第一個模型以及簡要的介紹下Django自動生成的后臺管理admin站點。
## **一、數據庫配置**
打開`mysite/settings.py`配置文件,這是整個Django項目的設置中心。Django默認使用SQLite3數據庫,因為Python原生支持SQLite3數據庫,所以你無須安裝任何程序,就可以直接使用它。當然,如果你是在創建一個實際的項目,可以使用類似MySQL的數據庫,避免以后數據庫遷移的相關問題。
下面是默認的數據庫配置:
~~~
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
~~~
如果你想使用其他的數據庫,請先安裝相應的數據庫操作模塊,并將settings文件中DATABASES位置的`’default’`字典進行相應的修改,用于連接你的數據庫。其中:
* ENGINE(引擎):可以是`django.db.backends.sqlite3`、`django.db.backends.postgresql`、`django.db.backends.mysql`、`django.db.backends.oracle`,當然其它的也行。
* NAME(數據庫名稱):類似Mysql數據庫管理系統中用于保存項目內容的數據庫的名字。如果你使用的是默認的SQLite3,那么數據庫將作為一個文件將存放在你的本地機器內,此時的NAME應該是這個文件的完整絕對路徑包括文件名,默認情況下該文件儲存在你的項目根目錄下。
<br />
**注意**:
* **在使用非SQLite3數據庫時,請務必預先在數據庫管理系統的提示符交互模式下創建數據庫,你可以使用命令:`CREATE DATABASE database_name;`。Django不會自動幫你做這一步工作。**
* 確保你在settings文件中提供的數據庫用戶具有創建數據庫表的權限,因為在接下來的教程中,我們需要自動創建一個test數據表。(在實際項目中也需要確認這一條要求。)
* 如果你使用的是SQLite3,那么你無需做任何預先配置,直接使用就可以了。
在修改settings文件時,請順便將`TIME_ZONE`設置為國內所在的時區`Asia/Shanghai`,這樣顯示的就是我們北京時間。
<br />
同時,請注意settings文件中頂部的`INSTALLED_APPS`設置項。它列出了所有的項目中被激活的Django應用(app)。你必須將你自己創建的app注冊在這里。每個應用可以被多個項目使用,并且可以打包和分發給其他人在他們的項目中使用。
<br />
默認情況,`INSTALLED_APPS`中會自動包含下列條目,它們都是Django自動生成的:
* django.contrib.admin:admin管理后臺站點
* django.contrib.auth:身份認證系統
* django.contrib.contenttypes:內容類型框架
* django.contrib.sessions:會話框架
* django.contrib.messages:消息框架
* django.contrib.staticfiles:靜態文件管理框架
上面的那些應用會默認被啟動,并且也需要建立一些數據庫表,所以在使用它們之前我們要在數據庫中創建這些表。使用下面的命令創建數據表:
~~~
$ python3 manage.py migrate
~~~
migrate命令將遍歷`INSTALLED_APPS`設置中的所有項目,在數據庫中創建對應的表,并打印出每一條動作信息。如果你感興趣,可以在你的數據庫命令行下輸入:`\dt`(PostgreSQL)、`SHOW TABLES;`(MySQL)或`.schema`(SQLite3) 來列出 Django 所創建的表。
<br />
提示:對于極簡主義者,你完全可以在`INSTALLED_APPS`內注釋掉任何或者全部的Django提供的通用應用。這樣,migrate也不會再創建對應的數據表。
<br />
## **二、創建模型**
現在,我們來定義模型model,模型本質上就是數據庫表的布局,再附加一些元數據。
<br />
Django通過自定義Python類的形式來定義具體的模型,每個模型的物理存在方式就是一個Python的類Class,每個模型代表數據庫中的一張表,每個類的實例代表數據表中的一行數據,類中的每個變量代表數據表中的一列字段。Django通過模型,將Python代碼和數據庫操作結合起來,實現對SQL查詢語言的封裝。也就是說,你可以不會管理數據庫,可以不會SQL語言,你同樣能通過Python的代碼進行數據庫的操作,這就是所謂的ORM。Django通過ORM對數據庫進行操作,奉行代碼優先的理念,將Python程序員和數據庫管理員進行分工解耦。
<br />
在這個簡單的投票應用中,我們將創建兩個模型:`Question`和`Choice`。Question包含一個問題和一個發布日期。Choice包含兩個字段:該選項的文本描述和該選項的投票數。每一條Choice都關聯到一個Question。這些都是由Python的類來體現,編寫的全是Python的代碼,不接觸任何SQL語句。現在,編輯`polls/models.py`文件,具體代碼如下:
~~~
# polls/models.py
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
~~~
注意:新手在學習過程中出現了問題,90%是代碼輸入錯誤,比如question輸入成questions。9%是沒有仔細學習教程,缺少步驟。
<br />
上面的代碼非常簡單明了。每一個類都是`django.db.models.Model`的子類。每一個字段都是`Field`類的一個實例,例如用于保存文本數據的CharField和用于保存時間類型的DateTimeField,它們告訴Django每一個字段保存的數據類型。
<br />
每一個Field實例的名字就是字段的名字(如: question\_text 或者 pub\_date )。在你的Python代碼中會使用這個值,你的數據庫也會將這個值作為表的列名。
<br />
你也可以在每個Field中使用一個可選的第一位置參數用于提供一個人類可讀的字段名,讓你的模型更友好,更易讀,并且將被作為文檔的一部分來增強代碼的可讀性。比如例子中的`Question.pub_date`定義了對人類友好的名字。
<br />
一些Field類必須提供某些特定的參數。例如CharField需要你指定`max_length`。這不僅是數據庫結構的需要,同樣也用于數據驗證功能。
<br />
有必填參數,當然就會有可選參數,比如在votes里我們將其默認值設為0.
最后請注意,我們使用`ForeignKey`定義了一個外鍵關系。它告訴Django,每一個Choice關聯到一個對應的Question(注意要將外鍵寫在‘多數’的一方)。Django支持通用的數據關系:一對一,多對一和多對多。
<br />
## **三、啟用模型**
上面的代碼看著有點少,其實包含了大量的信息,據此,Django會做下面兩件事:
* 創建該app對應的數據庫表結構
* 為Question和Choice對象創建基于Python的數據庫訪問API
但是,首先我們得先告訴Django項目,我們要使用投票app。
<br />
要將應用添加到項目中,需要在`INSTALLED_APPS`設置中增加指向該應用的配置文件的鏈接。對于本例的投票應用,它的配置類文件`PollsConfig`位于`polls/apps.py`腳本內,所以配置的點式路徑為`polls.apps.PollsConfig`。我們需要在`INSTALLED_APPS`中,將該路徑添加進去(字符串格式):
~~~
# mysite/settings.py
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
~~~
實際上,在多數情況下,我們簡寫成`‘polls’`就可以了:
~~~
# mysite/settings.py
INSTALLED_APPS = [
'polls',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
~~~
現在Django已經知道你的投票應用的存在了,并把它加入了項目大家庭。
我們需要再運行下一個命令:
~~~
$ python3 manage.py makemigrations polls
~~~
你會看到類似下面的提示:
~~~
Migrations for 'polls':
polls\migrations\0001_initial.py
- Create model Question
- Create model Choice
~~~
通過運行`makemigrations`命令,Django 會檢測你對模型文件的修改,也就是告訴Django你對模型有改動,并且你想把這些改動保存為一個“`遷移(migration)`”。
<br />
`migrations`是Django保存模型修改記錄的文件,這些文件保存在磁盤上。在例子中,它就是`polls/migrations/0001_initial.py`,你可以打開它看看,里面保存的都是人類可讀并且可編輯的內容,方便你隨時手動修改。
<br />
接下來有一個叫做`migrate`的命令將對數據庫執行真正的遷移動作。但是在此之前,讓我們先看看在遷移的時候實際執行的SQL語句是什么。有一個叫做`sqlmigrate`的命令可以展示SQL語句,例如:
~~~
$ python3 manage.py sqlmigrate polls 0001
~~~
你將會看到如下類似的文本(經過適當的格式調整,方便閱讀):
~~~
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" (
"id" serial NOT NULL PRIMARY KEY,
"question_text" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL,
"question_id" integer NOT NULL
);
ALTER TABLE "polls_choice"
ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
~~~
**請注意:**
* 實際的輸出內容將取決于您使用的數據庫會有所不同。上面的是PostgreSQL的輸出。
* 表名是自動生成的,通過組合應用名 (polls) 和小寫的模型名`question`和`choice`。 ( 你可以重寫此行為。)
* 主鍵 (IDs) 是自動添加的。( 你也可以重寫此行為。)
* 按照慣例,Django 會在外鍵字段名上附加 "\_id" 。 (你仍然可以重寫此行為。)
* 生成SQL語句時針對你所使用的數據庫,會為你自動處理特定于數據庫的字段,例如`auto_increment`(MySQL),`serial`(PostgreSQL), 或`integer primary key`(SQLite) 。 在引用字段名時也是如此 – 比如使用雙引號或單引號。
* 這些SQL命令并沒有在你的數據庫中實際運行,它只是在屏幕上顯示出來,以便讓你了解Django真正執行的是什么。
如果你感興趣,也可以運行`python manage.py check`命令,它將檢查項目中的錯誤,并不實際進行遷移或者鏈接數據庫的操作。
現在,我們可以運行migrate命令,在數據庫中進行真正的表操作了。
~~~
$ python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Rendering model states... DONE
Applying polls.0001_initial... OK
~~~
migrate命令對所有還未實施的遷移記錄進行操作,本質上就是將你對模型的修改體現到數據庫中具體的表中。Django通過一張叫做`django_migrations`的表,記錄并跟蹤已經實施的migrate動作,通過對比獲得哪些遷移尚未提交。(請務必牢記這張表的作用和名稱)
<br />
遷移的功能非常強大,允許你隨時修改你的模型,而不需要刪除或者新建你的數據庫或數據表,在不丟失數據的同時,實時動態更新數據庫。我們將在后面的章節對此進行深入的闡述,但是現在,只需要記住**修改模型時的操作分三步**:
* 在models.py中修改模型;
* 運行`python manage.py makemigrations`為改動創建遷移記錄文件;
* 運行`python manage.py migrate`,將操作同步到數據庫。
之所以要將創建和實施遷移的動作分成兩個命令兩步走是因為你也許要通過版本控制系統(例如github,svn)提交你的項目代碼,如果沒有一個中間過程的保存文件(migrations),那么github如何知道以及記錄、同步、實施你所進行過的模型修改動作呢?畢竟,github不和數據庫直接打交道,也沒法和你本地的數據庫通信。但是分開之后,你只需要將你的migration文件(例如上面的0001)上傳到github,它就會知道一切。
<br />
## **四、體驗模型自帶的API**
Django模型層自帶ORM系統,會自動為每個模型創建數據庫訪問的API,直接拿來用就可以,非常簡單、方便、易學。
<br />
下面,讓我們進入Python交互環境,嘗試使用Django提供的數據庫訪問API。要進入Python的shell,請輸入命令:
~~~
$ python3 manage.py shell
~~~
在shell中,我們可以做一些測試性、探索性、研究性的操作,但是要注意,這和在腳本中編寫代碼一樣,也有可能會修改數據庫中的實際數據。
<br />
相比較直接輸入“python”命令的方式進入Python環境,調用`manage.py`參數能將`DJANGO_SETTINGS_MODULE`環境變量導入,它將自動按照`mysite/settings.py`中的設置,配置好你的python shell環境,這樣,你就可以導入和調用任何你項目內的模塊了。
<br />
或者你也可以這樣,先進入一個純凈的python環境,然后啟動Django,具體如下:
~~~
>>> import django
>>> django.setup()
~~~
當你進入shell后,嘗試一下下面的API吧(這些代碼必須執行,否則會影響后面的教程。我們不必管這些API的具體細節,先混個臉熟):
~~~
>>> from polls.models import Question, Choice # 導入我們寫的模型類
# 現在系統內還沒有questions對象
>>> Question.objects.all()
<QuerySet []>
# 創建一個新的question對象
# Django推薦使用timezone.now()代替python內置的datetime.datetime.now()
# 這個timezone就來自于Django的依賴庫pytz
from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
# 你必須顯式的調用save()方法,才能將對象保存到數據庫內
>>> q.save()
# 默認情況,你會自動獲得一個自增的名為id的主鍵
>>> q.id
1
# 通過python的屬性調用方式,訪問模型字段的值
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
# 通過修改屬性來修改字段的值,然后顯式的調用save方法進行保存。
>>> q.question_text = "What's up?"
>>> q.save()
# objects.all() 用于查詢數據庫內的所有questions
>>> Question.objects.all()
<QuerySet [<Question: Question object>]>
~~~
這里等一下:上面的`<Question: Question object>`是一個不可讀的內容展示,你無法從中獲得任何直觀的信息,為此我們需要一點小技巧,讓Django在打印對象時顯示一些我們指定的信息。
<br />
返回`polls/models.py`文件,修改一下question和Choice這兩個類,代碼如下:
~~~
# polls/models.py
from django.db import models
class Question(models.Model):
# ...
def __str__(self):
return self.question_text
class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text
~~~
這個技巧不但對你打印對象時很有幫助,在你使用Django的admin站點時也同樣有幫助。
<br />
另外,這里我們再自定義一個模型的方法,用于判斷問卷是否最近時間段內發布度的:
~~~
# polls/models.py
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
# 是否在當前發布的問卷
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
~~~
請注意上面分別導入了兩個關于時間的模塊,一個是python內置的datetime,一個是Django工具包提供的timezone。
保存修改后,我們重新啟動一個新的python shell,再來看看其他的API:
~~~
>>> from polls.models import Question, Choice
# 先看看__str__()的效果,直觀多了吧?
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>
# Django提供了大量的關鍵字參數查詢API
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: What's up?>]>
# 獲取今年發布的問卷
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>
# 查詢一個不存在的ID,會彈出異常
>>> Question.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Question matching query does not exist.
# Django為主鍵查詢提供了一個縮寫:pk。下面的語句和Question.objects.get(id=1)效果一樣.
>>> Question.objects.get(pk=1)
<Question: What's up?>
# 看看我們自定義的方法用起來怎么樣
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True
# 顯示所有與q對象有關系的choice集合,目前是空的,還沒有任何關聯對象。
>>> q.choice_set.all()
<QuerySet []>
# 創建3個choices.
>>> q.choice_set.create(choice_text='Not much', votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text='The sky', votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)
# Choice對象可通過API訪問和他們關聯的Question對象
>>> c.question
<Question: What's up?>
# 同樣的,Question對象也可通過API訪問關聯的Choice對象
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3
# API會自動進行連表操作,通過雙下劃線分割關系對象。連表操作可以無限多級,一層一層的連接。
# 下面是查詢所有的Choices,它所對應的Question的發布日期是今年。(重用了上面的current_year結果)
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
# 使用delete方法刪除對象
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()
~~~
關于模型的使用就暫時先介紹這么多。這部分內容是Django項目的核心,也是動態網站與數據庫交互的核心,對于初學者,再難理解也要理解。
<br />
## **五、admin后臺管理站點**
很多時候,我們不光要開發針對客戶使用的前端頁面,還要給后臺管理人員提供相應的管理界面。但是大多數時候為你的團隊或客戶編寫用于增加、修改和刪除內容的后臺管理站點是一件非常乏味的工作,并且沒有多少創造性,需要花不少的時間和精力。
<br />
Django最大的優點之一,就是體貼的為你提供了一個基于項目model創建的一個后臺管理站點admin。這個界面只給站點管理員使用,并不對大眾開放。雖然admin的界面可能不是那么美觀,功能不是那么強大,內容不一定符合你的要求,但是它是免費的、現成的,并且還是可定制的,有完善的幫助文檔,那么,你還要什么自行車?
(如果你對admin的界面美觀有切實需求,可以嘗試使用simpleui庫,不要用xadmin)
<br />
### 1.**創建管理員用戶**
首先,我們需要通過下面的命令,創建一個可以登錄admin站點的用戶:
~~~
$ python3 manage.py createsuperuser
~~~
輸入用戶名:
~~~
Username: admin
~~~
輸入郵箱地址:
~~~
Email address: xxx@xxx.xxx
~~~
輸入密碼:
~~~
Password: **********
Password (again): *********
Superuser created successfully.
~~~
注意:Django1.10版本后,超級用戶的密碼要求具備一定的復雜性,如果密碼強度不夠,Django會提示你,但是可以強制通過。
<br />
### 2.**啟動開發服務器**
執行runserver命令啟動服務器后,在瀏覽器訪問`http://127.0.0.1:8000/admin/`。你就能看到admin的登陸界面了:

小技巧:
以下內容不要實際操作,知道即可。
在實際環境中,為了站點的安全性,我們一般不能將管理后臺的url隨便暴露給他人,不能用`/admin/`這么簡單的路徑。
可以將根url路由文件`mysite/urls.py`中`admin.site.urls`對應的表達式,換成你想要的,比如:
```
from django.contrib import admin from django.urls import path
urlpatterns = [ path('polls/', include('polls.urls')), path('control/', admin.site.urls), ]
```
這樣,我們必須訪問`http://127.0.0.1:8000/control/`才能進入admin界面。
<br />
### **3. 進入站點**
利用剛才建立的admin賬戶,登陸admin,你將看到如下的界面:

當前只有兩個可編輯的模型:Groups和Users。它們是`django.contrib.auth`模塊提供的身份認證框架內的模型。
<br />
### **4. 注冊投票應用**
現在還無法看到投票應用,必須先在admin中進行注冊,告訴admin站點,請將polls的模型加入站點內,接受站點的管理。
打開`polls/admin.py`文件,加入下面的內容:
~~~
from django.contrib import admin
from .models import Question
admin.site.register(Question)
~~~
<br />
### **5. 站點體驗**
注冊question模型后,等待服務器重啟動,然后刷新admin頁面就能看到Question欄目了。

<br />
點擊“Questions”,進入questions的修改列表頁面。這個頁面會顯示所有的數據庫內的questions對象,你可以在這里對它們進行修改。看到下面的`“What’s up?”`了么?它就是我們先前創建的一個question對象,并且通過`__str__`方法的幫助,顯示了較為直觀的信息,而不是一個冷冰冰的對象類型名稱。

<br />
下面,點擊`What’s up?`,可以進入該問卷對象的編輯界面:

這里需要注意的是:
* 頁面中的表單是由Question模型自動生成的。
* 不同的模型字段類型(DateTimeField, CharField)會表現為不同的`HTML input`框類型。
* 每一個`DateTimeField`都會自動生成一個可點擊鏈接。日期是Today,并有一個日歷彈出框;時間是Now,并有一個通用的時間輸入列表框。
在頁面的底部,則是一些可選項按鈕:
* `delete`:彈出一個刪除確認頁面
* `save and add another`:保存當前修改,并加載一個新的空白的當前類型對象的表單。
* `save and continue editing`:保存當前修改,并重新加載該對象的編輯頁面。
* `save`:保存修改,返回當前對象類型的列表頁面。
如果`Date published`字段的值和你在前面教程創建它的時候不一致,可能是你沒有正確的配置`TIME_ZONE`,在國內,通常是8個小時的時間差別。修改`TIME_ZONE`配置并重新加載頁面,就能顯示正確的時間了。
在頁面的右上角,點擊`History`按鈕,你會看到你對當前對象的所有修改操作都在這里有記錄,包括修改時間和操作人員。
- Linux
- Linux 文件權限概念
- 重點總結
- Linux 文件與目錄管理
- 2.1 文件與目錄管理
- 2.2 文件內容查閱
- 文件與文件系統的壓縮,打包與備份
- 3.1 Linux 系統常見的壓縮指令
- 3.2 打包指令: tar
- vi/vim 程序編輯器
- 4.1 vi 的使用
- 4.2 vim編輯器刪除一行或者多行內容
- 進程管理
- 5.1 常用命令使用技巧
- 5.2 進程管理
- 系統服務 (daemons)
- 6.1 通過 systemctl 管理服務
- Linux 系統目錄結構
- Linux yum命令
- linux系統查看、修改、更新系統時間(自動同步網絡時間)
- top linux下的任務管理器
- Linux基本配置
- CentOS7開啟防火墻
- CentOS 使用yum安裝 pip
- strace 命令
- Linux下設置固定IP地址
- 查看Linux磁盤及內存占用情況
- Mysql
- 關系數據庫概述
- 數據庫技術
- 數據庫基礎語句
- 查詢語句(--重點--)
- 約束
- 嵌套查詢(子查詢)
- 表emp
- MySQL數據庫練習
- 01.MySQL數據庫練習數據
- 02.MySQL數據庫練習題目
- 03.MySQL數據庫練習-答案
- Mysql遠程連接數據庫
- Python
- python基礎
- Python3中字符串、列表、數組的轉換方法
- python字符串
- python安裝、pip基本用法、變量、輸入輸出、流程控制、循環
- 運算符及優先級、數據類型及常用操作、深淺拷貝
- 虛擬環境(virtualenv)
- 網絡編程
- TCP/IP簡介
- TCP編程
- UDP編程
- 進程和線程
- 訪問數據庫
- 使用SQLite
- 使用MySQL
- Web開發
- HTML簡介
- Python之日志處理(logging模塊)
- 函數式編程
- 高階函數
- python報錯解決
- 啟動Python時報“ImportError: No module named site”錯誤
- python實例
- 01- 用python解決數學題
- 02- 冒泡排序
- 03- 郵件發送(smtplib)
- Django
- 01 Web應用
- Django3.2 教程
- Django簡介
- Django環境安裝
- 第一個Django應用
- Part 1:請求與響應
- Part 2:模型與后臺
- Part 3:視圖和模板
- Part 4:表單和類視圖
- Part 5:測試
- Part 6:靜態文件
- Part 7:自定義admin
- 第一章:模型層
- 實戰一:基于Django3.2可重用登錄與注冊系統
- 1. 搭建項目環境
- 2. 設計數據模型
- 3. admin后臺
- 4. url路由和視圖
- 5. 前端頁面設計
- 6. 登錄視圖
- 7. Django表單
- 8. 圖片驗證碼
- 9. session會話
- 10. 注冊視圖
- 實戰二:Django3.2之CMDB資產管理系統
- 1.項目需求分析
- 2.模型設計
- 3.數據收集客戶端
- 4.收集Windows數據
- 5.Linux下收集數據
- 6.新資產待審批區
- 7.審批新資產
- django 快速搭建blog
- imooc-Django全棧項目開發實戰
- redis
- 1.1 Redis簡介
- 1.2 安裝
- 1.3 配置
- 1.4 服務端和客戶端命令
- 1.5 Redis命令
- 1.5.1 Redis命令
- 1.5.2 鍵(Key)
- 1.5.3 字符串(string)
- 1.5.4 哈希(Hash)
- 1.5.5 列表(list)
- 1.5.6 集合(set)
- 1.5.7 有序集合(sorted set)
- Windows
- Win10安裝Ubuntu子系統
- win10遠程桌面身份驗證錯誤,要求的函數不受支持
- hm軟件測試
- 02 linux基本命令
- Linux終端命令格式
- Linux基本命令(一)
- Linux基本命令(二)
- 02 數據庫
- 數據庫簡介
- 基本概念
- Navicat使用
- SQL語言
- 高級
- 03 深入了解軟件測試
- day01
- 04 python基礎
- 語言基礎
- 程序中的變量
- 程序的輸出
- 程序中的運算符
- 數據類型基礎
- 數據序列
- 數據類型分類
- 字符串
- 列表
- 元組
- 字典
- 列表與元組的區別詳解
- 函數
- 案例綜合應用
- 列表推導式
- 名片管理系統
- 文件操作
- 面向對象基礎(一)
- 面向對象基礎(二)
- 異常、模塊
- 05 web自動化測試
- Day01
- Day02
- Day03
- Day04
- Day05
- Day06
- Day07
- Day08
- 06 接口自動化測試
- 軟件測試面試大全2020
- 第一章 測試理論
- 軟件測試面試
- 一、軟件基礎知識
- 二、網絡基礎知識
- 三、數據庫
- SQL學生表 — 1
- SQL學生表 — 2
- SQL查詢 — 3
- SQL經典面試題 — 4
- 四、linux
- a. linux常用命令
- 五、自動化測試
- 自動化測試
- python 筆試題
- selenium面試題
- 如何判斷一個頁面上元素是否存在?
- 如何提高腳本的穩定性?
- 如何定位動態元素?
- 如何通過子元素定位父元素?
- 如果截取某一個元素的圖片,不要截取全部圖片
- 平常遇到過哪些問題?如何解決的
- 一個元素明明定位到了,點擊無效(也沒報錯),如果解決?
- selenium中隱藏元素如何定位?(hidden、display: none)
- 六、接口測試
- 接口測試常規面試題
- 接口自動化面試題
- json和字典dict的區別?
- 測試的數據你放在哪?
- 什么是數據驅動,如何參數化?
- 下個接口請求參數依賴上個接口的返回數據
- 依賴于登錄的接口如何處理?
- 依賴第三方的接口如何處理
- 不可逆的操作,如何處理,比如刪除一個訂單這種接口如何測試
- 接口產生的垃圾數據如何清理
- 一個訂單的幾種狀態如何全部測到,如:未處理,處理中,處理失敗,處理成功
- python如何連接數據庫操作?
- 七、App測試
- 什么是activity?
- Activity生命周期?
- Android四大組件
- app測試和web測試有什么區別?
- android和ios測試區別?
- app出現ANR,是什么原因導致的?
- App出現crash原因有哪些?
- app對于不穩定偶然出現anr和crash時候你是怎么處理的?
- app的日志如何抓取?
- logcat查看日志步驟
- 你平常會看日志嗎, 一般會出現哪些異常
- 抓包工具
- fiddler
- Wireshark
- 安全/滲透測試
- 安全性測試都包含哪些內容?
- 開放性思維題
- 面試題
- 字節測試面試
- 一、計算機網絡
- 二、操作系統
- 三、數據庫
- 四、數據結構與算法
- 五、Python
- 六、Linux
- 七、測試用例
- 八、智力/場景題
- 九、開放性問題
- python3_收集100+練習題(面試題)
- python3_100道題目答案
- 接口測試
- 接口測試實例_01
- python+requests接口自動化測試框架實例詳解
- 性能測試
- 性能測試流程
- 性能測試面試題
- 如何編寫性能測試場景用例
- 性能測試:TPS和QPS的區別
- jmeter
- jmeter安裝配置教程
- Jmeter性能測試 入門
- PyCharm
- 快捷工具
- 1-MeterSphere
- 一、安裝和升級
- 2- MobaXterm 教程
- 3-fiddler抓包
- 4-Xshell
- Xshell的安裝和使用
- Xshell遠程連接失敗怎么解決
- 5-Vmware
- Vmware提示以獨占方式鎖定此配置文件失敗
- Windows10徹底卸載VMWare虛擬機步驟
- VM ware無法關機,虛擬機繁忙
- VMware虛擬機下載與安裝
- 解決VM 與 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以運行 VM 的方法
- VMware虛擬機鏡像克隆與導入
- 6-WPS
- 1.WPS文檔里的批注怎么刪除
- 2.wps表格中設置圖表的坐標
- 3. wps快速繪制數學交集圖
- 7-MongoDB
- Win10安裝配置MongoDB
- Navicat 15.x for MongoDB安裝破解教程
- Apache
- apache層的賬戶權限控制,以及apache黑名單白名單過濾功能
- HTTP / HTTPS協議
- HTTP協議詳解
- 代理
- 狀態碼詳解
- HTTPS詳解
- Selenium3+python3
- (A) selenium
- selenium自動化環境搭建(Windows10)
- 火狐firebug和firepath插件安裝方法(最新)
- 元素定位工具和方法
- Selenium3+python3自動化
- 新手學習selenium路線圖---學前篇
- 1-操作瀏覽器基本方法
- 2-八種元素定位方法
- 3-CSS定位語法
- 4-登錄案例
- 5-定位一組元素find_elements
- 6-操作元素(鍵盤和鼠標事件)
- 7-多窗口、句柄(handle)
- 8-iframe
- 9-select下拉框
- 10-alert\confirm\prompt
- 11-JS處理滾動條
- 12-單選框和復選框(radiobox、checkbox)
- 13-js處理日歷控件(修改readonly屬性)
- 14-js處理內嵌div滾動條
- 15-table定位
- 16-js處理多窗口
- 17-文件上傳(send_keys)
- 18-獲取百度輸入聯想詞
- 19-處理瀏覽器彈窗
- 20-獲取元素屬性
- 21-判斷元素存在
- 22-爬頁面源碼(page_source)
- 23-顯式等待(WebDriverWait)
- 24-關于面試的題
- 25-cookie相關操作
- 26-判斷元素(expected_conditions)
- 27-判斷title(title_is)
- 28-元素定位參數化(find_element)
- 29-18種定位方法(find_elements)
- 30- js解決click失效問題
- 31- 判斷彈出框存在(alert_is_present)
- 32- 登錄方法(參數化)
- 33- 判斷文本(text_to_be_present_in_element)
- 34- unittest簡介
- 35- unittest執行順序
- 36- unittest之裝飾器(@classmethod)
- 37- unittest之斷言(assert)
- 38- 捕獲異常(NoSuchElementException)
- 39- 讀取Excel數據(xlrd)
- 40- 數據驅動(ddt)
- 41- 異常后截圖(screenshot)
- 42- jenkins持續集成環境搭建
- 43- Pycharm上python和unittest兩種運行方式
- 44- 定位的坑:class屬性有空格
- 45- 只截某個元素的圖
- 46- unittest多線程執行用例
- 47- unittest多線程生成報告(BeautifulReport)
- 48- 多線程啟動多個不同瀏覽器
- (B) python3+selenium3實現web UI功能自動化測試框架
- (C) selenium3常見報錯處理
- 書籍
- (D)Selenium3自動化測試實戰--基于Python語
- 第4章 WebDriver API
- 4.1 從定位元素開始
- 4.2 控制瀏覽器
- 4.3 WebDriver 中的常用方法
- 4.4 鼠標操作
- 4.5 鍵盤操作
- 4.6 獲得驗證信息
- 4.7 設置元素等待
- 4.8 定位一組元素
- 4.9 多表單切換
- 4.10 多窗口切換
- 4.11 警告框處理
- 4.12 下拉框處理
- 4.13 上傳文件
- 4.14 下載文件
- 4.15 操作cookie
- 4.16 調用JavaScript
- 4.17 處理HTML5視頻播放
- 4.18 滑動解鎖
- 4.19 窗口截圖
- 第5章 自動化測試模型
- 5.3 模塊化與參數化
- 5.4 讀取數據文件
- 第6章 unittest單元測試框架
- 6.1 認識unittest