Django基本配置


一、settings.py 文件配置

1. BASE_DIR

  用於綁定當前項目的絕對路徑 ( 動態計算出來的 ), 所有文件都可以依懶此路徑

2. DEBUG

  用於配置 Django 項目的啟用模式 , 取值 :

  1. True 表示開發環境中使用 調試模式 ( 用於開發中 )

  2. False 表示當前項目運行在生產環境中 ( 不啟用調試 )

3.ALLOWED_HOSTS

  設置允許訪問到本項目的網絡地址列表 , 取值 :

  1. [] 空列表 , 表示只有 127.0.0.1, localhost, '[::1]' 能訪問本項目
  2. ['*'] ,表示任何網絡地址都能訪問到當前項目\
  3. ['*.tedu.cn', 'weimingze.com'] 表示只有當前兩個主機能訪問當前項目

  注意 :

  如果要在局域網其它主機也能訪問此主機 , 啟動方式應使用如下模式 :python3 manage.py runserver 0.0.0.0:5000 # 指定網絡設備所有主機都可以通過 5000 端口訪問 ( 需加 ALLOWED_HOSTS = ['*'])

4.INSTALLED_APPS

  指定當前項目中安裝的應用列表

5. MIDDLEWARE

  用於注冊中間件

6. TEMPLATES

  用於指定模板的配置信息

7. DATABASES

  用於指定數據庫的配置信息

  支持SQLite 3(默認)、PostgreSQL 、MySQL、Oracle數據庫的操作

# 默認是SQLit 3 的配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# MySQL的配置

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',   #注意這里的數據庫應該以utf-8編碼
    'USER': 'xxx',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}

# 對於python3的使用者們還需要再加一步操作
# 由於Django內部連接MySQL時使用的是MySQLdb模塊,而python3中還無此模塊,所以需要使用pymysql來代替
  
# 如下設置放置的與project同名的配置的 __init__.py文件中
  
import pymysql
pymysql.install_as_MySQLdb()


# PostgreSQL配置
DATABASES = {
    'default': {
        'NAME': 'app_data',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'XXX',
        'PASSWORD': 'XXX'
    }


# Oracle配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'xe',
        'USER': 'a_user',
        'PASSWORD': 'a_password',
        'HOST': '',
        'PORT': '',
    }
}
數據庫配置文件

8. LANGUAGE_CODE

  用於指定語言配置

  取值 :

    • 英文 : "en-us"
    • 中文 : "zh-Hans"

9. TIME_ZONE

  用於指定當前服務器端時區

  取值 :

    • 世界標准時間 : "UTC"
    • 中國時區 : "Asia/Shanghai"

10. ROOT_URLCONF

  用於配置根級 url 配置 'mywebsite1.urls'

  如 :ROOT_URLCONF = 'mywebsite1.urls'

11. 靜態文件添加

  (1)靜態文件:不能與服務器端做動態交互的文件都是靜態文件

    如:圖片,css,js,音頻,視頻,html文件(部分)

  (2)在 settings.py 中配置一下兩項內容:

    1.配置靜態文件的訪問路徑

    • 通過哪個url地址找靜態文件
    • STATIC_URL = '/static/'
    • 說明:
      • 指定訪問靜態文件時是需要通過 /static/xxx或 127.0.0.1:8000/static/xxx
      • xxx 表示具體的靜態資源位置

    2.配置靜態文件的存儲路徑

    • 靜態文件在服務器端的保存位置
    • STATICFILES_DIRS=[ (os.path.join(BASE_DIR,'static'),    ]
# 首先在項目根目錄下創建static目錄
# 接着在settings.py 文件下添加
# 配置訪問路徑
STATIC_URL = '/static/'  # 默認已添加,使用靜態文件時的前綴
# 配置存儲路徑
STATICFILES_DIRS = (
        os.path.join(BASE_DIR,'static'), #行末的逗號不能漏
    )
# 這樣在template中就可以導入static目錄下的靜態文件啦
# 例:
<script src="/static/jquery-1.12.4.js"></script>

  (3)訪問靜態文件

    1.使用靜態文件的訪問路徑進行訪問

    • 訪問路徑: STATIC_URL=/static/
<img src="/static/images/lena.jpg">
<img src="http://127.0.0.1:8000/static/images/lena.jpg">

    2.通過 {% static %}標簽訪問靜態文件 {% static %}表示的就是靜態文件訪問路徑

    • 加載 static {% load static %}
    • 使用靜態資源時 語法:{% static '靜態資源路徑' %}
# file: url.py
from . import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^show_image', views.show_image)
]
- 視圖函數文件
# file: views.py
from django.shortcuts import render

