【python】-- Django

Django

Python的WEB框架有Django、Tornado、Flask 等多種,Django相較與其餘WEB框架其優點爲:大而全,框架自己集成了ORM、模型綁定、模板引擎、緩存、Session等諸多功能,能夠快速搭建高性能,優雅的網站。css

1、安裝啓動Django project

一、安裝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工程的目錄結構

三、運行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
manage.py 參數

 

2、Django 工程中的app、templates、static

 一、建立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'), #缺乏逗號,會報錯
)

 

 

3、Django實現用戶登錄、跳轉後臺小Demo示例:

一、在前面步驟的基礎上,在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>

 

4、Django的請求生命週期

一張圖描述上面Django示例中的請求生命週期:

相關文章
相關標籤/搜索