python--Django(三)視圖

Django的視圖

不一樣於其餘語言的MVC模式,Django採用的是MVT模式,即Model、View、Template,這裏的View其實質就是其餘語言中的Controller(emmm.....),而Template其實就是html文件,因此原理其實大同小異,這裏就很少贅述html

配置URL

Django中的默認路由在項目主目錄下的urls.py中,基本路由配置以下所示:python

from django.urls import path, include
from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
    path('', include('test.urls'))                                                                                # 引入不一樣應用的url配置
]

以上爲普通匹配方式,其中有幾種可以限制路由中參數類型的函數能夠使用。laravel

  • str: 匹配除路徑分隔符'/'以外的任何非空字符串
  • int:匹配零或任何正整數
  • slug:匹配由ASCII字母或數字組成的任何slug字符串,以及連字符'-'和下劃線'_'字符
  • uuid:匹配格式化的UUID
  • path:匹配任何非空字符串,包括路徑分隔符 '/'

使用正則表達式匹配ajax

from django.urls import path, re_path

from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),                                                                        # ?P<year>意爲指定參數的名字
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
]

URL起別名
此例相對於PHP laravel框架中的route()用法,具體用法以下正則表達式

# 路由中的配置
from django.urls import path, include
from test import views

urlpatterns = [
    path('', views.index, name='test-index'),
    path('/<int:num>', views.getNum)
    path('', include('test.urls', namespace = 'test'))            #爲include起別名
]

# 在template中的運用
<a href="{% url 'test-index' 此處能夠跟參數 %}"></a>

# 在views中的運用
from django.http import HttpResponseRedirect
from django.urls import reverse

def redirect_to_year(request):
    year = 2006                                                                                                                                # 參數
    return HttpResponseRedirect(reverse('test-index', args=(year,)))

HttpRequest對象

屬性django

  • path:一個字符串,表示請求的頁面的完整路徑,不包含域名
  • method:一個字符串,表示請求使用的HTTP方法,經常使用值包括:'GET'、'POST'
  • encoding:一個字符串,表示提交的數據的編碼方式
    • 若是爲None則表示使用瀏覽器的默認設置,通常爲utf-8
    • 這個屬性是可寫的,能夠經過修改它來修改訪問表單數據使用的編碼,接下來對屬性的任何訪問將使用新的encoding值
  • GET:一個相似於字典的對象,包含get請求方式的全部參數(QueryDict對象)
  • POST:一個相似於字典的對象,包含post請求方式的全部參數(QueryDict對象)
  • FILES:一個相似於字典的對象,包含全部的上傳文件(QueryDict對象)
  • COOKIES:一個標準的Python字典,包含全部的cookie,鍵和值都爲字符串
  • session:一個既可讀又可寫的相似於字典的對象,表示當前的會話,只有當Django 啓用會話的支持時纔可用。
    方法
  • is_ajax():若是請求是經過XMLHttpRequest發起的,則返回True

QueryDict對象
QueryDict對象定義在django.http.QueryDict,與python字典不一樣,QueryDict類型的對象用來處理同一個鍵帶有多個值的狀況,能夠經過方法get()來獲取值json

  • 只能獲取鍵的一個值
  • 若是一個鍵同時擁有多個值,獲取最後一個值
dict.get('鍵名',默認值)
dict['鍵名']

另外還能夠經過方法getlist()將鍵的值以列表的形式返回瀏覽器

dict.getlist('鍵名',默認值)

HttpResponse對象

屬性緩存

  • content:表示返回的內容,字符串類型
  • charset:表示response採用的編碼字符集,字符串類型
  • status_code:響應的HTTP響應狀態碼
  • content-type:指定輸出的MIME類型

方法cookie

  • init :使用頁內容實例化HttpResponse對象
  • write(content):以文件的方式寫
  • flush():以文件的方式輸出緩存區
  • set_cookie(key, value='', max_age=None, expires=None):設置Cookie
    • key、value都是字符串類型
    • max_age是一個整數,表示在指定秒數後過時
    • expires是一個datetime或timedelta對象,會話將在這個指定的日期/時間過時,注意datetime和timedelta值只有在使用PickleSerializer時纔可序列化
    • max_age與expires二選一
    • 若是不指定過時時間,則兩個星期後過時
  • delete_cookie(key):刪除指定的key的Cookie,若是key不存在則什麼也不發生

重定向HttpResponseRedirect

from django.http import HttpResponse,HttpResponseRedirect
def index(request):
    return HttpResponseRedirect('index/')

# 反向解析
from django.core.urlresolvers import reverse

def index(request):
    return HttpResponseRedirect(reverse('booktest:index2', args=(1,)))

返回json對象JsonResponse

from django.http import JsonResponse

def index2(requeset):
    return JsonResponse({'name': 'abc'})

渲染模版render

from django.shortcuts import render

def index(request):
    return render(request, 'booktest/index.html', {'h1': 'hello'})

重定向redirect

from django.shortcuts import redirect
from django.core.urlresolvers import reverse

def index(request):
    return redirect(reverse('booktest:index2'))

session的使用

使用session

  • request.session.get(key, default=None):根據鍵獲取會話的值
  • request.session.clear():清除全部會話
  • request.session.flush():刪除當前的會話數據並刪除會話的Cookie
  • del request.session['member_id']:刪除會話

會話過時時間

  • set_expiry(value):設置會話的超時時間
  • 若是沒有指定,則兩個星期後過時
  • 若是value是一個整數,會話將在values秒沒有活動後過時
  • 若果value是一個timedelta對象,會話將在當前時間加上這個指定的日期/時間過時
  • 若是value爲0,那麼用戶會話的Cookie將在用戶的瀏覽器關閉時過時
  • 若是value爲None,那麼會話永不過時
相關文章
相關標籤/搜索