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