背景
- Django是一個(gè)開(kāi)放源代碼的Web應(yīng)用框架
- Django遵守BSD版權(quán),初次發(fā)布于2005年7月, 并于2008年9月發(fā)布了第一個(gè)正式版本1.0 。
- MVC模式,即模型M(module),視圖V(view)和控制器C(controller)。
M:主要對(duì)數(shù)據(jù)庫(kù)層的封裝
V:向用戶顯示數(shù)據(jù)
C:核心,處理請(qǐng)求,獲取數(shù)據(jù),返回結(jié)果- 高可擴(kuò)展性
- 向后兼容
- 低耦合,高內(nèi)聚
Django采用了MVT設(shè)計(jì)模式
m表示model,負(fù)責(zé)與數(shù)據(jù)庫(kù)交互
v表示view,是核心,負(fù)責(zé)接收請(qǐng)求、獲取數(shù)據(jù)、返回結(jié)果
t表示template,負(fù)責(zé)呈現(xiàn)內(nèi)容到瀏覽器

mvt
安裝
pip install Django==1.11.6
如需獲取最新版,見(jiàn)Django安裝
創(chuàng)建項(xiàng)目
- 創(chuàng)建HelloWorld項(xiàng)目
django-admin.py startproject HelloWorld
-
目錄說(shuō)明
- HelloWorld: 項(xiàng)目的容器。
- manage.py: 一個(gè)實(shí)用的命令行工具,可讓你以各種方式與該 Django 項(xiàng)目進(jìn)行交互。
- HelloWorld/init.py: 一個(gè)空文件,告訴 Python 該目錄是一個(gè) Python 包。
- HelloWorld/settings.py: 該 Django 項(xiàng)目的設(shè)置/配置。
- HelloWorld/urls.py: 該 Django 項(xiàng)目的 URL 聲明; 一份由 Django 驅(qū)動(dòng)的網(wǎng)站"目錄"。
- HelloWorld/wsgi.py: 一個(gè) WSGI 兼容的 Web 服務(wù)器的入口,以便運(yùn)行你的項(xiàng)目。
運(yùn)行第一個(gè)server
輸入命令:
python manage.py runserver 0.0.0.0:8000
瀏覽器打開(kāi)網(wǎng)址:127.0.0.1:8000,如果正常打開(kāi)網(wǎng)頁(yè),則運(yùn)行正常。
- url() 函數(shù)
Django url() 可以接收四個(gè)參數(shù),分別是兩個(gè)必選參數(shù):regex、view 和兩個(gè)可選參數(shù):kwargs、name,接下來(lái)詳細(xì)介紹這四個(gè)參數(shù)。- regex: 正則表達(dá)式,與之匹配的 URL 會(huì)執(zhí)行對(duì)應(yīng)的第二個(gè)參數(shù) view。
- view: 用于執(zhí)行與正則表達(dá)式匹配的 URL 請(qǐng)求。
- kwargs: 視圖使用的字典類型的參數(shù)。
- name: 用來(lái)反向獲取 URL。
使用Templates
- 在項(xiàng)目目錄下新建templates文件夾
新建html文件,如hello.html
<h1>hello world</h1>
- 添加模板路徑
在settings.py文件中添加:
修改 TEMPLATES 中的 DIRS 為 [BASE_DIR+"/templates",] - 使用
view.py文件中使用:
from django.http import
模板標(biāo)簽
- if/else
{% if condition %}
... display
{% endif %}
- for
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
- ifequal/ifnotequal
{% ifequal section 'sitenews' %}
<h1>Site News</h1>
{% else %}
<h1>No News Here</h1>
{% endifequal %}
- 注釋標(biāo)簽
{# 這是一個(gè)注釋 #}
- 過(guò)濾器
{{ name|lower }}
{{ my_list|first|upper }}
{{ bio|truncatewords:"30" }}
其他過(guò)濾器
addslashes : 添加反斜杠到任何反斜杠、單引號(hào)或者雙引號(hào)前面。
date : 按指定的格式字符串參數(shù)格式化 date 或者 datetime 對(duì)象,實(shí)例:
{{ pub_date|date:"F j, Y" }}
length : 返回變量的長(zhǎng)度。
- include
{% include "nav.html" %}
模板繼承
其中hello.html繼承了base.html。
- base.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥(niǎo)教程(runoob.com)</title>
</head>
<body>
<h1>Hello World!</h1>
<p>菜鳥(niǎo)教程 Django 測(cè)試。</p>
{% block mainbody %}
<p>original</p>
{% endblock %}
</body>
</html>
- hello.html
{% extends "base.html" %}
{% block mainbody %}<p>繼承了 base.html 文件</p>
{% endblock %}
使用數(shù)據(jù)庫(kù)MySQL
- 數(shù)據(jù)庫(kù)安裝
安裝MySQL可參考:MySQL安裝 - 數(shù)據(jù)庫(kù)配置
在項(xiàng)目的 settings.py 文件中找到 DATABASES 配置項(xiàng)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 或者使用 mysql.connector.django
'NAME': 'test', #數(shù)據(jù)庫(kù)名
'USER': 'test', # 數(shù)據(jù)庫(kù)用戶名
'PASSWORD': 'test123', #數(shù)據(jù)庫(kù)密碼
'HOST':'localhost',
'PORT':'3306',
}
}
- 定義模型
要使用模型,需要?jiǎng)?chuàng)建一個(gè)app,在項(xiàng)目目錄下使用以下命令:
django-admin.py startapp TestModel
修改 TestModel/models.py 文件,代碼如下:
# models.py
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=20)
定義name字段,數(shù)據(jù)類型則由CharField(相當(dāng)于varchar)、DateField(相當(dāng)于datetime), max_length 參數(shù)限定長(zhǎng)度。
- 添加模型
在settings.py中找到INSTALLED_APPS這一項(xiàng),如下:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'TestModel', # 添加此項(xiàng)
)
- 運(yùn)行遷移
$ python manage.py makemigrations TestModel # 讓 Django 知道我們?cè)谖覀兊哪P陀幸恍┳兏?$ python manage.py migrate TestModel # 創(chuàng)建表結(jié)構(gòu)
- 測(cè)試
進(jìn)入shell命令
python manage.py shell
查找信息:
Test.objects.all()
- 添加數(shù)據(jù)
添加test.db文件:
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Test
# 數(shù)據(jù)庫(kù)操作
def testdb(request):
test1 = Test(name='runoob')
test1.save()
return HttpResponse("<p>數(shù)據(jù)添加成功!</p>")
- 修改urls.py文件:
from django.conf.urls import *
from . import view,testdb
urlpatterns = [
url(r'^hello$', view.hello),
url(r'^testdb$', testdb.testdb),
]
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Test
# 數(shù)據(jù)庫(kù)操作
def testdb(request):
test1 = Test(name='runoob')
test1.save()
return HttpResponse("<p>數(shù)據(jù)添加成功!</p>")
- 運(yùn)行
運(yùn)行命令:
python manage.py runserver 0.0.0.0:8000
打開(kāi)瀏覽器訪問(wèn):127.0.0.1:8000
創(chuàng)建用戶組
python manage.py createsuperuser
在admin.py中注冊(cè)u(píng)ser
admin.site.register('TestModel')
開(kāi)啟服務(wù)后地址后面加上/user即可進(jìn)入后臺(tái)管理頁(yè)面,在管理頁(yè)面可以可視化管理,十分方便。
部署
- 安裝:
先安裝uwsgi:
pip install uwsgi - 測(cè)試
新建文件test.py
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
- 運(yùn)行uwsgi:
uwsgi --http :8000 --wsgi-file test.py
- uwsgi運(yùn)行django
uwsgi --http :8000 --module mysite.wsgi - 安裝nginx
sudo apt-get install nginx - 部署靜態(tài)文件
django settings中添加:
STATIC_ROOT = 'home/renyangfar/project/static' 運(yùn)行命令收集靜態(tài)文件到配置的STATIC_ROOT文件中:python manage.py collectstatic`
- 編輯配置文件/etc/nginx/sites-enabled/default