def show_image(request):
    return render(request, "show_image.html")
路由配置文件
<html>
<head></head>
<body>
<h1>this is lena!</h1>
<img src="/static/images/lena.jpg">
<h1>this is templates lena!</h1>
{% load static %}
<img src="{% static 'images/lena.jpg' %}">
</body>
</html>
模板文件

二、urls.py路由系統文件配置

URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL模式以及要為該URL模式調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對於這個URL調用這段代碼,對於那個URL調用那段代碼。URL的加載是從配置文件中開始。

url 即統一資源定位符 Uniform Resource Locator

作用 :用來表示互聯網上某個資源的地址。

說明 :互聯網上的每個文件都有一個唯一的 URL ,它包含的信息指出文件的位置以及瀏覽器應該怎么處理它。

URL的一般語法格式為:

protocol :// hostname[:port] / path [?query][#fragment]
(帶方括號[ ] 的為可選項) :

說明 :

1.protocol(協議)

  • http 通過 HTTP 訪問該資源。 格式 HTTP://
  • https 通過安全的 HTTPS 訪問該資源。 格式 HTTPS://
  • file 資源是本地計算機上的文件。格式 : file:///

2.hostname(主機名)

  是指存放資源的服務器的域名系統 (DNS) 主機名、域名 或 IP 地址。

3.port(端口號)

  • 整數,可選,省略時使用方案的默認端口;
  • 各種傳輸協議都有默認的端口號,如 http 的默認端口為 80 。

4.path(路徑)

  由零或多個 “/” 符號隔開的字符串,一般用來表示主機上的一個目錄或文件地址。

5.query(查詢)

  可選,用於給動態網頁傳遞參數,可有多個參數,用 “&” 符號隔開,每個參數的名和值

  用 “=” 符號隔開。

6.fragment(信息片段)

  字符串,用於指定網絡資源中的片斷。

  例如:一個網頁中有多個名詞解釋,可使用 fragment 直接定位到某一名詞解釋。

路由地址

  • url地址中不看域名部分即為路由地址
  • 如 :http://www.tedu.com:8000/article/python.html的路由地址是 /article/python.html
  • 路由地址決定了服務器端如何處理這個請求

Django 中的 URL 路由配置

1. settings.py 中的 ROOT_URLCONF

ROOT_URLCONF = 'mywebsite1.urls'

  通過 ROOT_URLCONF 指定頂級 url 的配置

  默認存在於主文件夾內 urls.py 主路由配置文件

2.urls.py 主路由配置文件

# file : <項目名>/urls.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    ...
]

  說明:urlpatterns是一個 url() 實例的列表 .

  作用:該文件會包含 urlpatterns 的列表用於表示路由 - 視圖映射 , 通過 url() 表示具體映射

 3.url()函數

用於描述路由與視圖函數的對應關系

模塊:from django.conf.urls import url

語法 :url(regex, views, kwargs=None, name=None)

  • regex:字符串類型,匹配的請求路徑,允許是正則表達式
  • views: 指定路徑所對應的視圖處理函數的名稱
  • kwargs: 向視圖中傳遞的參數,如果沒有參數可以省略
  • name: 為地址起別名,在模板中地址反向解析時使用

注:

每個正則表達式前面的 r 表示 '\' 不轉義的原始字符串

當 urlpatterns 內有多個 url 對象時,按自上而下的順序進行配置,一但有路由與 url 匹配成功,則后面的所有 url 被忽略.

4.二級路由(lncluding)

如果映射 url 太多怎么辦,全寫一個在  urlpatterns 顯得繁瑣,so 二級路由應用而生.

使用二級路由也可以減少代碼冗余,使代碼更加簡潔易懂.

# 原始版本
from django.conf.urls import url
from . import views
 
urlpatterns = [
    url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/history/$', views.history),
    url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/edit/$', views.edit),
    url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/discuss/$', views.discuss),
    url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/permissions/$', views.permissions),
]
 
 
# 改進版本
from django.conf.urls import include, url
from . import views
 
