第十七 Django

1.安裝Django

1.1.安裝Django及升級pip

 

1.2.建立項目

1.3.項目說明

1.4.配置第一個項目

1.4.1.建立函數

from django.shortcuts import render,HttpResponse
import datetime

# Create your views here.

def showtime(request):
    cur_time=datetime.datetime.now()
    return HttpResponse(str(cur_time))

1.4.2.配置url

"""djone URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from cklsite import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('timer/',views.showtime)
]

1.4.3.啓動程序

$ python manage.py runserver

1.4.4.頁面訪問

啓動了8000端口html

輸入訪問路徑:python

2.模擬登錄驗證

2.1.先看看GET和POST的區別

http://www.javashuo.com/article/p-oxfvvfbb-cp.html正則表達式

2.2.登陸配置

2.2.1.views新增登陸方法

from django.shortcuts import render,HttpResponse
import datetime

# Create your views here.

def showtime(request):
    cur_time=datetime.datetime.now()
    return HttpResponse(str(cur_time))

def login(request):
    return render(request, "cklsite/login.html")

# HttpResponse返回字符串,render返回html

html的路徑在templates裏,這個設定在settings.pydjango

新增目錄:session

2.2.2.配置url

from django.contrib import admin
from django.urls import path
from cklsite import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('timer/',views.showtime),
    path('login/',views.login)
]

2.2.3.啓動請求頁面

get的提交請求,顯示在地址欄上了app

2.3.配置驗證

2.3.1.配置views

from django.shortcuts import render,HttpResponse
import datetime

# Create your views here.

def showtime(request):
    cur_time=datetime.datetime.now()
    return HttpResponse(str(cur_time))

def login(request):
    return render(request, "cklsite/login.html")

# HttpResponse返回字符串,render返回html

def validate(request):
    return HttpResponse("驗證成功")

2.3.2.配置url

from django.contrib import admin
from django.urls import path
from cklsite import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('timer/',views.showtime),
    path('login/',views.login),
    path('validate/',views.validate)
]

2.3.3.配置login提交路徑

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Home</title>
</head>
<body>
<h3>登陸頁面</h3>
<form action="http://127.0.0.1:8000/validate/">
    <p>姓名<input type="text" name="user"></p>
    <p>密碼<input type="password" name="pwd"></p>
    <input type="submit">
</form>
</body>
</html>

2.3.4.提交登陸

2.4.驗證的內容

2.4.1.驗證請求

當提交用戶名和密碼後:函數

def validate(request):
    print(request.GET)
    print(request.POST)
    return HttpResponse("驗證成功")

2.5.提交改成post

2.5.1.修改請求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Home</title>
</head>
<body>
<h3>登陸頁面</h3>
<form action="http://127.0.0.1:8000/validate/" method="post">
    <p>姓名<input type="text" name="user"></p>
    <p>密碼<input type="password" name="pwd"></p>
    <input type="submit">
</form>
</body>
</html>

2.5.2.提交請求

 2.5.3.關閉middleware的csft

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',
]

再次提交:post

#是由於驗證方法裏面的GET方法,修改成POST的測試

2.5.4.修改以下

def validate(request):
    # print(request.GET["user"])
    # print(request.POST)
    username=request.POST.get("user")
    password=request.POST.get("pwd")
    if username == 'ckl' and password == '123':
        return HttpResponse("驗證成功")
    else:
        return HttpResponse("驗證失敗咧")

2.5.5.登陸

3.關於URL

3.1.建立新的項目

3.2.添加url

"""djone URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from cklsite import views
from blog import views as bview

urlpatterns = [
    path('admin/', admin.site.urls),
    path('timer/',views.showtime),
    path('login/',views.login),
    path('validate/',views.validate),
    path('blog/article/2004/',bview.article_year)
]

3.3.添加views返回方法

from django.shortcuts import render,HttpResponse

# Create your views here.

def article_year(request):
    return HttpResponse("2004")

查看返回:url

#這樣的匹配寫死了,若是我要匹配2003呢?

導入url,對於路徑寫成正則表達式

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from cklsite import views
from blog import views as bview

urlpatterns = [
    path('admin/', admin.site.urls),
    path('timer/',views.showtime),
    path('login/',views.login),
    path('validate/',views.validate),
    url(r'^blog/article/\d+/',bview.article_year)
]

