Linux下使用django框架
一、首先安裝django框架
python -m django --version
二、在Linux下使用Pycharm創建Django項目
三、創建完后項目的目錄如下:
四、配置啟動服務器
點擊edit configurations
在Host里面輸入:
Django的開發服務器(以后簡稱服務器)默認運行在內部的8000端口,如果你想指定端口,請在命令中顯示給出:
python manage.py runserver 8080
如果想修改服務器的ip地址,請按下面的方式運行命令:
python manage.py runserver 0.0.0.0:8000
python后需要加上版本號,如:python3.68 manage.py runserver 8080
五、打開Terminal,輸入如下命令創建APP:
python manage.py startapp polls
注意:polls為APP的名字,可以自己根據需要修改
創建完目錄為:
六、編寫視圖
在目錄:polls/views.py中編寫如下代碼:
from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the polls index.")
為了調用該視圖,我們還需要編寫urlconf,也就是路由路徑。現在,在polls目錄中新建一個文件,名字為urls.py
,在其中輸入代碼如下:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index, name='index'), ]
接下來,在項目的主urls文件中添加urlpattern
條目,指向我們剛才建立的polls這個app獨有的urls文件,這里需要導入include模塊。打開djtest/urls.py
文件,代碼如下:
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^polls/', include('polls.urls')), url(r'^admin/', admin.site.urls), ]
include語法相當於多級路由,它把接收到的url地址去除前面的正則表達式,將剩下的字符串傳遞給下一級路由進行判斷。在路由的章節,有更加詳細的用法指導。
include的背后是一種即插即用的思想。項目根路由不關心具體app的路由策略,只管往指定的二級路由轉發,實現了應用解耦。app所屬的二級路由可以根據自己的需要隨意編寫,不會和其它的app路由發生沖突。app目錄可以放置在任何位置,而不用修改路由。這是軟件設計里很常見的一種模式。
建議:除了admin路由外,盡量給每個app設計自己獨立的二級路由。
好了,路由設置成功后,啟動服務器,然后在瀏覽器中訪問地址http://localhost:8000/polls/
。一切正常的話,你將看到“Hello, world. You’re at the polls index.”
七、數據庫安裝
打開djtest/settings.py
配置文件,這是整個Django項目的設置中心。Django默認使用SQLite數據庫,因為Python源生支持SQLite數據庫,所以你無須安裝任何程序,就可以直接使用它。當然,如果你是在創建一個實際的項目,可以使用類似PostgreSQL的數據庫,避免以后數據庫遷移的相關問題。
如果你想使用其他的數據庫,請先安裝相應的數據庫操作模塊,並將settings文件中DATABASES位置的’default’
的鍵值進行相應的修改,用於連接你的數據庫。其中:
-
ENGINE(引擎):可以是
django.db.backends.sqlite3
、django.db.backends.postgresql
、django.db.backends.mysql
、django.db.backends.oracle
,當然其它的也行。 -
NAME(名稱):類似Mysql數據庫管理系統中用於保存項目內容的數據庫的名字。如果你使用的是默認的SQLite,那么數據庫將作為一個文件將存放在你的本地機器內,此時的NAME應該是這個文件的完整絕對路徑包括文件名,默認值
os.path.join(BASE_DIR, ’db.sqlite3’)
,將把該文件儲存在你的項目目錄下。
如果你不是使用默認的SQLite數據庫,那么一些諸如USER,PASSWORD和HOST的參數必須手動指定!下面給出一個基於pymysql操作Mysql數據庫的例子,更多細節參考后續的數據庫章節。
# mysite/settings.py # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases import pymysql # 一定要添加這兩行!通過pip install pymysql! pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mysite', 'HOST': '192.168.1.1', 'USER': 'root', 'PASSWORD': 'pwd', 'PORT': '3306', } }
在修改settings文件時,請順便將TIME_ZONE
設置為國內所在的時區Asia/Shanghai
。
同時,請注意settings文件中頂部的INSTALLED_APPS
設置項。它列出了所有的項目中被激活的Django應用(app)。你必須將你自定義的app注冊在這里。每個應用可以被多個項目使用,並且可以打包和分發給其他人在他們的項目中使用。
默認情況,INSTALLED_APPS
中會自動包含下列條目,它們都是Django自動生成的:
- django.contrib.admin:admin管理后台站點
- django.contrib.auth:身份認證系統
- django.contrib.contenttypes:內容類型框架
- django.contrib.sessions:會話框架
- django.contrib.messages:消息框架
- django.contrib.staticfiles:靜態文件管理框架
上面的一些應用也需要建立一些數據庫表,所以在使用它們之前我們要在數據庫中創建這些表。使用下面的命令創建數據表:
python manage.py migrate
migrate命令將遍歷INSTALLED_APPS
設置中的所有項目,在數據庫中創建對應的表,並打印出每一條動作信息。如果你感興趣,可以在你的數據庫命令行下輸入:\dt
(PostgreSQL)、 SHOW TABLES;
(MySQL)或 .schema
(SQLite) 來列出 Django 所創建的表。
提示:對於極簡主義者,你完全可以在INSTALLED_APPS內注釋掉任何或者全部的Django提供的通用應用。這樣,migrate也不會再創建對應的數據表。
八、創建模型
現在,我們來定義模型model,模型本質上就是數據庫表的布局,再附加一些元數據。
Django通過自定義Python類的形式來定義具體的模型,每個模型的物理存在方式就是一個Python的類Class,每個模型代表數據庫中的一張表,每個類的實例代表數據表中的一行數據,類中的每個變量代表數據表中的一列字段。Django通過模型,將Python代碼和數據庫操作結合起來,實現對SQL查詢語言的封裝。也就是說,你可以不會管理數據庫,可以不會SQL語言,你同樣能通過Python的代碼進行數據庫的操作。Django通過ORM對數據庫進行操作,奉行代碼優先的理念,將Python程序員和數據庫管理員進行分工解耦。
在這個簡單的投票應用中,我們將創建兩個模型:Question
和Choice
。Question包含一個問題和一個發布日期。Choice包含兩個字段:該選項的文本描述和該選項的投票數。每一條Choice都關聯到一個Question。這些都是由Python的類來體現,編寫的全是Python的代碼,不接觸任何SQL語句。現在,編輯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)
上面的代碼非常簡單明了。每一個類都是django.db.models.Model
的子類。每一個字段都是Field
類的一個實例,例如用於保存字符數據的CharField和用於保存時間類型的DateTimeField,它們告訴Django每一個字段保存的數據類型。
每一個Field實例的名字就是字段的名字(如: question_text 或者 pub_date )。在你的Python代碼中會使用這個值,你的數據庫也會將這個值作為表的列名。
你也可以在每個Field中使用一個可選的第一位置參數用於提供一個人類可讀的字段名,讓你的模型更友好,更易讀,並且將被作為文檔的一部分來增強代碼的可讀性。
一些Field類必須提供某些特定的參數。例如CharField需要你指定max_length。這不僅是數據庫結構的需要,同樣也用於數據驗證功能。
有必填參數,當然就會有可選參數,比如在votes里我們將其默認值設為0.
最后請注意,我們使用ForeignKey
定義了一個外鍵關系。它告訴Django,每一個Choice關聯到一個對應的Question(注意要將外鍵寫在‘多’的一方)。Django支持通用的數據關系:一對一,多對一和多對多。
九、啟用模型
上面的代碼看着有點少,其實包含了大量的信息,據此,Django會做下面兩件事:
- 創建該app對應的數據庫表結構
- 為Question和Choice對象創建基於Python的數據庫訪問API
但是,首先我們得先告訴Django項目,我們要使用投票app。
要將應用添加到項目中,需要在INSTALLED_APPS
設置中增加指向該應用的配置文件的鏈接。對於本例的投票應用,它的配置類文件是polls/apps.py
,路徑格式為polls.apps.PollsConfig
。我們需要在INSTALLED_APPS
中,將該路徑添加進去:
# djtest/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’就可以了:
# djtest/settings.py INSTALLED_APPS = [ 'polls', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
現在Django已經知道你的投票應用的存在了,並把它加入了項目大家庭。
我們需要再運行下一個命令:
python manage.py makemigrations polls
你會看到類似下面的提示:
Migrations for 'polls': polls/migrations/0001_initial.py: - Create model Choice - Create model Question - Add field question to choice
通過運行makemigrations
命令,相當於告訴Django你對模型有改動,並且你想把這些改動保存為一個“遷移(migration)”。
migrations
是Django保存模型修改記錄的文件,這些文件保存在磁盤上。在例子中,它就是polls/migrations/0001_initial.py
,你可以打開它看看,里面保存的都是人類可讀並且可編輯的內容,方便你隨時手動修改。
接下來有一個叫做migrate
的命令將對數據庫執行真正的遷移動作。但是在此之前,讓我們先看看在migration的時候實際執行的SQL語句是什么。有一個叫做sqlmigrate
的命令可以展示SQL語句,例如:
python manage.py sqlmigrate polls 0001
你將會看到如下類似的文本(經過適當的格式調整,方便閱讀)
BEGIN; -- -- Create model Choice -- CREATE TABLE "polls_choice" ( "id" serial NOT NULL PRIMARY KEY, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL ); -- -- 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 ); -- -- Add field question to choice -- ALTER TABLE "polls_choice" ADD COLUMN "question_id" integer NOT NULL; ALTER TABLE "polls_choice" ALTER COLUMN "question_id" DROP DEFAULT; CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id"); ALTER TABLE "polls_choice" ADD CONSTRAINT "polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id" FOREIGN KEY ("question_id") REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED; 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命令,在數據庫中進行真正的表操作了。
migrations的功能非常強大,允許你隨時修改你的模型,而不需要刪除或者新建你的數據庫或數據表,在不丟失數據的同時,實時動態更新數據庫。我們將在后面的章節對此進行深入的闡述,但是現在,只需要記住修改模型時的操作分三步:
- 在models.py中修改模型;
- 運行
python manage.py makemigrations
為改動創建遷移記錄; - 運行
python manage.py migrate
,將操作同步到數據庫。
之所以要將創建和實施遷移的動作分成兩個命令兩步走是因為你也許要通過版本控制系統(例如github,svn)提交你的項目代碼,如果沒有一個中間過程的保存文件(migrations),那么github如何知道以及記錄、同步、實施你所進行過的模型修改動作呢?畢竟,github不和數據庫直接打交道,也沒法和你本地的數據庫通信。但是分開之后,你只需要將你的migration文件(例如上面的0001)上傳到github,它就會知道一切。
10、使用模型的API
python manage.py shell
11、admin后台管理站點
12、視圖和模板
M 代表模型(Model):負責業務對象和數據庫的關系映射(ORM)。
T 代表模板 (Template):負責如何把頁面展示給用戶(html)。
V 代表視圖(View):負責業務邏輯,並在適當時候調用Model和Template。
12、1編寫視圖
下面,打開polls/views.py
文件,輸入下列代碼:
def detail(request, question_id): return HttpResponse("You're looking at question %s." % question_id) def results(request, question_id): response = "You're looking at the results of question %s." return HttpResponse(response % question_id) def vote(request, question_id): return HttpResponse("You're voting on question %s." % question_id)