urlpatterns = [
    url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/', include([
        url(r'^history/$', views.history),
        url(r'^edit/$', views.edit),
        url(r'^discuss/$', views.discuss),
        url(r'^permissions/$', views.permissions),
    ])),
]

5.添加額外的參數

URLconfs 有一個鈎子可以讓你加入一些額外的參數到view函數中.

from django.conf.urls import url
from . import views
   
urlpatterns = [
    url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]

#####################

def year_archive(request, foo):
    print(foo)
    return render(request, 'index.html')

在上面的例子中,如果一個請求為 /blog/2005/, Django 將會調用函數

views.year_archive(request, year='2005',foo='bar').

需要注意的是,當你加上參數時,對應函數views.year_archive必須加上一個參數,參數名也必須命名為 foo.

6.別名的使用

url(r'^index',views.index,name='bieming')

url中還支持name參數的配置,如果配置了name屬性,在模板的文件中就可以使用name值來代替相應的url值.

urlpatterns = [
    url(r'^index',views.index,name='bieming'),
    url(r'^admin/', admin.site.urls),
    # url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    # url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    # url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),

]
###################

def index(req):
    if req.method=='POST':
        username=req.POST.get('username')
        password=req.POST.get('password')
        if username=='alex' and password=='123':
            return HttpResponse("登陸成功")



    return render(req,'index.html')

#####################

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#     <form action="/index/" method="post">#}
{#     這里只要使用bieming即可代替/index #}
     <form action="{% url 'bieming' %}" method="post">
         用戶名:<input type="text" name="username">
         密碼:<input type="password" name="password">
         <input type="submit" value="submit">
     </form>
</body>
</html>
示例演示

三、視圖view

用於接收請求 , 處理請求並做出響應

視圖處理的函數的語法格式

def xxx(request[,其他參數...]):
    return 響應對象(HttpResponse對象)

示例:?建立一個小網站:

  • 輸入網址: http://127.0.0.1:8000, 在網頁中輸出 : 這是我的首頁
  • 輸入網址: http://127.0.0.1:8000/page1, 在網頁中輸出 : 這是編號為1的網頁
  • 輸入網址: http://127.0.0.1:8000/page2, 在網頁中輸出 : 這是編號為2的網頁
# file : <項目名>/urls.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^/', views.index_view),
    url(r'^page1$', views.page1_view),
    url(r'^page2$', views.page2_view),
]
路由配置文件urls.py
# file : <項目名>/views.py
from . import views
from django.http import HttpResponse

def index_view(request):
    return HttpResponse("這是首頁")
def page1_view(request):
    return HttpResponse("這是第1個頁面")
def page2_view(request):
    return HttpResponse("這是第2個頁面")
視圖處理函數views,py

(一)url 正則表達式命名分組 和 帶有參數的視圖函數

1.帶有分組的路由和視圖函數

在視圖函數內,可以用正則表達式分組 () 提取參數后用函數位置傳參傳遞給視圖函數

一個分組表示一個參數,多個參數需要使用多個分組,並且使用個 / 隔開

如:

  • http://127.0.0.1:8000/year/2018
  • http://127.0.0.1:8000/year/2019
  • http://127.0.0.1:8000/year/???? # 四位數字

分組:

示例

# file : <項目名>/urls.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^year/(\d{4})$', views.year_view),
    url(r'^date/(\d{4})/(\d+)/(\d+)$', views.date_view),
]
路由配置文件
# file : <項目名>/views.py
from django.http import HttpResponse

def year_view(request, year):
    return HttpResponse("年:" + year)  # 注: year綁定字符串 '2019'
def date_view(request, year, month, day):
    return HttpResponse(year + "" + month + "" + day + "")  # 注: year綁定字符串 '2019'
視圖處理文件

練習:定義一個路由的格式為:

http://127.0.0.1:8000/整數/操作字符串/整數

從路由中提取數據,做相應的操作后返回給瀏覽器

  • 輸入: 127.0.0.1:8000/100/add/200 頁面顯示結果:300
  • 輸入: 127.0.0.1:8000/100/sub/200 頁面顯示結果:-100
  • 輸入: 127.0.0.1:8000/100/mul/200 頁面顯示結果:20000
