Django入門

by 泰瑋

目錄

  • 簡介
  • 應用
  • 安裝
  • mtv的概念
  • settings.py
  • urls.py
  • views.py
  • Template
  • APP v.s. Project

應用

Django有很重要嘛?

各大廠的後端語言

Instagram也是

他是用django這個框架

優點

  • 易上手,英國小學生都在學
  • 開發快速,因為限制少,沒有型態問題
  • 外部函式庫超多(跟java、C比較)其他我就不敢講了
  • 文字探勘、機器學習這類的應用比其他語言成熟很多
    科學類函式庫超強

缺點

  • 速度慢
    • dropbox全部都用python寫
    • 後來就自己開發python的compiler
    • 來提升速度
  • 替代方案:
    • 用python開發完翻譯成java速度就快

安裝

先使用虛擬環境

這樣可以把套件裝在虛擬環境裡面

方便管理,避免函式庫互相影響

# 安裝
pip install virtualenv

# 建立虛擬環境
virtualenv venv

# 啟動虛擬環境  (Linux)
. venv/bin/activate
# 啟動虛擬環境  (Windows)
venv\Scripts\activate

啟動完如果左邊有一個(venv)的符號

就代表你現在處於venv的虛擬環境中

所有安裝的套件都只會裝在venv的環境中

pip install django
# 這樣會去下載最新版本的Django

# 本教學是用django 1.10去寫的,若未來更新到之後的版本,可能會有不適用的情況發生~

pip install django==1.10 # 這樣可以指定要安裝哪個版本

用pip 安裝django

django-admin.py startproject first

# 如果是win10
django-admin startproject first

 

建立第一個django專案

 

取名為first

目錄會出現一個叫first的資料夾
內容如下:
fisrt -
    - first (這個跟project一樣名稱的子資料夾,就是拿來放設定檔等等的project資料夾,用途後面會講)
    - manage.py
cd first
python manage.py runserver

進去執行看看django專案

然後輸入網址 127.0.0.1:8000

什麼是mvc

Model 就是資料庫

view是介面

controller是後端的程式碼

 

不過Django跟別人不一樣XD

 

變成MTV

Model是資料庫

Template是介面

View是後端的程式碼

流程是這樣:

使用者發出一個request,請求看網頁

url收到之後

找到相對應的view函式

view函式會去資料庫存取資料(如果有必要)

然後把結果放上Template

呈現給使用者

 

settings.py

settins.py都是一些設定

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


  1. base_DIR 的意思就是說所有檔案的起始路徑都是從 base_dir出發
    預設就是從manage.py那邊出發
  2. os.path.abspath(__file__) 的__file__就是settins.py
  3. os.path.dirname()這個函式就是取到settings.py的資料夾
  4. os.path.dirname寫兩次就是拿到 grandparent directory name.
    也就是manage.py所在的那曾目錄了
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'nn7tdc25()!5#y8^#u)gf^22kii)nj9x!ejfhqh@86p5$wn$4m'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['*']
  1. secret_key 是加密的金鑰
  2. debug=True就是開發模式,有錯誤會寫在網頁是
  3. debug=False就是上線模式,因為運作中的產品顯示出error給大家看
    等於讓大家來攻擊漏洞,所以上線時記得關掉
  4. 上線時,
  5. 要設定允許再哪個ip或是domain下面執行這個專案
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    下載下來的app名稱
]

如果想要安裝別人寫好的django app
直接把app下載完
然後把名子填到這個list裏面

# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

database的設定寫在這邊

預設是使用sqlite

上線的版本請使用mysql或是postgre 速度比較快

# Internationalization
# https://docs.djangoproject.com/en/1.10/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

網頁語言的設定

settings知道這樣就差不多了

urls.py

urls的功用其實跟路遊器沒兩樣

router是根據ip和mask等等去決定封包的走向

django則是用網址後面那串(url pattern)去決定回傳哪個函式

https://www.facebook.com/groups/13242432/?ref=bookmarks

這一段就是url pattern

?後面的是query string

django的routing機制是這樣

 

看到groups/1112332453234 這樣的url pattern
 

使用社團的函式去回應這個頁面

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^group/', 某個函式名稱),
    url(r'^chatRoom/', include('某個app.urls')),
]

url的第一個元素是url pattern的正規表達式

後面是服務這個頁面的函式名稱

views.py

 

服務某個url pattern的函式

名稱通常會取跟url pattern一樣

render意思是翻譯,在group裏面出現的變數

可以透過locals()把所有函式裡的區域變數都傳到前端

前端的html(路徑)就是第二個參數

第一個參數request為使用者為了看網頁傳送過來的request

from django.shortcuts import render

def group(request):
    # your code
    return render(request, 'timetable.html', locals())

template

from django.shortcuts import render

# Create your views here.
def group(request):
	g = '中興資工 107與他的快樂伙伴'
	times = range(10)
	print(locals())
	return render(request, 'index.html', locals())

views.py需要接收request這個參數

render這個函式

會把區域變數的值放到template裏面

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<h1>Welcome~ {{name}}</h1>
	{% for i in times %}
		<h1>{{g}}</h1>
	{% endfor %}
</body>
</html>

Template 要接後端的資料

在template裏面加 {{變數}}

動手做作看吧~

 

在firstproject/templates/

創建一個index.html

 

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<h1>Welcome~ {{name}}</h1>
	{% for i in times %}
		<h1>{{g}}</h1>
	{% endfor %}
</body>
</html>

index.html的內容

 

這種奇怪的{}

是django的template tag

就是把if else for 那些套用在html上面

讓你可以少打很多字XD

因為templates tag有很多,我下一堂課再講

 

 

可以先學

from django.shortcuts import render

# Create your views here.
def group(request):
	g = '中興資工 107與他的快樂伙伴'
	times = range(5)
	name = request.GET['name']
	print(locals())
	return render(request, 'index.html', locals())

firstproject/firstproject/views.py的內容

request.GET可以拿到網址的query string

全部貼進去喔

 

from django.conf.urls import url, include
from django.contrib import admin
from firstproject import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^group$', views.group),
]

firstproject/firstproject/urls.py的內容

 

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

修正一下settings.py

[]裡面加上templates

python manage.py runserver

可以把django的專案啟動拉~

在manage.py那層啟動

進到這個網址看看吧
http://127.0.0.1:8000/group?name=中興資工的社團

APP VS project的差異

APP

  1.  views.py urls.py models.py這些東西全部都放到專屬於app的資料夾
  2. APP的資料夾可以直接剪下貼上到新的project

 

 

優點:程式碼重複利用性很高

 

缺點:沒什麼缺點,多一點設定而已

 

project

  1. views.py 寫在project的資料夾
  2. urls.py直接寫在project資料夾裏面的urls.py

 

優點:不用學太多

 

缺點:程式碼不方便重複利用

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    '這邊加入你創的app名稱'

]

 

把app加到這個list

Django就會自動去這個app的資料夾裏面讀取

  1. 像是js、css等等statics的檔案
  2. template裏面的html等等

如果想要知道怎麼做個django app

看這個網址

這樣就可以弄出一個部落格了~

Next : Docker Tutorial

Made with Slides.com