由淺入深學習Python Django框架「小白必看」
點擊上方「
Python開發
」,選擇「置頂公眾號」
關鍵時刻,第一時間送達!
作者:python教程
https://mp.weixin.qq.com/s/Sl4AfLcUVKbjppGlwPAACg
Python開發整理髮布,轉載請聯繫作者獲得授權
1、Django簡介
Python下有多款不同的 Web 框架,Django是最有代表性的一種。許多成功的網站和APP都基於Django。
Django是一個開源的Web應用框架,由Python寫成。
Django採用了MVC的軟體設計模式,即模型M,視圖V和控制器C。
2、Django的特點
1) 強大的資料庫功能:用python的類繼承,幾行代碼就可以擁有一個動態的資料庫操作API,如果需要也能執行SQL語句。
2) 自帶的強大的後台功能:幾行代碼就讓網站擁有一個強大的後台,輕鬆管理內容。
3) 優雅的網址:用正則匹配網址,傳遞到對應函數。
4) 模板系統:強大,易擴展的模板系統,設計簡易,代碼和樣式分開設計,更易管理。
5) 緩存系統:與memcached或其它緩存系統聯用,表現更出色,載入速度更快。
6) 國際化:完全支持多語言應用,允許你定義翻譯的字元,輕鬆翻譯成不同國家的語言。
3、Django項目目錄
1) urls.py:網址入口,關聯到對應的views.py中的一個函數(或generic類),訪問網址就對應一個函數。
2) views.py:處理用戶發出的請求,與urls.py對應, 通過渲染templates中的網頁可以將顯示內容,如登陸後的用戶名,用戶請求的數據等輸出到網頁。
3) models.py:與資料庫操作相關,存入或讀取數據時用到,用不到資料庫時可以不使用。
4) forms.py:表單,用戶在瀏覽器上輸入數據提交,對數據的驗證工作以及輸入框的生成等工作,也可以不使用。
5) templates文件夾:views.py中的函數渲染templates中的html模板,得到動態內容的網頁,可以用緩存來提高速度。
6) admin.py:後台,可以用很少的代碼就擁有一個強大的後台。
7) settings.py:Django 的配置文件,如 DEBUG 的開關,靜態文件的位置等。
4、Django基本命令
1) 新建一個項目:
django-admin.py startproject project-name
在 windows 上如果報錯,嘗試用 django-admin 代替 django-admin.py 。
2) 新建一個APP:
python manage.py startapp app-name
或
django-admin.py startapp app-name
一般一個項目有多個app, 當然通用的app也可以在多個項目中使用。
3) 啟動伺服器:
python manage.py runserver 0.0.0.0:8000
或
python manage.py runserver
前者讓其它電腦可連接到伺服器,監聽機器上所有ip的8000埠,訪問時用電腦的ip代替 127.0.0.1(8000為埠號,如果不說明,則埠號默認為8000);後者在本電腦訪問伺服器,訪問時ip為127.0.0.1。
5、視圖與網址
views.py:
from import def helloWorld (request)
return
HttpResponse("Hello world! "
)urls.py:
from import from import r"^$"
urlpatterns = [
url(//img.ifuun.com/getimg.php?url=
]
啟動伺服器,並在瀏覽器訪問:127.0.0.1:8000。
修改後的urls.py:
from import from import r"^helloWorld$"
urlpatterns = [
url(//img.ifuun.com/getimg.php?url=
]
啟動伺服器,並在瀏覽器訪問:127.0.0.1:8000/helloWorld。
url(//img.ifuun.com/getimg.php?url=) 函數:可以接收四個參數,分別是兩個必選參數regex、view 和兩個可選參數kwargs、name:
① regex:正則表達式,與之匹配的 URL 會執行對應的第二個參數 view。
② view:用於執行與正則表達式匹配的 URL 請求。
③ kwargs:視圖使用的字典類型的參數。
④ name:用來反向獲取 URL。
6、Django模板
1) 實例:
① 在app目錄中,創建 templates 目錄並建立 helloWorld.html文件:
<h1>{{ helloWorld }}</h1>
② 向Django說明模板文件的路徑,修改settings.py文件,修改 TEMPLATES 中的 DIRS 為 [BASE_DIR+"/templates",]。
③ 修改views.py:
from import def hello (request)
context = {}
context[
"helloWorld"
] ="Hello World!"
return
render(request,"helloWorld.html"
, context)render使用了一個字典 context 作為參數,context 字典中元素的鍵值 "helloWorld" 對應了模板中的變數 "{{ helloWorld }}"。
④ 啟動伺服器,並在瀏覽器訪問:127.0.0.1:8000/helloWorld。
2) Django 模板標籤
① if/else 標籤
if/else支持嵌套,{% if %} 標籤接受and、or 或not關鍵字來對多個變數做判斷,或對變數取反。
{%
if
condition %}
...
{% endif %}
或者:
{%
if
condition1 %}
...
{%
elif
condiiton2 %}
...
{%
else
%}
...
{% endif %}
② for 標籤
{% for %} 允許在一個序列上迭代。支持嵌套。每一次循環中,模板系統會渲染在 {% for %} 和 {% endfor %} 之間的所有內容。
<ul>
{%
for
personin
list %}
<li>{{ person.name }}</li>
{% endfor %}
</ul>
給標籤增加一個 reversed 使得該列表被反向迭代:
{%
for
personin
list %}
...
{% endfor %}
③ ifequal/ifnotequal 標籤
{% ifequal %} 標籤比較兩個值,當他們相等時,顯示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。和 {% if %} 類似, {% ifequal %} 支持可選的 {% else%} 標籤。
{% ifequal person1 person2 %}
<h1>YES</h1>
{% endifequal %}
④ 注釋標籤
Django 注釋使用 {# #}。
⑤ 過濾器
模板過濾器可以在變數被顯示前修改它,過濾器使用管道字元:
{{ name|lower }}大寫轉換為小寫。
一個過濾器管道的輸出又可以作為下一個管道的輸入:
{{ name|first|upper }}將第一個元素轉化為大寫。
有些過濾器有參數,過濾器的參數跟隨冒號之後並總是以雙引號包含:
{{ name|truncatewords:"3" }}顯示變數的前3個詞。
addslashes:添加反斜杠到任何反斜杠、單引號或者雙引號前面。
date:按指定的格式字元串參數格式化date或datetime對象,如{{ pub_date|date:"F j, Y" }}。
length:返回變數的長度。
⑥ include 標籤
{% include %} 標籤允許在模板中包含其它的模板的內容。
{% include
"test.html"
%}
7、Django模型
Django 對各種資料庫提供了很好的支持,Django 為資料庫提供了統一的調用API,可以根據業務需求選擇不同的資料庫。
以MYSQL資料庫為例,安裝 mysql 驅動的命令:sudo pip install mysqlclient。
1) 資料庫配置
在項目的settings.py文件中找到 DATABASES 配置項,將其信息修改為:
"default" "ENGINE" "django.db.backends.mysql" # 或者使用 mysql.connector.django "NAME" "test" "USER" "test" "PASSWORD" "test123" "HOST" "localhost" "PORT" "3306"DATABASES = {
}
}
這裡添加了中文注釋,所以需要在settings.py 文件頭部添加 # -*- coding: UTF-8 -*-。
2) 定義模型
① 創建APP:
Django規定,如果要使用模型,必須要創建一個app,使用以下命令創建一個app:python manage.py startapp TestModel。
② 修改 TestModel/models.py 文件:
from import class Test (models.Model)
name = models.CharField(max_length=
20
)類名代表了資料庫表名,且繼承了models.Model,類裡面的欄位代表數據表中的欄位(name),數據類型則由CharField(相當於varchar)、DateField(相當於datetime), max_length 參數限定長度。
③ 在settings.py中找到INSTALLED_APPS這一項,添加:"TestModel"。
④ 在命令行中運行以下命令,創建數據表,表名為應用名_類名(如:TestModel_test):
view plain
copy
python # 創建表結構 # 讓Django知道模型有一些變更 # 創建表結構
python manage.py makemigrations TestModel
python manage.py migrate TestModel
3) 資料庫操作
添加database.py文件:
[python]
view plain
copy
from import from import def database (request)
test = Test(name=
"Alice"
)test.save()
return
HttpResponse("<p>數據添加成功!</p>"
)修改 urls.py:
view plain
copy
from import from import r"^hello$" r"^database$"
urlpatterns = [
url(//img.ifuun.com/getimg.php?url=
url(//img.ifuun.com/getimg.php?url=
]
啟動伺服器,並在瀏覽器訪問:127.0.0.1:8000/database。
① 添加數據
[python]
view plain
copy
from import from import def database (request)
test = Test(name=
"Alice"
)test.save()
return
HttpResponse("<p>數據添加成功!</p>"
)② 獲取數據
[python]
view plain
copy
from import from import def database (request)
# 初始化
response =
""
response1 =
""
# 通過objects這個模型管理器的all()獲得所有數據行,相當於SQL中的SELECT * FROM
list = Test.objects.all()
# filter相當於SQL中的WHERE,可設置條件過濾結果
response2 = Test.objects.filter(id=
1
)# 獲取單個對象
response3 = Test.objects.get(id=
1
)# 限制返回的數據,相當於SQL中的OFFSET 0 LIMIT 2;
Test.objects.order_by(
"name"
)[0
:2
]# 數據排序
Test.objects.order_by(
"id"
)# 上面的方法可以連鎖使用
Test.objects.filter(name=
"Alice"
).order_by("id"
)# 輸出所有數據
for
varin
list:response1 += var.name +
" "
response = response1
return
HttpResponse("<p>"
+ response +"</p>"
)③ 更新數據
[python]
view plain
copy
from import from import def database (request)
# 修改id=1的name欄位再save,相當於SQL中的UPDATE
test = Test.objects.get(id=
1
)test.name=
"Alice"
test.save()
# 另一種方式
# Test.objects.filter(id=1).update(name="Alice)
# 修改所有的列
# Test.objects.all()..update(name="Google")
return
HttpResponse("<p>數據修改成功</p>"
)④ 刪除數據
刪除資料庫中的對象只需調用該對象的delete()方法即可:
[python]
view plain
copy
from import from import def database (request)
# 刪除id=1的數據
test = Test.objects.get(id=
1
)test.delete()
# 另外一種方式
# Test.objects.filter(id=1).delete()
# 刪除所有數據
# Test.objects.all().delete()
return
HttpResponse("<p>數據刪除成功</p>"
)8、Django表單
1) Get方法
① 創建一個 search.py 文件,用於接收用戶的請求:
[python]
view plain
copy
from import from import # 表單 def search_form (request)
return
render_to_response("search_form.html"
)# 接收請求數據
def
search
(request)
:request.encoding=
"utf-8"
if
"q"
in
request.GET:message =
"搜索的內容為: "
+ request.GET["q"
].encode("utf-8"
)else
:message =
"提交了空表單"
return
HttpResponse(message)② 在templates中添加 search_form.html 表單:
[html]
view plain
copy
<!DOCTYPE html> < html
<
head
><
meta
charset
="utf-8"
><
title
></
title
></
head
><
body
><
form
action
="/search"
method
="get"
><
input
type
="text"
name
="q"
><
input
type
="submit"
value
="搜索"
></
form
></
body
></
html
>③ 修改urls.py:
[python]
view plain
copy
from import from import r"^helloWorld$" r"^database$" r"^search-form$" r"^search$"
urlpatterns = [
url(//img.ifuun.com/getimg.php?url=
url(//img.ifuun.com/getimg.php?url=
url(//img.ifuun.com/getimg.php?url=
url(//img.ifuun.com/getimg.php?url=
]
④ 啟動伺服器,並在瀏覽器訪問:127.0.0.1:8000/search_form。
2) Post方法
① 在templates中添加 post.html 表單:
[python]
view plain
copy
<!DOCTYPE html> < html
<
head
><
meta
charset
="utf-8"
><
title
></
title
></
head
><
body
><
form
action
="/search-post"
method
="post"
>{% csrf_token %}
<
input
type
="text"
name
="q"
><
input
type
="submit"
value
="搜索"
></
form
><
p
>{{ rlt }}</
p
></
body
></
html
>{% csrf_token %}標籤:csrf 全稱是 Cross Site Request Forgery,這是Django提供的防止偽裝提交請求的功能。POST 方法提交的表格,必須有此標籤。
② 新建 search2.py 文件並使用 search_post 函數來處理 POST 請求:
[python]
view plain
copy
from import from import # 接收POST請求數據 def search_post (request)
ctx ={}
if
request.POST:ctx[
"rlt"
] = request.POST["q"
]return
render(request,"post.html"
, ctx)③ 修改urls.py:
[python]
view plain
copy
from import from import r"^helloWorld$" r"^database$" r"^search-form$" r"^search$" r"^search-post$"
urlpatterns = [
url(//img.ifuun.com/getimg.php?url=
url(//img.ifuun.com/getimg.php?url=
url(//img.ifuun.com/getimg.php?url=
url(//img.ifuun.com/getimg.php?url=
url(//img.ifuun.com/getimg.php?url=
]
④ 啟動伺服器,並在瀏覽器訪問:127.0.0.1:8000/search_post。
【點擊成為Java大神】
※利用11行Python代碼, 盜取了室友的U盤, 內容十分刺激!
TAG:Python開發 |