Django-開(kāi)始-0

坑:

  1. 寫(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 的定義:

image.png

image.png

好吧,原來(lái) render 并不直接接收 HTML 文件,而是接收 django.template.loader.render_to_string() 返回的值。

  1. 路由的根目錄直接寫(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

image.png

簡(jiǎn)單了解一下開(kāi)發(fā)服務(wù)器 runserver:

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

簡(jiǎn)單了解下目錄:


image.png

試一試路由

打開(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>


image.png

引入其他靜態(tài)文件、CSS、圖片、文本等

這個(gè)官網(wǎng)的例子很棒啊~:)

  1. 確定你的 django.contrib.staticfiles 已經(jīng)被 [INSTALLED_APPS] 所支持。
  2. 在你的 setting 中定義 TATIC_URL,比如:
    py TATIC_URL = '/static/'
  3. 在你的模板中通過(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ì)路徑。

  1. 將你的靜態(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
image.png

然后在 HTML 中引入作為背景。
先直接硬寫(xiě)路徑:

    <style>
    body {
        background-image: url("/static/[fox生抽]wallls.com_179505.jpg")
    }
    </style>
image.png

哈哈,網(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>


image.png

很好,這次利用模板也成功引入,隨便說(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)的返回:

image.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容