Python的WEB框架有Django、Tornado、Flask 等多種,Django相較與其餘WEB框架其優點爲:大而全,框架自己集成了ORM、模型綁定、模板引擎、緩存、Session等諸多功能,能夠快速搭建高性能,優雅的網站。css
一、安裝html
pip3 install django
ps:python版本爲3.6 Django版本爲2.0.2python
二、建立Django工程jquery
django-admin startproject 【project_name】
django-admin startproject 【工程名稱】 project_1 - project_1 # 對整個程序進行配置 - init - settings # 配置文件 - url # URL對應關係 - wsgi # 遵循WSIG規範,uwsgi + nginx - manage.py # 管理Django程序:
三、運行Django servernginx
python3 manage.py runserver 127.0.0.1:8000 #server爲0.0.0.0:8000時,意思就是監聽全部ip的8000端口
其餘經常使用manage.py參數:django
python3 manage.py runserver 0.0.0.0
python3 manage.py startapp appname
python3 manage.py syncdb
python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py createsuperuser
一、建立app:瀏覽器
cd Django工程路徑 python3 manage.py startapp app_name #app_name爲建立app的名稱
app的目錄結構:緩存
二、新建模板目錄templatessession
2.一、直接在Django工程下新建一個名爲templates的目錄,用以存放如:home.html、login.html模板。app
2.二、在工程下的settings配置模塊路徑(方便app中views的業務代碼提取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', ], }, }, ]
三、新建靜態目錄static
3.一、直接在Django工程下新建一個名爲static的目錄,用以存放如:commons.css、jquery-1.12.4.js文件。
3.二、配置靜態目錄路徑(否則瀏覽器在請求時,沒法get到靜態資源,從而沒法對HTML模板進行渲染):
STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), #缺乏逗號,會報錯 )
一、在前面步驟的基礎上,在settings中註釋掉CSRF(關閉跨站請求僞造,方便進行演示,後面博文會仔細介紹):
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
二、在urls.py中定義路由(網址關係映射)規則:
from django.conf.urls import url from django.contrib import admin from cmdb import views #cmdb是本身定義的Django APP名稱 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r"^home", views.home), url(r"^login", views.login), # 若是login路徑後面不添加/,要確保html form表單中的路徑也不添加/(或者同時添加),否則會報錯 ]
三、在views.py中定義視圖函數:
# Create your views here. from django.shortcuts import HttpResponse from django.shortcuts import render # 返回用戶響應內容時更加優雅,避免有多個頁面須要返回時一次次open html讀取的資源消耗 from django.shortcuts import redirect # 重定向 # 基礎版login函數 # def login(request): # # with open("templates/login.html", "r", encoding="utf-8") as f: # # data = f.read() # # return HttpResponse(data) # return render(request, "login.html") # 可經過render函數代替上面open HTML模板讀取數據,便捷,優雅,節省開銷 # 增強版login函數 def login(request): # request參數:包含客戶端發過來的全部信息 , error_msg = "" if request.method == "POST": # 獲取用戶經過post提交過來的數據 # request.GET.get('',None) # 也能夠得到get請求中的參數 user = request.POST.get("user", None) # 不要經過request.POST["user"]獲取用戶名,當key發生改變時,獲取不到值就會報錯 password = request.POST.get("pwd", None) if user == "root" and password == "123": return redirect("/home") else: error_msg = "user_name or password error" return render(request, "login.html", {"error_msg": error_msg}) # render 函數中的第三個參數是用於賦值給HTML模板語言中定義的變量 # 基礎版home函數 # def home(request): # return HttpResponse("<h1>hello cmDB</h1>") USER_LIST = [ {"username": "aaa", "email": "aaa@163.com", "gender": "men"}, {"username": "bbb", "email": "bbb@163.com", "gender": "men"}, {"username": "ccc", "email": "ccc@163.com", "gender": "men"} ] # 增強版home函數 def home(request): if request.method == "POST": u = request.POST.get("username", None) e = request.POST.get("email", None) g = request.POST.get("gender", None) temp = {"username": u, "email": e, "gender": g} USER_LIST.append(temp) return render(request, "home.html", {"user_list": USER_LIST})
四、在templates中定義兩個演示模板
login.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/commons.css" /> <style> label{ width: 80px; text-align: right; display: inline-block; } </style> </head> <body> <form action="/login" method="post"> <p> <label for="username">用戶名:</label> <input id="username" name="user" type="text" /> </p> <p> <label for="password">密碼:</label> <input id="password" name="pwd" type="password" /> <input type="submit" value="提交" /> <span style="color: red;">{{ error_msg }}</span> <!--error_msg就是views中render函數第三個參數傳遞的值--> </p> </form> <script src="/static/jquery-1.12.4.js"></script> </body> </html>
home.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body style="margin: 0"> <div style="height: 48px;background-color: #dddddd"></div> <div> <form action="/home" method="post"> <input type="text" name="username" placeholder="用戶名" /> <input type="text" name="email" placeholder="郵箱"/> <input type="text" name="gender" placeholder="性別"/> <input type="submit" value="添加" /> </form> </div> <div> <table> {% for row in user_list %} <!--定義一個for循環,user_list就是views中render函數第三個參數傳遞的值--> <tr> <td>{{ row.username }}</td> <td>{{ row.gender }}</td> <td>{{ row.email }}</td> </tr> {% endfor %} <!--結束for循環--> </table> </div> </body> </html>
一張圖描述上面Django示例中的請求生命週期: