我的簡書:http://www.itdecent.cn/u/c91e642c4d90
我的CSDN:http://blog.csdn.net/wo_ha
我的GitHub:https://github.com/chuanqiLjp
我的個人博客:https://chuanqiljp.github.io/
版權(quán)聲明:商業(yè)轉(zhuǎn)載請聯(lián)系我獲得授權(quán),非商業(yè)轉(zhuǎn)載請在醒目位置注明出處。
安裝Python的環(huán)境
到Python官網(wǎng)下載,然后就是正常的軟件安裝,安裝時記得勾選 Add Python 3.6 to PATH。在cmd中輸入python顯示了安裝的版本號則表示安裝成功,我的版本號為 3.7.1,
安裝Python集成開發(fā)環(huán)境Pycharm
- 到Pycharm的官網(wǎng)下載Professional專業(yè)版并安裝
- 激活,打開路徑
C:\Windows\System32\drivers\etc,修改host文件,在末尾追加域名0.0.0.0 account.jetbrains.com,訪問lanyus地址:http://idea.lanyus.com/ 點擊獲得注冊碼,打開Pycharm選中Activation code 將注冊碼復(fù)制進去就可以了激活,參考文章: https://blog.csdn.net/justszh/article/details/81484802
使用Pycharm創(chuàng)建Django工程
本文以下部分參考Django2.1新手圖文入門教程
環(huán)境: windows7,Pycharm2018.3.3(必須專業(yè)版),Python3.7.1,Django2.1.5
-
Create New Project ---> Django --->填寫項目名稱--->create 如下圖所示
使用Pycharm創(chuàng)建Django工程1
工程的目錄結(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,此時會在工程根目錄下創(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編寫URL的處理邏輯
from django.shortcuts import HttpResponse # 導(dǎo)入HTTP響應(yīng)類
def helloDjango(request): # request參數(shù)必須有,類似self的默認規(guī)則,名字可以修改.他封裝了用戶請求的所有內(nèi)容
return HttpResponse("Hello Diango world ~~~~~ ") #在django的響應(yīng)中不能直接返回字符串,需由HttpResponse封裝
注冊URL到urls.py路由文件中
from cmdb import views # 先導(dǎo)入cmdb模塊的views文件
urlpatterns = [
path('admin/', admin.site.urls),
path(r'hello', views.helloDjango),#注冊一個新的url,參數(shù)1表示url的名稱,參數(shù)2表示執(zhí)行的業(yè)務(wù)邏輯的函數(shù)
]
通過上面兩個步驟,我們將hello這個url指向了views里的helloDjango()函數(shù),它接收用戶請求,并返回一個“hello ...”字符串。至此,一個最簡單的Django程序就寫好了,此時運行一下如果沒有報錯就可以在瀏覽器打開鏈接http://127.0.0.1:8000/hello看到輸出的字符串了,如下圖


返回一個Html文件
1.在templates文件夾下創(chuàng)建index.html文件并編寫如下內(nèi)容
<html>
<head>
<title>文檔標(biāo)題</title>
</head>
<body>
文檔內(nèi)容......
</body>
</html>
- 在views.py中編寫業(yè)務(wù)邏輯
def indexHtml(request):
"""
返回一個HTML文件,當(dāng)想渲染一個html文件時,需要使用render方法進行打包
"""
return render(request, "index.html") # 參數(shù)1固定,參數(shù)2:指定返回的html文件
- 在urls.py注冊url地址
path(r'index/',views.indexHtml),#url名稱若為文件需要在末尾加斜杠,該url的業(yè)務(wù)邏輯為views.indexHtml函數(shù)
path(r'', views.indexHtml), # 默認的主頁
其實在settings.py的TEMPLATES字典的DIRS字段中指明了html文件存放的目錄,可以修改,一般默認就行了
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)文件(待驗證)
我們已經(jīng)可以將html文件返還給用戶了,但是還不夠,前端三大塊,html、css、js還有各種插件,它們齊全才是一個完整的頁面。在django中,一般將靜態(tài)文件放在static目錄中。接下來,在mysite中新建個static目錄。

你的CSS,JS和各種插件都可以放置在這個目錄里。
為了讓django找到這個目錄,依然需要對settings進行配置:

同樣,在index.html文件中,可以引入js文件了:

重新啟動web服務(wù),刷新瀏覽器,查看結(jié)果。
接收用戶發(fā)送的數(shù)據(jù)
上面,我們將一個要素齊全的html文件返還給了用戶瀏覽器。但這還不夠,因為web服務(wù)器和用戶之間沒有動態(tài)交互。下面我們設(shè)計一個表單,讓用戶輸入用戶名和密碼,提交給index這個url,服務(wù)器將接收到這些數(shù)據(jù)。
- 先修改index.html文件,注意action屬性不要寫錯
<html>
<head>
<title>
文檔標(biāo)題
</title>
</head>
<body>
文檔內(nèi)容......
<h1>
用戶輸入
</h1>
<form action="/index/" method="post">
<input type="text" placeholder="請輸入您的用戶名" name="userName" />
<input type="password" placeholder="請輸入您的密碼" name="userPwd" />
<input type="submit" value="提交" />
</form>
</body>
</html>
- 修改views.py
def indexHtml(request):
"""
返回一個HTML文件,當(dāng)想渲染一個html文件時,需要使用render方法進行打包
"""
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)閉跨域保護,修改settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',#跨站請求保護機制,將它關(guān)閉。
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
返回動態(tài)頁面
收到了用戶的數(shù)據(jù),但返回給用戶的依然是個靜態(tài)頁面,通常我們會根據(jù)用戶的數(shù)據(jù),進行處理后在返回給用戶。這時候,django采用jinja2語言編寫動態(tài)模板,jinja2會根據(jù)提供的數(shù)據(jù),替換掉html中的相應(yīng)部分.
- 先改造views.py文件:
# 創(chuàng)建一個用戶列表,預(yù)先存儲兩個數(shù)據(jù)
user_list = [{"user": "tom", "pwd": "123456"},
{"user": "bob", "pwd": "147258"},
]
def indexHtml(request):
"""
返回一個HTML文件,當(dāng)想渲染一個html文件時,需要使用render方法進行打包
"""
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是后臺返回給瀏覽器的數(shù)據(jù)是一個字典,"data"鍵名為一個指針會被對應(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="請輸入您的用戶名" name="userName" />
<input type="password" placeholder="請輸入您的密碼" name="userPwd" />
<input type="submit" value="提交" />
</form>
<h1>
用戶已輸入的數(shù)據(jù)展示
</h1>
<table border="1">
<thead>
<th>
用戶名
</th>
<th>
密碼
</th>
</thead>
<tbody>
{# 注釋: jinja2的語法,下面表示一個for循環(huán),data是views的indexHtml函數(shù)傳遞過來的key值 ,在jinja2中,存在三種語法: 控制結(jié)構(gòu) {% %},變量取值 {{ }},注釋 {# #} #}
{% for line in data %}
<tr>
<td>
{{ line.user }}
</td>
<td>
{{ line.pwd }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>

使用數(shù)據(jù)庫
上面我們雖然和用戶交互得很好,但并沒有保存任何數(shù)據(jù),頁面一旦關(guān)閉,或服務(wù)器重啟,一切都將回到原始狀態(tài)。使用數(shù)據(jù)庫是毫無疑問的,django通過自帶的ORM框架操作數(shù)據(jù)庫,并且自帶輕量級的sqlite3數(shù)據(jù)庫。下面我們來看一看:
- 首先是注冊app,修改settings.py,注冊它,你的數(shù)據(jù)庫就不知道該給哪個app創(chuàng)建表。然后我們在settings中,配置數(shù)據(jù)庫相關(guān)的參數(shù),如果使用自帶的sqlite,不需要修改。使用MySQL請參考:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cmdb',# 注冊新的模塊
]
# 默認無需修改
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
- 再編輯models.py文件,也就是MTV中的M。
#只要修改了整個文件,需要執(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)建一個字段,長度為32個字符
password = models.CharField(max_length=32, default=None)
接下來要在pycharm的teminal中通過命令創(chuàng)建數(shù)據(jù)庫的表了。有2條命令,分別是:python manage.py makemigrations

再輸入命令:python manage.py migrate

還可以 創(chuàng)建數(shù)據(jù)庫超級用戶,在控制臺執(zhí)行以下命令python manage.py createsuperuser,這里創(chuàng)建后可在url為admin下去登錄后臺(Django的默認管理后臺),此外還注冊數(shù)據(jù)庫里的表格,在模塊目錄下的admin.py文件里注冊
from .models import UserInfo
admin.site.register(UserInfo)
- 修改views.py中的業(yè)務(wù)邏輯
from cmdb import models
def indexHtml(request):
"""
返回一個HTML文件,當(dāng)想渲染一個html文件時,需要使用render方法進行打包
"""
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ù)庫
users = models.UserInfo.objects.all() # 從數(shù)據(jù)庫中讀取所有行
# 若UserInfo中的字段名和html中使用的字段名對應(yīng)可省略下面的轉(zhuǎn)換操作
user_list = []
for user in users:#遍歷從數(shù)據(jù)庫中取出的數(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是后臺返回給瀏覽器的數(shù)據(jù)是一個字典,"data"鍵名為一個指針會被對應(yīng)到html中使用
本文參考:
