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

我的簡書: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

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

  1. 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)如圖


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

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

返回一個Html文件

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

<html>
<head>
    <title>文檔標(biāo)題</title>
</head>
<body>
文檔內(nèi)容......
</body>
</html>
  1. 在views.py中編寫業(yè)務(wù)邏輯
def indexHtml(request):
    """
    返回一個HTML文件,當(dāng)想渲染一個html文件時,需要使用render方法進行打包
    """
    return render(request, "index.html")  # 參數(shù)1固定,參數(shù)2:指定返回的html文件
  1. 在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目錄。


picture1

你的CSS,JS和各種插件都可以放置在這個目錄里。

為了讓django找到這個目錄,依然需要對settings進行配置:


picture2

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

picture3

重新啟動web服務(wù),刷新瀏覽器,查看結(jié)果。

接收用戶發(fā)送的數(shù)據(jù)

上面,我們將一個要素齊全的html文件返還給了用戶瀏覽器。但這還不夠,因為web服務(wù)器和用戶之間沒有動態(tài)交互。下面我們設(shè)計一個表單,讓用戶輸入用戶名和密碼,提交給index這個url,服務(wù)器將接收到這些數(shù)據(jù)。

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

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

使用數(shù)據(jù)庫

上面我們雖然和用戶交互得很好,但并沒有保存任何數(shù)據(jù),頁面一旦關(guān)閉,或服務(wù)器重啟,一切都將回到原始狀態(tài)。使用數(shù)據(jù)庫是毫無疑問的,django通過自帶的ORM框架操作數(shù)據(jù)庫,并且自帶輕量級的sqlite3數(shù)據(jù)庫。下面我們來看一看:

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

image

再輸入命令:python manage.py migrate

image

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

本文參考:

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

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

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

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