#路由配置文件
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^(\d+)/(\w{3})/(\d+)$', views.index_view),
]
-------------------------------
#視圖處理文件
def index_view(req,a,op,b):
  a = int(a)  # 轉為整數
  b = int(b)
  if op == 'add':
    return HttpResponse(str(a + b))
  elif op == 'sub':
    return HttpResponse(str(a - b))
  elif op == 'mul':
    return HttpResponse(str(a * b))
  else:
    return HttpResponse('不能運算!!!')
練習:定義格式

2.帶有命名分組 (?P<name>xxx) 的路由和視圖函數

  • 在url 的正則表達式中可以使用命名分組(捕獲分組)
  • 正表達式分名的名稱必須在view中以關鍵字傳參方式傳入,因此視圖函數必須能接收此參數
  • 每個捕獲的參數都作為一個普通的python字符串傳遞給視圖(不會做類型轉換)
  • urlpatterns中的每個正則表達式在第一次訪問它們時被編譯,這使得系統相當快

示例:

# file : <項目名>/urls.py
# 以下示例匹配
# http://127.0.0.1:8000/person/weimingze/35
# http://127.0.0.1:8000/person/shibowen/29
# http://127.0.0.1:8000/person/xiaowei/9
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^person/(?P<name>\w+)/(?P<age>\d{1,2})',views.person_view),
]
路由配置文件
# file : <項目名>/views.py
from . import views
from django.http import HttpResponse

def person_view(request, name, age):
    return HttpResponse("姓名:" + name + " 年齡:" + age)
視圖文件

練習:

  • 訪問地址:http://127.0.0.1:8000/birthday/四位數字/一到兩位數字/一到兩位數字
  • 最終輸出: 生日為: xxxx年xx月xx日
  • 如: 輸入網址: http://127.0.0.1:8000/birthday/2015/12/11 顯示為: 生日為:2015年12月11日 輸入網址: http://127.0.0.1:8000/birthday/2/28/2008 顯示為: 生日為:2008年2月28日
#路由配置文件
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^(\d{4})/(\d{1,2})/(\d{1,2})$', views.birthday_view),
]
#視圖配置文件
def birthday_view(req,year,month,day):
  year = int(year)  # 轉為整數
  month = int(month)
  day = int(day)
  return HttpResponse('顯示為:生日為'+str(year)+''+str(month)+''+str(day)+'')
練習

(二)http請求中產生兩個核心對象:

http請求:HttpRequest對象    指瀏覽器端通過HTTP協議發送給服務器端的數據

http響應:HttpResponse對象 指服務器端接收到請求后做相應的處理后再回復給瀏覽器端的數據

1.http請求

根據HTTP標准,HTTP請求可以使用多種請求方法。

  • HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法(最常用)
  • HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

HTTP1.1 請求詳述

序號 方法 描述
1 GET 請求指定的頁面信息,病返回實體主體.
2 HEAD 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
3 POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件).數據被包含在請求體中.POST請求可能會導致新的資源的建立和/或已有資源的修改.
4 PUT 從客戶端向服務器傳送的數據取代指定的文檔的內容.
5 DELETE 請求服務器刪除指定的頁面.
6 CONNECT HTTP/1.1協議中預留給能夠將連接改為管道方式的代理服務器
7 OPTIONS 允許客戶端查看服務器的性能.
8 TRACE 回顯服務器收到的請求,主要用於測試或診斷.

2.HttpRequest對象

當請求一個頁面時,Django 創建一個 HttpRequest對象包含原數據的請求。然后 Django 加載適當的視圖,通過 HttpRequest作為視圖函數的第一個參數。每個視圖負責返回一個HttpResponse目標。

HttpRequest屬性

path:字符串,表示請求的路由信息

path_info: URL字符串

method:字符串,表示HTTP請求方法,常用值:'GET'、'POST'

encoding:字符串,表示提交的數據的編碼方式

  • 如果為None則表示使用瀏覽器的默認設置,一般為'utf-8'
  • 這個屬性是可寫的,可以通過修改它來修改訪問表單數據使用的編碼,接下來對屬性的任何訪問將使用新的encoding值

GET:QueryDict查詢字典的對象,包含get請求方式的所有數據

POST:QueryDict查詢字典的對象,包含post請求方式的所有數據

FILES:類似於字典的對象,包含所有的上傳文件信息

COOKIES:Python字典,包含所有的cookie,鍵和值都為字符串

