我的簡(jiǎn)書(shū):http://www.reibang.com/u/c91e642c4d90
我的CSDN:http://blog.csdn.net/wo_ha
我的GitHub:https://github.com/chuanqiLjp
我的個(gè)人博客:https://chuanqiljp.github.io/
版權(quán)聲明:商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系我獲得授權(quán)屯耸,非商業(yè)轉(zhuǎn)載請(qǐng)?jiān)谛涯课恢米⒚鞒鎏帯?/p>
安裝Python的環(huán)境
到Python官網(wǎng)下載,然后就是正常的軟件安裝,安裝時(shí)記得勾選 Add Python 3.6 to PATH。在cmd中輸入python
顯示了安裝的版本號(hào)則表示安裝成功,我的版本號(hào)為 3.7.1,
安裝Python集成開(kāi)發(fā)環(huán)境Pycharm
- 到Pycharm的官網(wǎng)下載Professional專業(yè)版并安裝
- 激活,打開(kāi)路徑
C:\Windows\System32\drivers\etc
疗绣,修改host文件,在末尾追加域名0.0.0.0 account.jetbrains.com
,訪問(wèn)lanyus地址:http://idea.lanyus.com/ 點(diǎn)擊獲得注冊(cè)碼,打開(kāi)Pycharm選中Activation code 將注冊(cè)碼復(fù)制進(jìn)去就可以了激活,參考文章: https://blog.csdn.net/justszh/article/details/81484802
使用Pycharm創(chuàng)建Django工程
本文以下部分參考Django2.1新手圖文入門(mén)教程
環(huán)境: windows7,Pycharm2018.3.3(必須專業(yè)版),Python3.7.1,Django2.1.5
-
Create New Project ---> Django --->填寫(xiě)項(xiàng)目名稱--->create 如下圖所示
工程的目錄結(jié)構(gòu)
FirstWeb:.
│ manage.py //django管理的主程序
│
├─FirstWeb
│ settings.py//主配置文件
│ urls.py //URL路由文件
│ wsgi.py // 網(wǎng)絡(luò)通信接口
│ __init__.py
│
└─templates // html 文件們的歸置目錄
│
├─venv // 虛擬環(huán)境
創(chuàng)建APP模塊
在pycharm下方的terminal終端中輸入命令:python manage.py startapp cmdb
,此時(shí)會(huì)在工程根目錄下創(chuàng)建cmdb模塊,其目錄結(jié)構(gòu)如下
FirstWeb:.
└─FirstWeb
└─venv
└─....省略
└─cmdb
│ admin.py
│ apps.py
│ models.py
│ tests.py
│ views.py
│ __init__.py
│
└─migrations
__init__.py
現(xiàn)在的目錄結(jié)構(gòu)如圖
在settings.py文件內(nèi)修改
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cmdb', # 新增模塊的名稱
]
# LANGUAGE_CODE = 'en-us' #英文環(huán)境
LANGUAGE_CODE = 'zh-hans' # 修改為中文
在cmdb模塊下的views.py編寫(xiě)URL的處理邏輯
from django.shortcuts import HttpResponse # 導(dǎo)入HTTP響應(yīng)類
def helloDjango(request): # request參數(shù)必須有,類似self的默認(rèn)規(guī)則,名字可以修改.他封裝了用戶請(qǐng)求的所有內(nèi)容
return HttpResponse("Hello Diango world ~~~~~ ") #在django的響應(yīng)中不能直接返回字符串,需由HttpResponse封裝
注冊(cè)URL到urls.py路由文件中
from cmdb import views # 先導(dǎo)入cmdb模塊的views文件
urlpatterns = [
path('admin/', admin.site.urls),
path(r'hello', views.helloDjango),#注冊(cè)一個(gè)新的url,參數(shù)1表示url的名稱,參數(shù)2表示執(zhí)行的業(yè)務(wù)邏輯的函數(shù)
]
通過(guò)上面兩個(gè)步驟,我們將hello這個(gè)url指向了views里的helloDjango()函數(shù)塔逃,它接收用戶請(qǐng)求,并返回一個(gè)“hello ...”字符串湾盗。至此,一個(gè)最簡(jiǎn)單的Django程序就寫(xiě)好了,此時(shí)運(yùn)行一下如果沒(méi)有報(bào)錯(cuò)就可以在瀏覽器打開(kāi)鏈接http://127.0.0.1:8000/hello
看到輸出的字符串了,如下圖
返回一個(gè)Html文件
1.在templates文件夾下創(chuàng)建index.html文件并編寫(xiě)如下內(nèi)容
<html>
<head>
<title>文檔標(biāo)題</title>
</head>
<body>
文檔內(nèi)容......
</body>
</html>
- 在views.py中編寫(xiě)業(yè)務(wù)邏輯
def indexHtml(request):
"""
返回一個(gè)HTML文件,當(dāng)想渲染一個(gè)html文件時(shí),需要使用render方法進(jìn)行打包
"""
return render(request, "index.html") # 參數(shù)1固定,參數(shù)2:指定返回的html文件
- 在urls.py注冊(cè)u(píng)rl地址
path(r'index/',views.indexHtml),#url名稱若為文件需要在末尾加斜杠,該url的業(yè)務(wù)邏輯為views.indexHtml函數(shù)
path(r'', views.indexHtml), # 默認(rèn)的主頁(yè)
其實(shí)在settings.py的TEMPLATES字典的DIRS字段中指明了html文件存放的目錄,可以修改,一般默認(rèn)就行了
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
使用靜態(tài)文件(待驗(yàn)證)
我們已經(jīng)可以將html文件返還給用戶了格粪,但是還不夠氛改,前端三大塊比伏,html、css赁项、js還有各種插件,它們齊全才是一個(gè)完整的頁(yè)面舰攒。在django中,一般將靜態(tài)文件放在static目錄中芒率。接下來(lái),在mysite中新建個(gè)static目錄偶芍。
你的CSS,JS和各種插件都可以放置在這個(gè)目錄里德玫。
為了讓django找到這個(gè)目錄,依然需要對(duì)settings進(jìn)行配置:
同樣宰僧,在index.html文件中,可以引入js文件了:
重新啟動(dòng)web服務(wù)段化,刷新瀏覽器,查看結(jié)果显熏。
接收用戶發(fā)送的數(shù)據(jù)
上面,我們將一個(gè)要素齊全的html文件返還給了用戶瀏覽器喘蟆。但這還不夠鼓鲁,因?yàn)閣eb服務(wù)器和用戶之間沒(méi)有動(dòng)態(tài)交互。下面我們?cè)O(shè)計(jì)一個(gè)表單骇吭,讓用戶輸入用戶名和密碼,提交給index這個(gè)url,服務(wù)器將接收到這些數(shù)據(jù)成福。
- 先修改index.html文件,注意action屬性不要寫(xiě)錯(cuò)
<html>
<head>
<title>
文檔標(biāo)題
</title>
</head>
<body>
文檔內(nèi)容......
<h1>
用戶輸入
</h1>
<form action="/index/" method="post">
<input type="text" placeholder="請(qǐng)輸入您的用戶名" name="userName" />
<input type="password" placeholder="請(qǐng)輸入您的密碼" name="userPwd" />
<input type="submit" value="提交" />
</form>
</body>
</html>
- 修改views.py
def indexHtml(request):
"""
返回一個(gè)HTML文件,當(dāng)想渲染一個(gè)html文件時(shí),需要使用render方法進(jìn)行打包
"""
if request.method == "POST":
name = request.POST.get("userName", None)
pwd = request.POST.get("userPwd", None)
print("name={0},pwd={1}".format(name, pwd))
return render(request, "index.html") # 參數(shù)1固定,參數(shù)2:指定返回的html文件
- 關(guān)閉跨域保護(hù),修改settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',#跨站請(qǐng)求保護(hù)機(jī)制荆残,將它關(guān)閉。
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
返回動(dòng)態(tài)頁(yè)面
收到了用戶的數(shù)據(jù)内斯,但返回給用戶的依然是個(gè)靜態(tài)頁(yè)面像啼,通常我們會(huì)根據(jù)用戶的數(shù)據(jù),進(jìn)行處理后在返回給用戶忽冻。這時(shí)候,django采用jinja2語(yǔ)言編寫(xiě)動(dòng)態(tài)模板僧诚,jinja2會(huì)根據(jù)提供的數(shù)據(jù),替換掉html中的相應(yīng)部分.
- 先改造views.py文件:
# 創(chuàng)建一個(gè)用戶列表,預(yù)先存儲(chǔ)兩個(gè)數(shù)據(jù)
user_list = [{"user": "tom", "pwd": "123456"},
{"user": "bob", "pwd": "147258"},
]
def indexHtml(request):
"""
返回一個(gè)HTML文件,當(dāng)想渲染一個(gè)html文件時(shí),需要使用render方法進(jìn)行打包
"""
if request.method == "POST":
name = request.POST.get("userName", None)
pwd = request.POST.get("userPwd", None)
print("name={0},pwd={1}".format(name, pwd))
tem = {"user": name, "pwd": pwd}
user_list.append(tem)
return render(request, "index.html",{"data": user_list}) # 參數(shù)1固定,參數(shù)2:指定返回的html文件,參數(shù)3是后臺(tái)返回給瀏覽器的數(shù)據(jù)是一個(gè)字典,"data"鍵名為一個(gè)指針會(huì)被對(duì)應(yīng)到html中使用
- 再改造index.html文件:
<html>
<head>
<title>
文檔標(biāo)題
</title>
</head>
<body>
文檔內(nèi)容......
<h1>
用戶輸入
</h1>
<form action="/index/" method="post">
<input type="text" placeholder="請(qǐng)輸入您的用戶名" name="userName" />
<input type="password" placeholder="請(qǐng)輸入您的密碼" name="userPwd" />
<input type="submit" value="提交" />
</form>
<h1>
用戶已輸入的數(shù)據(jù)展示
</h1>
<table border="1">
<thead>
<th>
用戶名
</th>
<th>
密碼
</th>
</thead>
<tbody>
{# 注釋: jinja2的語(yǔ)法,下面表示一個(gè)for循環(huán),data是views的indexHtml函數(shù)傳遞過(guò)來(lái)的key值 ,在jinja2中旗扑,存在三種語(yǔ)法: 控制結(jié)構(gòu) {% %},變量取值 {{ }},注釋 {# #} #}
{% for line in data %}
<tr>
<td>
{{ line.user }}
</td>
<td>
{{ line.pwd }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
使用數(shù)據(jù)庫(kù)
上面我們雖然和用戶交互得很好慈省,但并沒(méi)有保存任何數(shù)據(jù),頁(yè)面一旦關(guān)閉边败,或服務(wù)器重啟,一切都將回到原始狀態(tài)笑窜。使用數(shù)據(jù)庫(kù)是毫無(wú)疑問(wèn)的,django通過(guò)自帶的ORM框架操作數(shù)據(jù)庫(kù)怖侦,并且自帶輕量級(jí)的sqlite3數(shù)據(jù)庫(kù)。下面我們來(lái)看一看:
- 首先是注冊(cè)app,修改settings.py,注冊(cè)它匾寝,你的數(shù)據(jù)庫(kù)就不知道該給哪個(gè)app創(chuàng)建表。然后我們?cè)趕ettings中艳悔,配置數(shù)據(jù)庫(kù)相關(guān)的參數(shù),如果使用自帶的sqlite抡锈,不需要修改。使用MySQL請(qǐng)參考:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cmdb',# 注冊(cè)新的模塊
]
# 默認(rèn)無(wú)需修改
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
- 再編輯models.py文件床三,也就是MTV中的M。
#只要修改了整個(gè)文件,需要執(zhí)行cmd命令"python manage.py makemigrations"和"python manage.py migrate"去修改sql文件
class UserInfo(models.Model):#該類必須繼承models.Model類
username = models.CharField(max_length=32, default=None)# 創(chuàng)建一個(gè)字段,長(zhǎng)度為32個(gè)字符
password = models.CharField(max_length=32, default=None)
接下來(lái)要在pycharm的teminal中通過(guò)命令創(chuàng)建數(shù)據(jù)庫(kù)的表了撇簿。有2條命令,分別是:python manage.py makemigrations
再輸入命令:python manage.py migrate
還可以 創(chuàng)建數(shù)據(jù)庫(kù)超級(jí)用戶汉嗽,在控制臺(tái)執(zhí)行以下命令python manage.py createsuperuser
,這里創(chuàng)建后可在url為admin下去登錄后臺(tái)(Django的默認(rèn)管理后臺(tái)),此外還注冊(cè)數(shù)據(jù)庫(kù)里的表格,在模塊目錄下的admin.py文件里注冊(cè)
from .models import UserInfo
admin.site.register(UserInfo)
- 修改views.py中的業(yè)務(wù)邏輯
from cmdb import models
def indexHtml(request):
"""
返回一個(gè)HTML文件,當(dāng)想渲染一個(gè)html文件時(shí),需要使用render方法進(jìn)行打包
"""
if request.method == "POST":
name = request.POST.get("userName", None)
pwd = request.POST.get("userPwd", None)
print("name={0},pwd={1}".format(name, pwd))
models.UserInfo.objects.create(username=name, password=pwd) # 添加數(shù)據(jù)到數(shù)據(jù)庫(kù)
users = models.UserInfo.objects.all() # 從數(shù)據(jù)庫(kù)中讀取所有行
# 若UserInfo中的字段名和html中使用的字段名對(duì)應(yīng)可省略下面的轉(zhuǎn)換操作
user_list = []
for user in users:#遍歷從數(shù)據(jù)庫(kù)中取出的數(shù)據(jù)轉(zhuǎn)換為待展示的字典格式
tem = {"user": user.username, "pwd": user.password}
user_list.append(tem)
print(user_list)
return render(request, "index.html",{"data": user_list}) # 參數(shù)1固定,參數(shù)2:指定返回的html文件,參數(shù)3是后臺(tái)返回給瀏覽器的數(shù)據(jù)是一個(gè)字典,"data"鍵名為一個(gè)指針會(huì)被對(duì)應(yīng)到html中使用
本文參考: