django url 生效_Django基础知识
最近開始看Django框架,對我來說時間一長必定會忘記,所以還是做做筆記!學Django之前還看了點關于Web框架的原理什么的。。。雜七雜八!!!
0x00 關于Web服務
A. Web間的通信
Web應用的本質(zhì)就是一套socket服務器,而用戶的瀏覽器就是socket客戶端,因而最基本的Web框架就是一套socket的代碼。
import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 80))
sk.listen()
while True:
conn, addr = sk.accept()
data = conn.recv(8096)
conn.send(b"OK")
conn.close()
而這僅僅通過這一的代碼,瀏覽器依然無法打開這個簡單的網(wǎng)頁,因為在瀏覽器與服務端進行通信的時候,有一套HTTP協(xié)議,簡單的來說就是瀏覽器與服務器之間的通信必須按照一個標準的寫法才可以完成通信。
HTTP協(xié)議對收發(fā)消息都進行了格式的要求
(HTTP GET請求)
(HTTP Response)
上面的代碼無法打開網(wǎng)頁,最主要的原因就是沒有回復HTTP請求。而一個請求為什么可以打開這個相應的網(wǎng)頁呢?在HTTP GET請求的請求行中,就有URL字段正是通過該字段可以網(wǎng)站對指定網(wǎng)頁的訪問。其主要是通過獲取URL字段,相應的調(diào)用該字段的函數(shù),從而發(fā)送網(wǎng)頁的源碼到瀏覽器中,瀏覽器通過渲染收到的代碼后進行將網(wǎng)頁渲染出來。
因而總得來說,Web框架的本質(zhì)就是Socket之間的通信
B. Socket服務端功能劃分
在Socket服務端主要有三件事情要做,首先是響應HTTP請求,并發(fā)送響應;其次是根據(jù)URL字段的不同,執(zhí)行不同的函數(shù),從而返回相應的頁面;最后,就是通過替換頁面中的字符串,從而實現(xiàn)動態(tài)網(wǎng)頁(比如你訪問某個頁面,上面可以顯示今天的日期,其實你明兒打開的還是同一個HTML文件,僅僅是將日期處的字段替換為了今天的日期而已)??傮w概況如下:
責與瀏覽器收發(fā)消息(socket通信) –> wsgiref/uWsgi/gunicorn…
根據(jù)用戶訪問不同的路徑執(zhí)行不同的函數(shù)
從HTML讀取出內(nèi)容,并且完成字符串的替換 –> jinja2(模板語言)
C. 關于Web框架的分類
Web框架主要完成的任務就是上面的幾個功能,而根據(jù)不同的Web實現(xiàn)的不同功能可以分為幾個主流的框架類型。
以Tornado框架為代表的框架,則可以實現(xiàn)以上三個功能。
以Django框架為代表的框架,則可以后兩個功能,第一個功能則需要第三方模塊實現(xiàn)。
以Flask框架為代表的框架,則僅僅實現(xiàn)了第二個功能,第一和第三個功能則需要第三方模塊來實現(xiàn)。
0x01 初始Django
A. Django框架的安裝
在Django官網(wǎng)中可以看到每個辦法的支援時間,看了下Django 1.11 LTS可以支援到明年,所以我安裝的就是Django 1.11.8。
pip3 install django==1.11.8
安裝好Django后可以在終端輸入django-admin來測試看看,是否安裝成功。
B. 創(chuàng)建一個Django項目
—命令行方式
django-admin startproject 項目名稱
—Pycharm方式
File –> New project –> 左側(cè)選Django –> 右側(cè)填項目路徑,并且勾選python.exe
之后在一個新窗口中打開。
C. Django文件目錄
—文件結(jié)構(gòu)
創(chuàng)建出來的Django項目的文件結(jié)構(gòu)入下圖。
默認創(chuàng)建出來沒有那個static文件夾
urls.py中,主要存放著URL字段調(diào)用函數(shù)直接的關系。而函數(shù)又放在每個APP中的views.py中。
settings.py中,主要是存放一些Django的配置信息,入安裝的APP、連接數(shù)據(jù)庫的信息。
templates文件夾中,主要是方HTML文件的文件夾。
—關于settings.py
剛學python,對于settings.py有2個地方要注意。
首先,注釋了settings.py中的’django.middleware.csrf.CsrfViewMiddleware’,這行代碼,暫時禁用了csrf中間件,可以方便表單提交測試。
其次,這樣你發(fā)送了HTML頁面到瀏覽器中,會發(fā)現(xiàn)javascript、css、圖片等靜態(tài)文件并沒有沒有發(fā)送過去,因而需要將靜態(tài)文件夾也發(fā)送過去。為了統(tǒng)一規(guī)范吧!都建立一個叫做static的文件夾,就是上圖的那個文件夾了!之后就要打開settings.py去配置靜態(tài)文件的路徑了。
(設置靜態(tài)文件的路徑)
在STATIC_URL下方,靜態(tài)文件夾的路徑,如果也加static的話,那么可以拷貝下面的配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static")
]
之后在HTML中,將靜態(tài)文件的路徑設置前面加上/static/,入下圖
注意這里的static不是文件夾的static,而是 STATIC_URL后面的static,也就無論你的靜態(tài)文件放在哪個文件夾里,只要在STATICFILES_DIRS的列表中,這里只用寫static即可生效,有點類似于靜態(tài)文件的一個環(huán)境變量的總和吧!
D. 關于APP
在Django中,為了方便一個大的Django項目中的管理,通過引出APP的概念來實現(xiàn)一個不同APP管理不同的業(yè)務。urls.py中調(diào)用調(diào)用函數(shù)的部分,被調(diào)用的函數(shù)就放在APP中的views.py里了。
創(chuàng)建APP
在Django項目的根目錄中輸入以下命令即可創(chuàng)建APP
python manage.py startapp app名字
創(chuàng)建完畢APP之后,一定要到項目settings.py中進行APP的注冊,不然會有一堆莫名其妙的問題。
其實可以只寫app的名字即可,不過還是推薦寫全。
0x02 第一個Django項目
接下來以創(chuàng)建一個簡易的圖書館里系統(tǒng)的部分環(huán)節(jié)為例子,來講述Django項目的編寫。通過上面的內(nèi)容,已經(jīng)設置好了STATICFILES_DIRS、創(chuàng)建了APP等。
A 映射URL
Server后端收到HTTP請求后,提取出URL路徑,之后將跳轉(zhuǎn)到APP中的views.py文件中去讀取相應的函數(shù)。這個路徑與函數(shù)之間的映射關系首先是在項目中的settings.py中設置。
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^publisher-list/', views.publisher_list),
url(r'^add-publisher/', views.add_publisher),
url(r'^edit-publisher/', views.edit_publisher),
url(r'^book-list/', views.book_list),
url(r'^add-book/', views.add_book),
url(r'^edit-book/', views.edit_book),
]
通過在urlpatterns列表中指定路徑及映射函數(shù)即可。路徑的指示支援正則表達式,所以如果是要域名主頁的還,那么可以寫r’^$’。
B 編寫視圖Views
進入對應的APP中的views.py中,定義一個函數(shù),函數(shù)名字為之前url映射中的后半部分,傳入一個HttpRequest對象,一般情況下默認寫為request。忽略下面代碼中的ORM部分!!
from django.shortcuts import render, redirect, HttpResponse
from app01 import models
# Create your views here.
def publisher_list(request):
if request.GET:
id = request.GET.get("id", None)
del_obj = models.Publisher.objects.get(id=id)
del_obj.delete()
ret = models.Publisher.objects.all()
return render(request, "publisher_list.html", {"publiser": ret})
這樣就創(chuàng)建出了一個最簡單的Django項目了!!
C Django三件套render HttpResponse redirect
之前介紹了Web框架的本質(zhì)其實就3點,關于socket通信和URL映射之前都介紹了,接下來就是給瀏覽器返回數(shù)據(jù)了。render、HttpResponse、redirect也是用的最多的三個方法,因而江湖美其名曰“Django”三件套。
a HttpResponse
由于視圖(理解為views.py中的函數(shù)吧!)必須返回一個 HttpResponse 對象給瀏覽器,因而HttpResponse 方法就是最簡單的直接傳入字符串即可,已經(jīng)被封裝的無需轉(zhuǎn)化為bytes對象。
b redirect
redirect就是重定向了,可以直接傳入一個路徑(如”/book-list/”)也可以直接傳入一個網(wǎng)址。
c render
render最簡單的方法就是直接返回一個渲染好的html頁面
return render(request,"about.html")
這樣就可以返回了一個靜態(tài)的頁面給瀏覽器。
如果要返回一個動態(tài)頁面就需要在render函數(shù)中添加content參數(shù)了。具體的三件套的使用示例直接見下面的代碼吧!
def edit_publisher(request):
id = request.GET.get("id", None)
edit_obj = models.Publisher.objects.get(id=id)
if request.method == "GET":
if id:
return render(request, "edit-publisher.html", {"publisher": edit_obj})
else:
return HttpResponse("無法選擇要編輯的出版社!")
else:
new_name = request.POST.get("name", None)
if new_name != edit_obj.name:
edit_obj.name = new_name
edit_obj.save()
return redirect("/publisher-list/")
至于代碼中的動態(tài)渲染頁面還有ORM框架,等系統(tǒng)學習之后在單獨的寫筆記吧!!!
總結(jié)
以上是生活随笔為你收集整理的django url 生效_Django基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡代还流程4步走
- 下一篇: java获取行号_java – 如何获取