Linux下使用django框架

Linux下使用django框架

1、首先安裝django框架

python -m django --version

2、在Linux下使用Pycharm建立Django項目

3、建立完後項目的目錄以下:html

4、配置啓動服務器python

點擊edit configurationsmysql

 

在Host裏面輸入:git

Django的開發服務器(之後簡稱服務器)默認運行在內部的8000端口,若是你想指定端口,請在命令中顯示給出:程序員

python manage.py runserver 8080

若是想修改服務器的ip地址,請按下面的方式運行命令:github

python manage.py runserver 0.0.0.0:8000

python後須要加上版本號,如:python3.68 manage.py runserver 8080正則表達式

 

5、打開Terminal,輸入以下命令建立APP: sql

python manage.py startapp polls

注意:polls爲APP的名字,能夠本身根據須要修改shell

建立完目錄爲:數據庫

6、編寫視圖

在目錄: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.

7、數據庫安裝

 打開djtest/settings.py配置文件,這是整個Django項目的設置中心。Django默認使用SQLite數據庫,由於Python源生支持SQLite數據庫,因此你無須安裝任何程序,就能夠直接使用它。固然,若是你是在建立一個實際的項目,可使用相似PostgreSQL的數據庫,避免之後數據庫遷移的相關問題。

若是你想使用其餘的數據庫,請先安裝相應的數據庫操做模塊,並將settings文件中DATABASES位置的default的鍵值進行相應的修改,用於鏈接你的數據庫。其中:

  • ENGINE(引擎):能夠是django.db.backends.sqlite3django.db.backends.postgresqldjango.db.backends.mysqldjango.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也不會再建立對應的數據表。

 8、建立模型

如今,咱們來定義模型model,模型本質上就是數據庫表的佈局,再附加一些元數據。

Django經過自定義Python類的形式來定義具體的模型,每一個模型的物理存在方式就是一個Python的類Class,每一個模型表明數據庫中的一張表,每一個類的實例表明數據表中的一行數據,類中的每一個變量表明數據表中的一列字段。Django經過模型,將Python代碼和數據庫操做結合起來,實現對SQL查詢語言的封裝。也就是說,你能夠不會管理數據庫,能夠不會SQL語言,你一樣能經過Python的代碼進行數據庫的操做。Django經過ORM對數據庫進行操做,奉行代碼優先的理念,將Python程序員和數據庫管理員進行分工解耦。

在這個簡單的投票應用中,咱們將建立兩個模型:QuestionChoice。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支持通用的數據關係:一對一,多對一和多對多。

9、啓用模型

上面的代碼看着有點少,其實包含了大量的信息,據此,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) 和小寫的模型名questionchoice 。 ( 你能夠重寫此行爲。)
  • 主鍵 (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,它就會知道一切。

十、使用模型的API 

python manage.py shell

十一、admin後臺管理站點

十二、視圖和模板

M 表明模型(Model):負責業務對象和數據庫的關係映射(ORM)。
T 表明模板 (Template):負責如何把頁面展現給用戶(html)。
V 表明視圖(View):負責業務邏輯,並在適當時候調用Model和Template。

十二、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)
相關文章
相關標籤/搜索