session:似於字典的對象,表示當前的會話,

body: 字符串,請求體的內容(POST或PUT)

environ: 字符串,客戶端運行的環境變量信息

scheme : 請求協議('http'/'https')

request.get_full_path() : 請求的完整路徑

request.get_host() : 請求的主機

request.META : 請求中的元數據(消息頭)

  • request.META['REMOTE_ADDR'] : 客戶端IP地址
  • request.META['HTTP_REFERER'] : 請求源地址
# file : urls.py
from django.conf.urls import url
from django.contrib import admin

from . import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^show_info', views.show_info),
]
路由配置文件
# file : views.py
from django.http import HttpResponse

def show_info(request):
    html = '<div>' + "請求方式: " + request.method + '</div>'
    html += '<div>' + "request.GET: " + str(dict(request.GET)) + '</div>'
    html += '<div>' + "request.POST: " + str(dict(request.POST)) + '</div>'
    html += '<div>' + "request.COOKIES: " + str(request.COOKIES) + '</div>'
    html += '<div>' + "客戶端瀏覽器協議是:request.scheme: " + request.scheme + '</div>'
    html += '<div>' + "客戶端的IP地址是:request.META['REMOTE_ADDR']: " + str(request.META['REMOTE_ADDR']) + '</div>'
    # html += '<div>' + "request.META:" + str(request.META) + '</div>'

    return HttpResponse(html)
視圖處理文件

3.HTTP響應

當瀏覽者訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在服務器發出請求。當瀏覽器接收並顯示網頁前,此網頁所在的服務器會返回一個包含HTTP狀態碼的信息頭用以響應瀏覽器的請求。

HTTP狀態碼的英文為HTTP Status Code。

下面是常見的HTTP狀態碼:

  • 200 - 請求成功
  • 301 - 資源(網頁等)被永久轉移到其它URL
  • 404 - 請求的資源(網頁等)不存在
  • 500 - 內部服務器錯誤

HTTP狀態碼分類:

HTTP狀態碼由三個十進制數字組成,第一個十進制數字定義了狀態碼的類型,后兩個數字沒有分類的作用。HTTP狀態碼共分為5種類型:

分類 分類描述
1** 信息,服務器收到請求,需要請求者繼續執行操作
2** 成功,操作被成功接收並處理
3** 重定向,需要進一步的操作以完成請求
4** 客戶端錯誤.請求包含語法錯誤或無法完成請求
5** 服務器錯誤,服務器在處理請求的過程中發生了錯誤

 4.HttpRespanse對象

對於HttpRequest對象來說,是由django自動創建的,但是,HttpResponse對象就必須我們自己創建。每個view請求處理方法必須返回一個HttpResponse對象。

構造函數格式:

  HttpResponse(content=響應體, content_type=響應體數據類型, status=狀態碼)

作用:向客戶端瀏覽器返回響應,同時攜帶響應體內容

參數:

content:表示返回的內容。

status_code:返回的HTTP響應狀態碼(默認為200)。

content_type:指定返回數據的的MIME類型(默認為"text/html")。瀏覽器會根據這個屬性,來顯示數據。如果是text/html,那么就會解析這個字符串,如果text/plain,那么就會顯示一個純文本。

常用的Content-Type如下:

  • 'text/html'(默認的,html文件)
  • 'text/plain'(純文本)
  • 'text/css'(css文件)
  • 'text/javascript'(js文件)
  • 'multipart/form-data'(文件提交)
  • 'application/json'(json傳輸)
  • 'application/xml'(xml文件)

注: 關鍵字MIME(Multipurpose Internet Mail Extensions)是指多用途互聯網郵件擴展類型。

 其它HttpResponse響應對象

類型 作用 狀態碼
HttpResponseRedirect 重定向 301
HttpResponseNotModified 未修改 304
HttpResponseBadRequest 錯誤請求 400
HttpResponseNotFound 沒有對應的資源 404
HttpResponseForbidden 請求被禁止 403
HttpResponseServerError 服務器錯誤 500

5. render()

在HttpResponse對象上擴展的常用方法:

  • 頁面渲染:render(推薦),render_to_response,
  • 頁面跳轉:redirect
  • locals:   可以直接將對應視圖函數中所有的變量傳給模板   

值得注意的是對於頁面渲染的方法中,render和render_to_response使用方法和功能類似,但是render功能更為強大,推薦使用

