Python網頁設計-Django使用筆記(一):基本環境
Django系列文:
Python網頁設計-Django使用筆記(二):實作104職缺爬蟲APP
Python網頁設計-Django使用筆記(三):Mezzanine CMS
Python網頁設計-Django使用筆記(四):LINE聊天機器人(部署至Heroku)
Python網頁設計-Django使用筆記(五):資料庫(CRUD)
Python網頁設計-Django使用筆記(六):幫網站加上Custom Domain
Python網頁設計-Django使用筆記(七):套用Bootstrap Template
Django 2.0版本注意事項在urls.py中已經不再需要使用url函式設定urlpatterns,而是改用path函式設定,本文有用到url函式的可依照需求換成path函式參考: [Python] Django 2.0 以 path 函式設定 urlpatterns
推薦閱讀
建立資料夾
mkdir django-app
cd django-app
建立虛擬環境
conda create -n django-app python=3.6
activate django-app
安裝Django
pip install django
檢查版本
python -m django --version
建立項目
django-admin startproject LINE
manage.py
: 一个让你可以管理Django项目的工具程序。LINE/__init__.py
:一个空文件,告诉Python解释器这个目录应该被视为一个Python的包。LINE/settings.py
:Django项目的配置文件。LINE/urls.py
:Django项目的URL声明(URL映射),就像是你的网站的“目录”。LINE/wsgi.py
:项目运行在WSGI兼容Web服务器上的接口文件。
建立first應用程式
每個project可以建立一個或多個Application應用程式
python manage.py startapp first
建立first資料夾
__init__.py
:一个空文件,告诉Python解释器这个目录应该被视为一个Python的包。admin.py
:可以用来注册模型,用于在Django的管理界面管理模型。apps.py
:当前应用的配置文件。migrations
:存放与模型有关的数据库迁移信息。__init__.py
:一个空文件,告诉Python解释器这个目录应该被视为一个Python的包。models.py
:存放应用的数据模型,即实体类及其之间的关系(MVC/MTV中的M)。tests.py
:包含测试应用各项功能的测试类和测试函数。views.py
:处理请求并返回响应的函数(MVC中的C,MTV中的V)。
建立templates資料夾
Django是MTV(Model, Template, View)架構,顯示模板(.html)放置在templates資料夾中
(在LINE目錄: manage.py所在位置)
md templates
建立static資料夾
Django會將使用到的圖形檔案、CSS或JS檔案,存在本機的static資料夾中。(在LINE目錄: manage.py所在位置)
md static
注意:
templates和static資料夾位在最上層目錄,與LINE應用程式平行
建立migration資料庫檔案
(在LINE目錄: manage.py所在位置)
python manage.py makemigrations
同步模型與資料庫
(在LINE目錄: manage.py所在位置)
產生db.sqlite3檔案
python manage.py migrate
啟動伺服器
python manage.py runserver #預設網址為:http://127.0.0.1:8000/#如果想改在不同的IP端口執行python manage.py runserver 192.168.0.88 8080
首先用 ipconfig 查詢本機 IP, 得到例如 192.168.0.88, 然後修改settings.py, 將此 IP 以字串格式放入 ALLOWED_HOST
ALLOWED_HOSTS = ['192.168.0.88']
視圖(view)與URL
設定settings.py
DEBUG = True為預設除錯模式,執行時會輸出錯誤訊息方便除錯,在上線部署時,要改成False增加網站安全性(第26列)
26 DEBUG = True
settings.py加入Application應用程式
INSTALLED_APPS(第40列)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'first' #新增的網頁APP
]
settings.py設定Template路徑
設定templates路徑讓Django能讀取到模板(.html)檔案
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, '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設定語系和時區
LANGUAGE_CODE = 'zh-hant' #繁體中文TIME_ZONE = 'Asia/Taipei' #台北時區USE_I18N = True
USE_L10N = True
USE_TZ = True
settings.py設定static靜態檔的路徑
#大約在120行左右加入
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
設定urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from first.views import sayhellourlpatterns = [
path('admin/', admin.site.urls),
url(r'^$', sayhello)
]
設定views.py
from django.shortcuts import render
from django.http import HttpResponsedef sayhello(request):
return HttpResponse("Hello django!")
傳送參數(hello2)
修改urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from first.views import sayhello,hello2urlpatterns = [
path('admin/', admin.site.urls),
url(r'^$', sayhello),
url(r'^hello2/(\w+)/$', hello2),
]
修改views.py
from django.shortcuts import render
from django.http import HttpResponsedef sayhello(request):
return HttpResponse("Hello django!")
def hello2(reuest,username):
return HttpResponse("Hello" + username)
模板的使用(hello3)
在templates資料夾中新增hello3.html
模板中讀取變數的語法為{{變數名稱}}
#{{ greeting }}佔位符 #
#{% for %} 模板指令#
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>第一個模板</title>
</head>
<body>
<h1>歡迎光臨: {{username}}</h1>
<h2>歡迎光臨: {{now}}</h2>
</body>
</html>
修改urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from first.views import sayhello,hello2,hello3urlpatterns = [
path('admin/', admin.site.urls),
url(r'^$', sayhello),
url(r'^hello2/(\w+)/$', hello2),
url(r'^hello3/(\w+)/$', hello3),
]
修改views.py
連結hello3.html
from django.shortcuts import render
from datetime import datetime
from django.http import HttpResponsedef sayhello(request):
return HttpResponse("Hello django!")
def hello2(reuest,username):
return HttpResponse("Hello" + username)
def hello3(request,username):
now=datetime.now()
return render(request,"hello3.html",locals())
加入static靜態檔案(hello4)
我們已在settings.py中加入了路徑資料夾:
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
這時候,如果要加入圖片和CSS,必須在static中再新增images和css的資料夾
修改urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from first.views import sayhello,hello2,hello3,hello4urlpatterns = [
path('admin/', admin.site.urls),
url(r'^$', sayhello),
url(r'^hello2/(\w+)/$', hello2),
url(r'^hello3/(\w+)/$', hello3),
url(r'^hello4/(\w+)/$', hello4),
]
修改views.py
from django.shortcuts import render
from datetime import datetime
from django.http import HttpResponsedef sayhello(request):
return HttpResponse("Hello django!")
def hello2(reuest,username):
return HttpResponse("Hello\n" + username)
def hello3(request,username):
now=datetime.now()
return render(request,"hello3.html",locals())
def hello4(request,username):
now=datetime.now()
return render(request,"hello4.html",locals())
在templates資料夾中新增hello4.html
並且在static/images中放入ball.png
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>顯示圖片的模板</title>
{% load static %}
<link href="{% static "css/style.css" %}" rel="stylesheet" type = "text/css" />
</head>
<body>
<div id ="home">
<img src="{% static "images/ball.png" %}" alt="歡迎光臨" width="32" height="32"/>
<span class="info">歡迎光臨:{{username}}</span>
<h2>現在時刻: {{now}}</h2>
</div>
</body>
</html>
在static/css中新增style.css
.info {
color:red;
font-size: 1.5em;
}
開啟 http://127.0.0.1:8000/hello2/david/ 會顯示
Hello david
Admin後台管理
Django 第三方登入 — 以Github為例
path & re_path vs. url
#1.X版本的寫法
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), #2.X後的寫法
path('articles/<int:year>/', views.year_archiv), path('articles/<int:year>/<int:month>', views.montu_archiv)