1.安裝django
pip install django
安裝完成后除了在模塊目錄lib下回有Django模塊文件外,在python的安裝目錄下的Scripts目錄下會生成一個django-admin.exe,這個工具是用來創(chuàng)建django項目的 ,會在創(chuàng)建項目的時候默認吧項目需要額文件和文件夾創(chuàng)建好
2.創(chuàng)建項目
django中項目會有一些默認的文件和默認的文件夾。
2.1 在終端
-
打開終端。
-
進入到保存項目的目錄下 (提前創(chuàng)建)。
E:\python_venv\mydjango
-
執(zhí)行命令創(chuàng)建項目
#絕對路徑執(zhí)行命令(這里路徑是我的虛擬環(huán)境的路徑) "E:\python_venv\testvenv\Scripts\django-admin.exe" startproject 項目名稱
# 如果E:\python_venv\testvenv\Scripts 已加入環(huán)境系統(tǒng)環(huán)境變量。 django-admin startproject 項目名稱
2.2 Pycharm(企業(yè)版)
選擇項目保存位置,和解釋器,注意解釋器選擇剛才安裝了django模塊的解釋器。
通過pycharm創(chuàng)建項目,相比使用命令創(chuàng)建的,在基礎(chǔ)上默認加了文件和目錄,不是必要的。
- 創(chuàng)建了一個templates目錄(可以刪除,后續(xù)使用app中的templates目錄)
- settings.py中,如下圖多一個參數(shù),指定了模板查優(yōu)先找到項目的templates目錄中查找,如果刪除templates目錄,那這個參數(shù)也要刪除掉
刪除列表中參數(shù):
默認項目的文件介紹:
mysite
├── manage.py 【項目的管理,啟動項目、創(chuàng)建app、數(shù)據(jù)管理】【無需修改】【常用】
└── mysite
├── __init__.py
├── settings.py 【項目配置文件】 【經(jīng)常修改】
├── urls.py 【URL和python函數(shù)的對應(yīng)關(guān)系】【經(jīng)常修改】
├── asgi.py 【接收網(wǎng)絡(luò)請求】【無需修改】
└── wsgi.py 【接收網(wǎng)絡(luò)請求】【無需修改】
3. 創(chuàng)建app
app在項目下,app之間獨立互不影響。
比如以下結(jié)構(gòu):
- 項目
- app,用戶管理【表結(jié)構(gòu)、函數(shù)、HTML模板、CSS】
- app,訂單管理【表結(jié)構(gòu)、函數(shù)、HTML模板、CSS】
- app,后臺管理【表結(jié)構(gòu)、函數(shù)、HTML模板、CSS】
- app,網(wǎng)站 【表結(jié)構(gòu)、函數(shù)、HTML模板、CSS】
- app,API 【表結(jié)構(gòu)、函數(shù)、HTML模板、CSS】
..
創(chuàng)建app命令:
python3 manage.py startapp app名稱
如:python3 manage.py startapp apptest
創(chuàng)建之后就會在項目目錄下生成一個對應(yīng)的目錄:
app目錄結(jié)構(gòu)介紹:
├── app01
│ ├── __init__.py
│ ├── admin.py django默認提供了admin后臺管理。
│ ├── apps.py app啟動類
│ ├── migrations 數(shù)據(jù)庫變更記錄
│ │ └── __init__.py
│ ├── models.py 對數(shù)據(jù)庫操作。
│ ├── tests.py 單元測試
│ └── views.py 函數(shù) (urls.py中指定的URL與函數(shù)關(guān)系 的函數(shù)一般定義在這里)
├── manage.py
└── mysite2
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py 【URL->函數(shù)】
└── wsgi.py
4.啟動一個app
4.1app注冊【settings.py】
創(chuàng)建app后需要在settings.py中INSTALLD_APPS列表里添加app的信息(在app目錄下的apps.py文件中的函數(shù)名)
4.2 配置URL和視圖函數(shù)對應(yīng)關(guān)系 【urls.py】
urls.py中有個urlpatterns中寫url和視圖函數(shù)的關(guān)系,
# 格式如下
from apptest import views #函數(shù)需要import導(dǎo)入,一般寫在app的views.py中,這里我們導(dǎo)入這個文件
urlpatterns = [
# path('url地址', 函數(shù))
path('admin/', admin.site.urls), #默認自帶的,可以注釋,當(dāng)訪問http://ip或域名/admin/時,會執(zhí)行admin.py中的site.urls函數(shù) ,這個函數(shù)需要import導(dǎo)入,一般寫在app的views.py中,這里我們導(dǎo)入這個文件
]
4.3 編寫視圖函數(shù) 【views.py】
去定義urls.py中使用的函數(shù)。views.py文件中默認是空的。
from django.shortcuts import render, HttpResponse #HttpResponse用來瀏覽器的相應(yīng)
# Create your views here.
def index(request): #這里request是默認參數(shù)必須添加
return HttpResponse("您好歡迎光臨!??!")
4.4 啟動django項目
-
命令行啟動
python manage.py runserver
- Pycharm啟動
4.5 訪問地址
直接訪問提示的地址,會提示not found 因為沒有加路徑index/,這里會提示已經(jīng)配置了那些地址
正確路徑訪問:
4.6 再增加頁面
再需要增加其他頁面時,只需要在views中配置函數(shù),然后在urls.py中增加url和函數(shù)的對應(yīng)關(guān)系。
效果:
訪問到?jīng)]有配置的路徑會提示已有路徑:
5、templates模板
上面的例子,只用HttpResponse給用戶返回了一個字符串,正常網(wǎng)站應(yīng)該返回一個頁面,這時候就需要templates目錄返回html。
在views中配置,return返回值返回render(默認已經(jīng)導(dǎo)入模塊),一個參數(shù)寫函數(shù)傳過來的變量request(一般使用request,自定義別的內(nèi)容也可以)第二個參數(shù)寫html文件名。在render就會找到這個文件并返回給瀏覽器**(默認會到app目錄下查找templates目錄下的文件)**(#會按照app在settings中注冊的順序,到每個app的templates目錄下吃查找)
如果本文2.2中settings文件中刪除的那個配置沒有修改 ,會優(yōu)先去項目目錄下的templates目錄里找文件,如果找不到才會去每個app下templates目錄里查找。一般不適用默認的到項目下templates目錄查找模板。
def user_list(request):
# 默認會到app目錄下查找templates目錄下的文件
return render(request, "user_list.html")
6.模板語法
- 基于Django
6.1html中使用變量
在html文件中定義變量,在訪問該頁面時,通過render,將變量內(nèi)容定義。
- html文件中使用雙大括號來定義變量:{{ 變量名 }}
- 函數(shù)中使用render的參數(shù)使用字典的格式定義變量的值{“變量名稱”: “值”}
- 使用列表、字典、元組等用法都是類似的
比如html文件內(nèi)容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>user</title>
</head>
<body>
<div>姓名:{{ name }}</div> {# 這里定義了name變量 #}
</body>
</html>
并在urls文件中配置:對應(yīng)關(guān)系
path('user/', views.user)
views.py中函數(shù)如下:
def user(request):
return render(request, "user.html", {"name": "songxk"})
展示效果如下:
當(dāng)傳輸?shù)氖橇斜頃r
傳輸一個變量的值是列表則在頁面也是展示為列表的格式
-
如果想展示列表中的某個值,則html文件中需要使用點.來調(diào)用列表中的某個值
{{ list.0 }} #表示取list列表中的第一個值
當(dāng)傳輸?shù)氖亲值鋾r
傳輸一個變量的值是字典,在頁面也是展示為字典的格式,一般不這樣用
-
像列表一樣,同樣可以使用點.來獲取字典中的值
dict.key #獲取字典中某個鍵(key)對應(yīng)的值
dict.keys #獲取字典中所有的鍵
dict.values #獲取字典中所有的值
dict.items #獲取字典中所有的鍵值對
圖中html文件代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>user</title>
</head>
<body>
<div>字典:{{ dict }}</div>
<div>字典中所有鍵值對:{{ dict.items }}</div>
<div>字典中所有key:{{ dict.keys }}</div>
<div>字典中所有值values:{{ dict.values }}</div>
<div>姓名:{{ dict.name }}</div>
<hr>
使用for循環(huán)遍歷鍵值對
{% for k,v in dict.items %}
<div>{{ k }} 是:{{ v }}</div>
{% endfor %}
使用for循環(huán)遍歷鍵
{% for key in dict.keys %}
<div>{{ key }}</div>
{% endfor %}
</body>
</html>
6.2html中使用for循環(huán)
格式:使用{% %}包裹,使用{% endfor %}結(jié)束循環(huán)體
{% for 循環(huán)變量名 in 變量 %}
<div>{{ 循環(huán)變量名 }}</div>
{% endfor %}
舉例:(以列表為例,字典相同用法)
html中:
{% for item in list2 %}
<div>{{ item }}</div>
{% endfor %}
views.py中:
def user(request):
testlist2 = ["lalala", "hahaha", "xixixi"]
return render(request, "user.html", {"list2": testlist2})
6.2html中使用if判斷
格式:使用{% %}包裹,使用{% endfor %}結(jié)束循環(huán)體
{% if 條件 %}
代碼
{% elif 條件 %}
代碼
{% else 條件 %}
代碼
{% endif %}
7.靜態(tài)文件
html常用到靜態(tài)文件、圖片、插件,這個些文件也有規(guī)定位置,需要放在app下的static目錄下
文件:js css文件
圖片:png、jpg等
插件:plugins
必須使用static,如果不是則加載不到圖片
靜態(tài)文件路徑可以這樣寫絕對路徑,(Django中)也可以在文件頭部引入static變量,來方便使用。寫路徑時還會有提示
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>user_list</title>
</head>
<body>
返回一個html文件,<h1>hahaha</h1>
<img src="/static/img/hhxx.jpg" alt="">
{# 路徑可以這樣卸絕對路徑,也可以在文件頭部引入static變量,來方便使用。#}
<img src="{% static 'img/hhxx.jpg' %}" alt="">
</body>
</html>
這個邊量在settings.py中有定義STATIC_URL
8.請求和響應(yīng)
8.2請求
在上邊views.py文件中定義函數(shù)時,我們使用的request參數(shù),是一個對象封裝了用戶發(fā)來的所有請求相關(guān)的數(shù)據(jù),我們可以使用這個數(shù)據(jù)獲取想要的數(shù)據(jù)。
- 獲取請求方式(GET POST)
# request是一個對象,封裝了用戶發(fā)來的所有請求相關(guān)的數(shù)據(jù)
def index(request):
# 利用request數(shù)據(jù)獲取請求方式(GET POST):
print(request.method)
- 獲取通過url傳遞的參數(shù):
# 利用request數(shù)據(jù),接收在url上傳遞的值
print(request.GET)
- 獲取post提交過來的數(shù)據(jù)
# 獲取通過post請求體中傳遞數(shù)據(jù)
print(request.POST)
8.3響應(yīng)
- HttpResponse返回內(nèi)容
HttpResponse("返回內(nèi)容")
- render讀取html內(nèi)容,返回頁面
return render(request, "user_list.html")
在返回的頁面中,可以使用占位符,在返回頁面時寫入,html中占位符格式{{ 變量名 }}
return render(request, "user_list.html", {"變量名": "內(nèi)容"})
- redirect重定向
注意導(dǎo)入redirect模塊
# 當(dāng)訪問http://127.0.0.1:8000/index時,跳轉(zhuǎn)到www.baidu.com
def index(request):
return redirect("https://www.baidu.com")
9.案例-登錄頁面
9.1配置登錄頁面
- views.py文件中添加登錄頁面對應(yīng)的函數(shù)
def login(request):
return render(request, "login.html") # 訪問login函數(shù)返回login.html
- urls.py中配置訪問路徑與函數(shù)的對應(yīng)關(guān)系
urlpatterns = [
path('login', views.login) # 訪問到ip/login路徑時運行views中的login函數(shù)
]
- 準(zhǔn)備login的html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄</title>
</head>
<body>
<h1>用戶登錄</h1>
用戶名:<input type="text" name="username" placeholder="用戶名">
密碼:<input type="password" name="passwd" placeholder="密碼">
<input type="submit" value="提交">
</body>
</html>
input中
**type指定類型:**text為文本類型輸入框,password為密碼類型輸入展示不是明文,submit提交按鈕
name設(shè)置變量名稱:相當(dāng)于輸入內(nèi)容后賦值給這變量,方便后臺取值。
placeholder占位符:當(dāng)輸入框中沒有內(nèi)容時展示。
value按鈕的展示內(nèi)容
9.2 form表單
上邊我們做了用戶登錄的頁面,但實際輸入的用戶名密碼信息我們還拿不到
這時候需要用form標(biāo)簽,通過submit按鈕將表單中的內(nèi)容提交給服務(wù)。
格式如下:
<form method="post" action="/login">
用戶名:<input type="text" name="username" placeholder="用戶名">
密碼:<input type="password" name="passwd" placeholder="密碼">
<input type="submit" value="提交"> {# 這里使用submit類型按鈕將form標(biāo)簽中的參數(shù)傳給后臺 #}
</form>
form 標(biāo)簽中:
method指定提交表單的方式可以是post或get
action指定提交的地址,提交給那個地址。
這個時候在頁面填寫內(nèi)容,點擊提交,后端就可以接收到輸入的值了。
9.3接收表單的內(nèi)容
現(xiàn)在,頁面直接訪問http://127.0.0.1:8000/login時請求到函數(shù)額方式是get,而當(dāng)填寫表單后,點擊按鈕提交時,我們指定了是post,并將數(shù)據(jù)提交給login這個地址。
這樣這個函數(shù)會同時處理通過GET和POST兩種方式發(fā)來的請求。
那么函數(shù)中就可以根據(jù)請求方式不同,執(zhí)行不同的動作
- 可以在views.py中l(wèi)ogin函數(shù)使用if判斷返回相應(yīng)的內(nèi)容
def login(request):
if request.method == "GET":
return render(request, "login.html")
else:
print(request.POST) #獲取post提交的內(nèi)容。
return HttpResponse("登錄成功?。。?)
request.method獲取請求方式,在上文8.2中有提到。
配置完成后訪問login頁面輸入信息并提交。
!?。箦eForbidden (403)
默認情況下Django中有csrf-token的驗證,因為我們沒有配置認證,無法驗證,所以報錯
解決方法,在html文件中,form表單里添加一個{% csrf_token %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄</title>
</head>
<body>
<h1>用戶登錄</h1>
<form method="post" action="/login">
{% csrf_token %}
用戶名:<input type="text" name="username" placeholder="用戶名">
密碼:<input type="password" name="passwd" placeholder="密碼">
<input type="submit" value="提交">
</form>
</body>
</html>
這里可以看到添加{% csrf_token %}后,在請求中會自動多一個csrfmiddlewaretoken的內(nèi)容,就是自動生成的token
9.4登錄驗證
拿到報文數(shù)據(jù)后,我們就可以獲取傳過來的值通過判斷,來決定是否登錄成功,或者做那個動作。
- 使用get獲取數(shù)據(jù)中的某個字段的值(拿到的報文信息,作為字典來取值)
- 取值后進行if判斷
def login(request):
if request.method == "GET":
return render(request, "login.html")
else:
user = request.POST.get("username") #獲取數(shù)據(jù)中username對應(yīng)的值
pwd = request.POST.get("passwd") #獲取數(shù)據(jù)中username對應(yīng)的值
if user == "songxk" and pwd == "123123": #這里寫死了判斷內(nèi)容,使用數(shù)據(jù)庫后可以通過讀取數(shù)據(jù)庫拿到的值做對比
return HttpResponse("登錄成功")
else:
return HttpResponse("登錄失敗")
9.5使用模板語句{{變量名}}實現(xiàn)當(dāng)前頁面返回結(jié)果
登錄成功跳轉(zhuǎn)到系統(tǒng)其他頁面,但的登錄失敗跳轉(zhuǎn)頁面返回登錄結(jié)果,不太符合實際場景要求。
在登錄頁面直接返回登錄失敗提示,這里就用到了模板語句,在html文件中添加一個變量{{ 變量名 }}文章來源:http://www.zghlxwxcb.cn/news/detail-437488.html
- 這里使用一個變量errmsg在函數(shù)中向頁面?zhèn)鬏攦?nèi)容,后期也可以使用HTML的標(biāo)簽為內(nèi)容添加格式(加粗標(biāo)紅等)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄</title>
</head>
<body>
<h1>用戶登錄</h1>
<form method="post" action="/login">
{% csrf_token %}
用戶名:<input type="text" name="username" placeholder="用戶名">
密碼:<input type="password" name="passwd" placeholder="密碼">
<input type="submit" value="提交">
{{ errmsg }}
</form>
</body>
</html>
- 函數(shù)中為了方便展示登錄效果,登錄成功后使用redirect重定向跳轉(zhuǎn)到百度(本文8.3中有介紹)
def login(request):
if request.method == "GET":
return render(request, "login.html")
else:
user = request.POST.get("username")
pwd = request.POST.get("passwd")
if user == "songxk" and pwd == "123123":
# 重定向到百度
return redirect("https://www.baidu.com")
else:
return render(request, "login.html", {"errmsg": "賬號或密碼錯誤"})
至于頁面展示效果,可以通過html根據(jù)跟人需求進行優(yōu)化。文章來源地址http://www.zghlxwxcb.cn/news/detail-437488.html
到了這里,關(guān)于【Django】從安裝Django到運行一個Django項目的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!