render(request, template_name, context=None, content_type=None, status=None, using=None)[source]

結合給定的模板與一個給定的上下文,返回一個字典HttpResponse在渲染文本對象

所需的參數

 template_name 一個模板的使用或模板序列名稱全稱。如果序列是給定的,存在於第一個模板將被使用。

可選參數

context    一組字典的值添加到模板中。默認情況下,這是一個空的字典。

content_type    MIME類型用於生成文檔。

status    為響應狀態代碼。默認值為200

using    這個名字一個模板引擎的使用將模板。

from django.shortcuts import render

def my_view(request):
    # View code here...
    return render(request, 'myapp/index.html', {
        'foo': 'bar',
    }, content_type='application/xhtml+xml')
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>姓名:{{ name }}</h1>
    <h2>年齡:{{ age }}</h2>
</body>
</html>
myhomepage.html
urlpatterns = [
    url(r'^test$', views.test_view),
]
def test_view(request):
    person = {
        'name': '王老師',
        'age': 35
    }
    # 方法2
    return render(request, 'myhomepage.html', person)
    # 方法1
    from django.template import loader
    # # t綁定模板對象 
    # t = loader.get_template("myhomepage.html") 
    # # 用模板生成html 
    # html = t.render(person) 
    # # 返回給瀏覽器 # return HttpResponse(html)

6.GET方式傳參

  GET請求方式中可以通過查詢(Query) 將數據傳遞給服務器

GET方式查詢參數獲取(查詢字符串 Query String)

客戶端傳遞參數給服務器端

  URL格式:網址?參數名1=值1&參數名1=值2

服務器端接收參數

  1.判斷resquest.method的值判斷請求方式是否是get請求

if request.method == 'GET':
    去往指定的模板進行顯示
else:
    接收其它請求提交的數據

  2.獲取客戶端請求GET請求提交的數據

    (1)語法:

      • request.GET['參數名']
      • request.GET.get('參數名','默認值')
      • request.GET.getlist('參數名')

    (2)能夠產生get請求方式的場合    

      • 地址欄手動輸入, 如: http://www.sina.com.cn/?a=100&b=200
      • <a href="地址?參數=值&參數=值">
      • 表單中的method為get
<form method='get' action="/user/login">
    姓名:<input type="text" name="uname">
</form>

說明:一般查詢字符串的大小會受到瀏覽器的的限制(不建議超過2048字節)

練習:?

  • 訪問地址:http://127.0.0.1:8000/sum?start=數字&stop=數字&step=數字
  • 輸出結果為sum(range(start, step, stop)) 和:
  • 如:
    • 輸入網址: http://127.0.0.1:8000/sum?start=1&stop=101&step=1
    • 頁面顯示: 結果: 5050
    • 輸入網址: http://127.0.0.1:8000/sum?stop=101&step=2
    • 頁面顯示: 結果: 2500
    • 輸入網址: http://127.0.0.1:8000/sum?start=1&stop=101&step=2
    • 頁面顯示: 結果: 2550
#路由配置文件
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^sum$', views.sum_view),
]
#視圖配置文件
def sum_view(req):
  if req.method == 'GET':
    start = req.GET.get('start', '0')
    stop = req.GET['stop']
    step = req.GET.get('step', '1')
    start, stop, step = int(start), int(stop), int(step)
    res = sum(range(start, stop, step))
  return HttpResponse('計算結果為:%d' % res)
練習

7.POST傳遞參數的獲取

  客戶端通過表單等POST請求將數據傳遞給服務器端,如:

<form method='post' action="/user/login">
    姓名:<input type="text" name="username">
</form>

  服務器端接收參數:通過 request.method 來判斷是否為POST請求,如:

if request.method == 'POST':
    處理 POST 請求的數據並響應
else:
    處理非 POST 請求的響應

   使用post方式接收客戶端數據

    語法

    • request.POST['參數名']
    • request.POST.get('參數名','')
    • request.POST.getlist('參數名')

  取消csrf驗證,否則Django將會拒絕客戶端發來的POST請求

    取消 csrf 驗證

      刪除 settings.py 中 MIDDLEWARE 中的 CsrfViewsMiddleWare 的中間件

MIDDLEWARE = [
    ...
    # 'django.middleware.csrf.CsrfViewMiddleware',
    ...
]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM