坑:
-
寫(xiě)入 html 前必須在 setting.py 中的 TEMPLATES 注冊(cè)模板路徑,否則 render 無(wú)法掛載模板。
image.png
根據(jù)報(bào)錯(cuò)分析可知,最終錯(cuò)誤點(diǎn)在于:
raise TemplateDoesNotExist(template_name, chain=chain)
很明顯錯(cuò)誤說(shuō)明模板是不存在的,為什么會(huì)報(bào)這個(gè)?我已經(jīng)指明了絕對(duì)路徑!
查看一下 render 的定義:


好吧,原來(lái) render 并不直接接收 HTML 文件,而是接收 django.template.loader.render_to_string() 返回的值。
- 路由的根目錄直接寫(xiě) / 不能訪問(wèn)。
安裝:
安裝真無(wú)聊,網(wǎng)上一大票。
一句話,能用 pip 就 pip 不能就上 conda 再不行就直接上 Unofficial Windows Binaries for Python Extension Packages,這都不行就虛擬機(jī)吧!
Django 管理
在安裝了 Django 之后,在 python 所在的 script 文件夾里將會(huì)有一個(gè)叫 django-admin.exe 的文件,這一看就知道是管理文件,直接運(yùn)行它即可獲得全部的指令信息。
根據(jù)指令利用 django-admin.exe 工具來(lái)創(chuàng)建一個(gè)項(xiàng)目文件(真是智能):bash django-admin.exe startproject DjangoDemo
運(yùn)行之后將會(huì)根據(jù) dirName 來(lái)創(chuàng)建一個(gè)項(xiàng)目文件夾,內(nèi)部有一個(gè) manage.py,這東西還是一看就知道是管理者,按照老習(xí)慣看看它的指令都有什么:python manage.py --help
嗯,很多東西,就不列出來(lái)了,觀察可發(fā)現(xiàn) django 哪一項(xiàng)的功能跟 django-admin.exe 的一模一樣啊,看了看官網(wǎng) django-admin.exe 其實(shí)是一個(gè)方便的手段,但在使用前需要加上參數(shù) --settings=mysite.settings 來(lái)指明使用的是哪一個(gè)配置文件,而 manage.py。
安裝之后一定要測(cè)試一下:
python manage.py runserver 127.0.0.1:10086

簡(jiǎn)單了解一下開(kāi)發(fā)服務(wù)器 runserver:
- 當(dāng)改動(dòng) python 源碼文件并重新載入模塊時(shí),開(kāi)發(fā)服務(wù)器會(huì)自動(dòng)檢測(cè)并自動(dòng)刷新。
- 開(kāi)發(fā)服務(wù)器知道如何為 Django 管理應(yīng)用程序?qū)ふ液惋@示靜態(tài)媒體文件。
簡(jiǎn)單了解下目錄:

試一試路由
打開(kāi) urls.py,寫(xiě)入:
from django.contrib import admin
from django.urls import path
from django.shortcuts import HttpResponse
def index(requst):
return HttpResponse('Hello world!')
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', index),
]
其實(shí)就是簡(jiǎn)單的構(gòu)建了一個(gè) HTTP 響應(yīng)包,這個(gè)包不是給 django 看的,而是丟給瀏覽器看的。
image.png
路由返回 html 文件
創(chuàng)建 HTML 視圖:
mkdir templates
touch index.html
往 index.html 寫(xiě)入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>Hello world!</h1>
</body>
</html>
往 setting.py 的 TEMPLATES 中的字典 ’DIRS‘ 加入:
'DIRS': [os.path.join(BASE_DIR, 'templates')],
將 urls.py 中的 index 函數(shù)改為返回一個(gè) html 文件即可:
from django.shortcuts import render
def index(requst):
return render(requst, r'D:\PRJ\DjangoDemo\templates\index.html')
<center>成功將返回:</center>

引入其他靜態(tài)文件、CSS、圖片、文本等
這個(gè)官網(wǎng)的例子很棒啊~:)
- 確定你的
django.contrib.staticfiles已經(jīng)被 [INSTALLED_APPS] 所支持。 - 在你的 setting 中定義 TATIC_URL,比如:
py TATIC_URL = '/static/' - 在你的模板中通過(guò)模板標(biāo)簽 static 這種方式進(jìn)行引用,它會(huì)自動(dòng)與 STATICFILES_STORAGE 擼出來(lái)的資源路徑相關(guān)聯(lián):
{% load static %}
<img src="{% static "my_app/example.jpg" %}" alt="My image">
{% static %} 模板標(biāo)簽會(huì)生成靜態(tài)文件的絕對(duì)路徑。
- 將你的靜態(tài)資源文件儲(chǔ)存到項(xiàng)目目錄的 static 文件夾中, 比如說(shuō) my_app/static/my_app/example.jpg。
最后再向 setting.py 添加:
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
TATIC_URL 用來(lái)指明網(wǎng)站訪問(wèn)靜態(tài)資源時(shí)的路徑,而 STATICFILES_DIRS 則是指明包含靜態(tài)資源的路徑,在 STATICFILES_DIRS 下的資源,最終在網(wǎng)站的視角都會(huì)被映射為 static 下的資源。
參考來(lái)源:
實(shí)踐:
先創(chuàng)建一個(gè) static 文件夾,然后隨便懟一張照片進(jìn)去~
mkdir static
cp ..\Images\[fox生抽]wallls.com_179505.jpg .\static\
tree -L 2 --filelimit 20

然后在 HTML 中引入作為背景。
先直接硬寫(xiě)路徑:
<style>
body {
background-image: url("/static/[fox生抽]wallls.com_179505.jpg")
}
</style>

哈哈,網(wǎng)站的根目錄就是項(xiàng)目目錄,直接硬寫(xiě)就成了,額,我沒(méi)用模板啊。
利用模板引入 CSS:
先將剛剛寫(xiě)入 html 硬路徑引入圖片的代碼去除。
在 static 下創(chuàng)建一個(gè) CSS 文件 style.css,并寫(xiě)入圖片路徑:
body {
background-image: url("/static/[fox生抽]wallls.com_179505.jpg")
}
在 index.html 的 head 中寫(xiě)入:
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static '/style.css' %}">
<center>測(cè)試<center>

很好,這次利用模板也成功引入,隨便說(shuō)一句,硬寫(xiě)也是同樣可以的,但是使用模板的話一切路徑的修改就全部統(tǒng)合起來(lái)了,改大量資源會(huì)方便一點(diǎn)。
創(chuàng)建子模塊 APP 及信息交互
Django 能擁有多個(gè) APP 或者說(shuō)子模塊,相互之間比較獨(dú)立,但也可以有聯(lián)系。
啊,反正就是比較原始的代碼復(fù)用的方式,并且能使得項(xiàng)目的結(jié)構(gòu)清晰一點(diǎn)。直接將上面做的內(nèi)容懟到一起就是一個(gè)模塊了。
信息交互,客戶(hù)端跟服務(wù)器的信息交互,如果是網(wǎng)站的話,那也就是 HTTP 交互咯。
創(chuàng)建一個(gè) login 模塊:
bash python manage.py startapp login
向 login 內(nèi)的 views 寫(xiě)入以下代碼:
from django.shortcuts import render
from django.shortcuts import HttpResponse
def index(request):
if request.method == 'POST':
say = request.POST.get('say')
print(request.POST)
print(say)
return render(request, 'index.html')
往 index.html 中的 body 寫(xiě)入:
<h1>Hello world</h1>
<form action="/login/" method="post">
{% csrf_token %}
說(shuō)點(diǎn)什么:<input type="text" name="say">
<br>
<input type="submit" value="提交">
</form>
最后在 urls.py 中編寫(xiě)路由:
from django.contrib import admin
from django.urls import path
from login.views import index
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', index),
]
注意 {% csrf_token %} 是 Django 自帶的 CSRF 保護(hù)機(jī)制,不加這個(gè)會(huì)引發(fā)跨域問(wèn)題。
隨便寫(xiě)點(diǎn)東西進(jìn)去提交:Hello world
看看控制臺(tái)的返回:

前面三個(gè)是請(qǐng)求資源的,分別是 index.html 頁(yè)面,style.css 文件,和一張圖片。
第四行是打印的 request.POST 和 request.POST.get('say'),這里前后端使用的是 HTTP 的 POST API 交互。
嗯,就這樣。

