Python_Web_使用Django搭建Web服務(wù)器

我的簡(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

  1. Pycharm的官網(wǎng)下載Professional專業(yè)版并安裝
  2. 激活,打開(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

  1. Create New Project ---> Django --->填寫(xiě)項(xiàng)目名稱--->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,此時(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)如圖


使用Pycharm創(chuàng)建Django工程2

在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看到輸出的字符串了,如下圖

使用Pycharm創(chuàng)建Django工程3
使用Pycharm創(chuàng)建Django工程4

返回一個(gè)Html文件

1.在templates文件夾下創(chuàng)建index.html文件并編寫(xiě)如下內(nèi)容

<html>
<head>
    <title>文檔標(biāo)題</title>
</head>
<body>
文檔內(nèi)容......
</body>
</html>
  1. 在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文件
  1. 在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目錄偶芍。


picture1

你的CSS,JS和各種插件都可以放置在這個(gè)目錄里德玫。

為了讓django找到這個(gè)目錄,依然需要對(duì)settings進(jìn)行配置:


picture2

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

picture3

重新啟動(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ù)成福。

  1. 先修改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>
  1. 修改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文件
  1. 關(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)部分.

  1. 先改造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中使用
  1. 再改造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>
picture5

使用數(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)看一看:

  1. 首先是注冊(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'),
    }
}
  1. 再編輯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

image

再輸入命令:python manage.py migrate

image

還可以 創(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)
  1. 修改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中使用

本文參考:

Django新手圖文教程
在pycharm中創(chuàng)建Django項(xiàng)目流程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饼暑,一起剝皮案震驚了整個(gè)濱河市弓叛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竭望,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闭专,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡影钉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)平委,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人廉赔,你說(shuō)我怎么就攤上這事±” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵馏艾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我琅摩,道長(zhǎng),這世上最難降的妖魔是什么房资? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮志膀,結(jié)果婚禮上鳖擒,老公的妹妹穿的比我還像新娘。我一直安慰自己蒋荚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布期升。 她就那樣靜靜地躺著,像睡著了一般播赁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上容为,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音坎背,去河邊找鬼。 笑死得滤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的懂更。 我是一名探鬼主播眨业,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼龄捡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了墅茉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤就斤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后洋机,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绷旗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衔肢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隅忿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邦尊,到底是詐尸還是另有隱情,我是刑警寧澤蝉揍,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站又沾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捍掺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一挺勿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧不瓶,春花似錦、人聲如沸蚊丐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昭娩。三九已至,卻和暖如春栏渺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锐涯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纹腌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓莱褒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親覆劈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容