什麼是根目錄:就是沒有路徑,只有域名、。url(r'^$')html
補充一張關於wsgiref模塊的圖片python
Django的MTV 分別表明 : 正則表達式
Model (模型) : 和數據庫相關的 , 負責業務對象與數據的對象(ORM)shell
Template(模板) : 放全部的 html 文件 數據庫
模板語法 : 目的是將變量 (數據庫的內容) 如何巧妙的嵌入到HTML 頁面中django
View (視圖) : 負責業務邏輯 , 並在適當的時候調用Mode 和 Templatecookie
此外 , Django還有一個 URL分發器 , 他的做用是將一個個URL 的頁面請求分別發給不一樣的Views處理 , Views 在調用相應的Model 和 Template session
pip3 install django
django-admin.py startproject 項目名稱
例如 :
django-admin.py startproject mysite
建立成功後會產生這樣的一個工程 , 目錄結構以下 : app
manage.py ---------啓動文件 (Django項目裏面的工具 , 經過他能夠調用Django shell 的數目和數據庫等)函數
settings.py -------------- 包含了項目的一些設置 , 包括數據庫信息 , 吊事標誌以及其餘一些工做的變量
urls.py ------------------- 路徑與視圖函數的映射關係
python3 managy.py startapp blog(應用名稱)
建立成功後會生成這樣一個工程。目錄結構以下:
python3 manage.py runserver 8080
這樣咱們的django就啓動起來了!當咱們訪問:http://127.0.0.1:8080/時就能夠看到:
python3 manage.py makemigrations
python3 manage.py migrate
6
七、
八、
九、
十、待續
URL配置(URLconf) 就像Django所支撐網站的目錄 , 它的本質是URL與要該URL調用的視圖函數之間的映射表 ;
你就是以這種方式告訴Django , 對於這個URL調用這段代碼 , 對於那個URL調用那麼短代碼,
urlpatterns = [
url(正則表達式,views視圖函數,參數,別名),
]
參數說明 :
一個正則表達式字符串
一個可調用對象 , 一般爲一個視圖函數或一個指定視圖函數路徑的字符串
可選的要傳遞給視圖函數的默認參數(字典形式)
一個可選的name參數
from django.conf.urls import url from . import views urlpatterns = [ 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), ]
''' NOTE: 一、一旦匹配成功則再也不繼續 二、若要從URL 中捕獲一個值,只須要在它周圍放置一對圓括號。 三、不須要添加一個前導的反斜槓,由於每一個URL 都有。例如,應該是^articles 而不是 ^/articles。 四、每一個正則表達式前面的'r' 是可選的可是建議加上。 一些請求的例子: /articles/2005/3/ 不匹配任何URL 模式,由於列表中的第三個模式要求月份應該是兩個數字。 /articles/2003/ 將匹配列表中的第一個模式不是第二個,由於模式按順序匹配,第一個會首先測試是否匹配。 /articles/2005/03/ 請求將匹配列表中的第三個模式。Django 將調用函數 views.month_archive(request, '2005', '03')。 '''
# 設置項是否開啓URL訪問地址後面部位/跳轉至帶有/的路徑 APPEND_SLASH = True
上面的示例使用簡單的、沒有命名的正則表達式組(經過圓括號)來捕獲URL 中的值並以位置 參數傳遞給視圖。在更高級的用法中,可使用命名的正則表達式組來捕獲URL
中的值並以關鍵字 參數傳遞給視圖。
在Python 正則表達式中,命名正則表達式組的語法是(?P<name>pattern)
,其中name
是組的名稱,pattern
是要匹配的模式。
from app02 import views from django.conf.urls import url urlpatterns = [ #無名分組 url(r'^article/\d{4}', views.year) , url(r'^article/(\d{4})$', views.year2), 若是有多個匹配同樣的時候,誰放在上面就匹配誰,上面的就會把下面的覆蓋了 正則加上括號,就是分組,會把分組的內容做爲year2函數的參數傳進去 url(r'^article/(\d{4})/(\d{2})$', views.year_month), # 有名分組(就是給分組起個名字,這樣定義的好處就是按照關鍵字參數去傳參了,指名道姓的方式) url(r'^article/(?P<year>\d{4})/(?P<month>\d{2})$', views.year_month_hasname) ]
捕獲的值做爲關鍵字參數而不是位置參數傳遞給視圖函數。例如:
/articles/2005/03/ 請求將調用views.month_archive(request, year='2005', month='03')函數
在實際應用中 , 這意味你的URLconf 會更加明晰且不容易產生參數順序問題的錯誤,-------你能夠在你的視圖函數定義中從新安排參數的順序。固然,這些好處是以簡潔爲代價;有些開發人員認爲命名組語法醜陋而繁瑣。
一個視圖函數,檢查視圖 ,是一個簡單的python函數 , 他接受Web請求而且返回Web響應 , 響應能夠是一張網頁的html內容 ,一個重定向 , 一個404錯誤 , 一個xml文檔 , 或者一張圖片...... 是任何東西均可以。不管視圖自己包含什麼邏輯,都要返回響應。代碼寫在哪裏也無所謂,只要它在你的Python目錄下面。除此以外沒有更多的要求了——能夠說「沒有什麼神奇的地方」。爲了將代碼放在某處,約定是將視圖放置在項目或應用程序目錄中的名爲views.py的文件中。
一個簡單的視圖函數
-----------------views.py
from django.shortcuts import render,HttpResponse # 建立視圖函數 def year(request): # request 參數請求全部的參數 , 這個參數必定要有 return HttpReapones("ok") # 每個視圖函數必須有return def year2(request,year): print(year) return HttpResponse("hello") #返回的必定是一個字符串,若是你想return純字符串,就用HttpResponse方法 def year_month(request,year,month): print(year,month) # 返回的是匹配的年和月拼接的結果 return HttpResponse(year+month) # def year_month_hasname(request,month,year): # return HttpResponse("ok") print(year,month) return HttpResponse("month是:%s,year是:%s"%(month,year))
注意:視圖會返回一個HttpResponse對象,其中包含生成的響應。每一個視圖函數都負責返回一個HttpResponse對象。
屬性:
''' path: 請求頁面的全路徑,不包括域名 method: 請求中使用的HTTP方法的字符串表示。全大寫表示。例如 if req.method=="GET": do_something() elif req.method=="POST": do_something_else() GET: 包含全部HTTP GET參數的類字典對象 POST: 包含全部HTTP POST參數的類字典對象 COOKIES: 包含全部cookies的標準Python字典對象;keys和values都是字符串。 FILES: 包含全部上傳文件的類字典對象;FILES中的每個Key都是<input type="file" name="" />標籤中 name屬性的值,FILES中的每個value同時也是一個標準的python字典對象,包含下面三個Keys: filename: 上傳文件名,用字符串表示 content_type: 上傳文件的Content Type content: 上傳文件的原始內容 user: 是一個django.contrib.auth.models.User對象,表明當前登錄的用戶。若是訪問用戶當前 沒有登錄,user將被初始化爲django.contrib.auth.models.AnonymousUser的實例。你 能夠經過user的is_authenticated()方法來辨別用戶是否登錄: if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware 時該屬性纔可用 session: 惟一可讀寫的屬性,表明當前會話的字典對象;本身有激活Django中的session支持時該屬性纔可用。 '''
方法:
get_full_path()
注意:鍵值對的值是多個的時候,好比checkbox類型的input標籤,select標籤,須要用:
request.POST.getlist("hobby")
render(request,template_name[,context])
結合一個給定的模板和一個給定的上下文字典 ,並返回一個渲染後的HttpResponse對象 ,
參數 :
request : 用於生成響應的請求對象 ,
template_name : 要使用的模板的完整名稱 , 可選的參數
context : 添加到模板上下文的一個字典 , 默認是一個空字典 ,若是字典中的某一個值是可調用的 , 視圖將在渲染模板以前調用它 ,
content_type : 生成的文檔要使用的html類型 , 默認爲DEFAULT_CONTENT_TYPE 設置的值
status : 響應的狀態碼 , 默認爲200
python 的模板 : HTML代碼 + 模板語法
模板包括在使用時會被值換掉的變量 , 和控制模板邏輯的標籤
def current_time(req): # ================================原始的視圖函數 # import datetime # now=datetime.datetime.now() # html="<html><body>如今時刻:<h1>%s.</h1></body></html>" %now # ================================django模板修改的視圖函數 # from django.template import Template,Context # now=datetime.datetime.now() # t=Template('<html><body>如今時刻是:<h1>{{current_date}}</h1></body></html>') # #t=get_template('current_datetime.html') # c=Context({'current_date':str(now)}) # html=t.render(c) # # return HttpResponse(html) #另外一種寫法(推薦) import datetime now=datetime.datetime.now() return render(req, 'current_datetime.html', {'current_date':str(now)[:19]})
模板語法 : 目的是將變量(數據庫的內容) 如何巧妙的嵌入到html 頁面中(就不用以前咱們用的字符串拼接了)
{{var_name}}
def index(request): import datetime s="hello" l=[111,222,333] # 列表 dic={"name":"yuan","age":18} # 字典 date = datetime.date(1993, 5, 2) # 日期對象 class Person(object): def __init__(self,name): self.name=name person_yuan=Person("yuan") # 自定義類對象 person_egon=Person("egon") person_alex=Person("alex") person_list=[person_yuan,person_egon,person_alex] return render(request,"index.html",{"l":l,"dic":dic,"date":date,"person_list":person_list})
<h4>{{s}}</h4> <h4>列表:{{ l.0 }}</h4> <h4>列表:{{ l.2 }}</h4> <h4>字典:{{ dic.name }}</h4> <h4>日期:{{ date.year }}</h4> <h4>類對象列表:{{ person_list.0.name }}</h4>
注意 : 句點符也能夠用來引用對象的方法(無參數方法)
<h4>字典:{{ dic.name.upper }}</h4>
小練習:
需求:當用戶輸入一個URL: http://127.0.0.1:8080/timer,就返回給用戶一個當前的時間
基本流程
一、對urls進行一個設置
二、views.py
三、在template裏建立一個timer.html頁面