再次訪問:

3.4.有名分組

3.4.1.若是是用戶輸入年份,返回年份

思考:這時候就須要對年份的子串進行分組,以下:

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from cklsite import views
from blog import views as bview

urlpatterns = [
    path('admin/', admin.site.urls),
    path('timer/',views.showtime),
    path('login/',views.login),
    path('validate/',views.validate),
    url(r'^blog/article/(\d+)/',bview.article_year)
]

效果:

須要兩個參數,可是隻傳了一個,也就是:

url(r'^blog/article/(\d+)/',bview.article_year) #article_year(request,2045)

修改方法:

from django.shortcuts import render,HttpResponse

# Create your views here.

def article_year(request,year):
    return HttpResponse(str(year))

結果:

3.4.2.用戶輸入年月

編輯URL:

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from cklsite import views
from blog import views as bview

urlpatterns = [
    path('admin/', admin.site.urls),
    path('timer/',views.showtime),
    path('login/',views.login),
    path('validate/',views.validate),
    url(r'^blog/article/(\d+)/$',bview.article_year),
    url(r'^blog/article/(\d+)/(\d+)/$',bview.article_year_month) #分組兩個,函數須要兩個實參
]

編輯view

def article_year_month(request,year,month):
    return HttpResponse(year + month)

訪問:

#分組幾個,函數就須要幾個參數

3.4.3.URL匹配順序

URL匹配順序從上到下的,若是增長這樣的:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('timer/',views.showtime),
    path('login/',views.login),
    path('validate/',views.validate),
    url(r'^blog/article/(\d+)/$',bview.article_year),
    url(r'^blog/article/2008/$',bview.test),
    url(r'^blog/article/(\d+)/(\d+)/$',bview.article_year_month)
]

增長view

def test(request):
    return HttpResponse("test!")

訪問:

#沒法訪問到test,是由於test的路徑已經被以前的覆蓋了

3.5.無名分組

3.5.1.若是用戶輸入的年月沒有按順序,這時候如何解決?

有名分組解決

"""djone URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from cklsite import views
from blog import views as bview

urlpatterns = [
    path('admin/', admin.site.urls),
    path('timer/',views.showtime),
    path('login/',views.login),
    path('validate/',views.validate),
    url(r'^blog/article/(\d+)/$',bview.article_year),
    url(r'^blog/article/2008/$',bview.test),
    #url(r'^blog/article/(\d+)/(\d+)/$',bview.article_year_month),
    url(r'^blog/article/(?P<year_id>\d+)/(?P<month_id>\d+)/$',bview.article_year_month) #article_year_month(year_id=xx,month_id=xx)
]

修改方法:

def article_year_month(request,year_id,month_id):
    return HttpResponse(year_id + month_id)

訪問:

4.系統分發

當前全部的url都寫在總的url,若是有5個項目每一個項目有10個url,那麼就有50個url,解決辦法就是url分發

4.1.總的url引入分發的url

"""djone URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
from cklsite import views
from blog import views as bview

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^blog/',include('blog.urls'))
]

4.2.blog的url

from django.urls import path
from django.conf.urls import url,include
from blog import views as bview
#import view 這樣寫錯誤,由於當前文件非執行文件,因此程序沒法找到view
#真正的執行文件是manage.py,而其同級目錄沒有views,因此會報錯

urlpatterns = [
    url(r'^article/(\d+)/$',bview.article_year),
    url(r'^article/2008/$',bview.test),
    url(r'^article/(?P<year_id>\d+)/(?P<month_id>\d+)/$',bview.article_year_month) #article_year_month(year_id=xx,month_id=xx)
]

路徑以下,當前的manage下沒有view

運行結果:

5.反向解析

5.1.用戶登陸

5.1.1.登陸url

"""djone URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
from cklsite import views as ckl_views
from blog import views as bview

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/',ckl_views.login),
    url(r'^blog/',include('blog.urls'))
]

5.1.2.登陸方法

from django.shortcuts import render,HttpResponse
import datetime

def login(request):
    if request.method == "POST": #只須要一個方法,對請求的方式進行判斷
        user=request.POST.get("user")
        pwd=request.POST.get("pwd")
        return HttpResponse("login successfully!")
    return render(request,"cklsite/login.html")

5.1.3.登陸html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Home</title>
</head>
<body>
<h3>登陸頁面</h3>
<form action="/login/" method="post">
    <p>姓名<input type="text" name="user"></p>
    <p>密碼<input type="password" name="pwd"></p>
    <input type="submit">
</form>
</body>
</html>

5.1.4.登陸請求

5.2.反向解析

5.2.1.登陸url發生變化

from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
from cklsite import views as ckl_views
from blog import views as bview

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login.html/',ckl_views.login),
]

請求失敗:

#解決辦法:

修改login.html裏面的路徑:

<form action="/login/" method="post">

html若是有幾百個,那每一個都須要修改,這樣的話,效率過低,這時候就須要用到反射了

5.2.2.修改url

from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
from cklsite import views as ckl_views
from blog import views as bview

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login.html/',ckl_views.login,name="LOGIN")
]

5.2.3.修改html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Home</title>
</head>
<body>
<h3>登陸頁面</h3>
<form action="{% url 'LOGIN' %}" method="post">
    <p>姓名<input type="text" name="user"></p>
    <p>密碼<input type="password" name="pwd"></p>
    <input type="submit">
</form>
</body>
</html>

這裏{% url 'LOGIN' %} 是模板語法,render解析url,將LOGIN解析爲url對應的login.html

訪問測試:

6.其它方法

經常使用的請求方法:

request(請求對象):
    request.GET   get請求數據
    request.POST post請求數據
    request.POST.getlist() 請求多條數據
    request.method 請求方法
    request.path  請求路徑
    request.get_full_path() 請求全路徑

 

6.1.若是獲取多個值

6.1.1.獲取多選框內容html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Home</title>
</head>
<body>
<h3>登陸頁面</h3>
<form action="{% url 'LOGIN' %}" method="post">
    <p>姓名<input type="text" name="user"></p>
    <p>密碼<input type="password" name="pwd"></p>
    <p>
        愛好 <input type="checkbox" name="hobby" value="1">檯球
            <input type="checkbox" name="hobby" value="2">高爾夫
            <input type="checkbox" name="hobby" value="3">水球
    </p>
    <input type="submit">
</form>
</body>
</html>

6.1.2.方法

from django.shortcuts import render,HttpResponse
import datetime

def login(request):
    if request.method == "POST": #只須要一個方法,對請求的方式進行判斷
        user=request.POST.get("user")
        pwd=request.POST.get("pwd")
        hobby=request.POST.get("hobby")
        print("hobby:",hobby)
        return HttpResponse("login successfully!")
    return render(request,"cklsite/login.html")

6.1.3.請求頁面

可是,只獲取到一個值:

這時候須要getlist方法:

def login(request):
    if request.method == "POST": #只須要一個方法,對請求的方式進行判斷
        user=request.POST.get("user")
        pwd=request.POST.get("pwd")
        hobby=request.POST.getlist("hobby")
        print("hobby:",hobby)
        return HttpResponse("login successfully!")
    return render(request,"cklsite/login.html")

再次查看:

6.2.下拉選項框獲取多個值

6.2.1.html下拉選項框

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Home</title>
</head>
<body>
<h3>登陸頁面</h3>
<form action="{% url 'LOGIN' %}" method="post">
    <p>姓名<input type="text" name="user"></p>
    <p>密碼<input type="password" name="pwd"></p>
    <p>
        愛好 <input type="checkbox" name="hobby" value="1">檯球
            <input type="checkbox" name="hobby" value="2">高爾夫
            <input type="checkbox" name="hobby" value="3">水球
    </p>
    <select name="pro" id="" multiple size="3">
        <option value="11">陝西省</option>
        <option value="22">海南省</option>
        <option value="33">上海市</option>
    </select>
    <input type="submit">
</form>
</body>
</html>

6.2.2.方法

def login(request):
    if request.method == "POST": #只須要一個方法,對請求的方式進行判斷
        user=request.POST.get("user")
        pwd=request.POST.get("pwd")
        hobby=request.POST.getlist("hobby")
        print("hobby:",hobby)
        pro=request.POST.getlist("pro")
        print("pro:",pro)
        return HttpResponse("login successfully!")
    return render(request,"cklsite/login.html")

效果:

相關文章
相關標籤/搜索